代码之家  ›  专栏  ›  技术社区  ›  Sharat Chandra

如何将shell命令输出分配给C语言中的变量

  •  1
  • Sharat Chandra  · 技术社区  · 15 年前

    我想要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吗?

    4 回复  |  直到 15 年前
        1
  •  2
  •   Jonathan Leffler    15 年前

    您将需要创建一个字符串,该字符串包含要运行的完整脚本,或者您将需要创建一个可以简单运行的脚本,然后用 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}' -总价值-从一次使用 PONEN() ,然后将该值构建到第二个命令中:

    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
  •  0
  •   Alan Haggai Alavi    15 年前

    我认为那不可能 system 分叉一个shell以运行该命令,并在命令完成后返回,基本上也会杀死它分叉的shell。因此,设置的任何环境变量也将丢失。

        3
  •  0
  •   BlueDog    15 年前

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

        4
  •  0
  •   Donal Fellows    15 年前

    您需要在使用它的相同子shell中处理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脚本中更容易,因为这样一来,您就可以同时使用较少的语言,并且可以分阶段而不是同时进行调试。