我希望在变量中收集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吗?
答案 0 :(得分: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...
字符串操作简化了第一个shell脚本,然后将计算的TOTAL值传递给awk
。
另一种方法是从free | grep Mem | awk '{print $2}'
读取popen()
的输出 - 值为TOTAL - 从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");
的一次使用,然后将该值构建到第二个命令中:
{{1}}
答案 1 :(得分:0)
我不认为这是可能的,因为system
要求shell运行命令并在命令完成后返回,基本上也会杀死它所分叉的shell。因此,设置的任何环境变量也将丢失。
答案 2 :(得分: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脚本中更容易,因为那么你将同时使用更少的语言,可以分阶段调试,而不是一次调试......
答案 3 :(得分:0)
您可以使用FIFO或至少使用简单的临时文件。