2010-10-09 362 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或至少使用簡單的臨時文件。

相關問題