【问题标题】:How to assign shell command output to a variable in C language如何将shell命令输出分配给C语言中的变量
【发布时间】:2025-12-25 23:35:06
【问题描述】:

我希望将 shell 命令 (echo free | grep Mem| awk '{print $2}') 的输出收集到一个变量中,以便在 C 程序中使用它。所以我这里有代码。

 system("TOTAL=$(echo `free | grep Mem| awk '{print $2}'`)");
 popen("grep -v procs $1 | grep -v free | awk '{USED=TOTAL-$4-$5-$6;print USED}'", "r");

我可以在上面显示的 popen() 调用内的同一程序中使用变量 TOTAL 吗?

【问题讨论】:

    标签: c system popen


    【解决方案1】:

    您需要创建一个包含要运行的完整脚本的字符串,或者您需要创建一个可以简单运行的脚本,然后使用popen() 安排读取该脚本的输出。两者皆有可能;哪个更容易取决于您的脚本技能水平与您的 C 编程技能水平。

    char command[4096];
    
    strcpy(command, "TOTAL=$(free | grep Mem| awk '{print $2}')\n");
    strcat(command, "grep -v procs $1 | grep -v free |\n");
    strcat(command, "awk '{USED=TOTAL-$4-$5-$6;print USED}' TOTAL=$TOTAL\n");
    
    FILE *in = popen(command, "r");
    
    ...read the results, etc...
    

    字符串操作简化了第一个shell脚本,然后将计算得到的TOTAL的值传递给awk

    另一种方法是从free | grep Mem | awk '{print $2}' 读取输出 - TOTAL 值 - 从popen() 的一次使用中读取,然后将该值构建到第二个命令中:

    char command[4096];
    
    strcpy(command, "free | grep Mem| awk '{print $2}'");
    char total[20];
    FILE *in1 = popen(command, "r");
    ...read TOTAL into total...
    
    strcpy(command, "grep -v procs $1 | grep -v free |\n");
    strcat(command, "awk '{USED=TOTAL-$4-$5-$6;print USED}' TOTAL=");
    strcat(command, total);
    
    FILE *in2 = popen(command, "r");
    

    【讨论】:

      【解决方案2】:

      我认为这是不可能的,因为system 派生了一个 shell 来运行命令并在命令完成后返回,基本上也杀死了它派生的 shell。因此,任何设置的环境变量也将丢失。

      【讨论】:

      • 那么如何实现呢?我想要一个 shell 命令返回的值,并在稍后阶段使用它!
      【解决方案3】:

      您可以使用 FIFO 或至少使用一个简单的临时文件。

      【讨论】:

        【解决方案4】:

        您需要在使用它的同一子外壳中处理 TOTAL 的设置;环境变量不会在子进程之间传输(唯一有效的是子进程继承其父进程的 env-vars)。你可能会这样做(我删除了一些无用的混淆):

        FILE *f = popen("TOTAL=$(free | grep Mem | awk '{print $2}');"
                "grep -v procs $1 | grep -v free | "
                "awk '{USED=TOTAL-$4-$5-$6;print USED}'",
                "r");
        

        注意多行字符串常量。但是,我怀疑即使这样也行不通,因为它似乎是不同语言的混乱混乱。 (例如,$1 看起来非常可疑,因为它不在通常与这些东西一起使用的上下文中。)您可能会发现将所有复杂的脚本放入可以运行的适当的 shell 脚本中更容易,从那时起,您'将同时使用更少的语言,并且可以分阶段进行调试,而不是一次全部调试......

        【讨论】: