2010-10-09 149 views
1

我希望将shell命令(echo free | grep Mem| awk '{print $2}')的输出收集到一个变量中,以便我可以在C程序中使用它。所以我有这里的代码。如何将shell命令输出分配给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吗?

回答

2

您将需要创建一个字符串,其中包含您要运行的完整脚本,或者您需要创建一个可以简单运行的脚本,然后安排使用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... 

的字符串操作简化第一外壳脚本,然后通过计算出awk总数的值。

其他的方式做这将是读free | grep Mem | awk '{print $2}'输出 - 这是总价值 - 从一个使用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"); 
0

我不认为这是可能的,因为system会要求shell运行命令并在命令完成后返回,实质上也会杀死它分叉的shell。因此,设置的任何环境变量也将丢失。

+0

那么如何做一个做到这一点?我想要一个shell命令返回的值,并在稍后阶段使用它! – 2010-10-09 07:07:48

+1

通过使用'popen'来运行命令而不是'system'。 – 2010-10-09 07:45:38

0

您需要在与使用它相同的子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脚本更容易,因为那样可以同时使用较少的语言,并且可以分阶段调试,而不是一次全部调试...

0

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

相关问题