2015-10-14 131 views
3

這裏的一個終端的命令:使用C++中的外殼命令

awk '/^Mem/ {print $4}' <(free -m) 

這是我的代碼:

class CSystemInfo{ 
public: 
    std::string free_ram(){ 
     std::string s; 
     FILE *in; 
     char buff[512]; 
     //here is a prepared string (but with an error) 
     if(!(in = popen("awk '/^Mem/ {print $4 \"\\t\"}' <(free -m)","r"))){ 
     return ""; 
     } 
     while(fgets(buff, sizeof(buff), in)!=NULL){ 
      cout << s; 
      s=s+buff; 
     } 
     pclose(in); 
     return s; 
     } 
}; 
    CSystemInfo info; 
    std::string ram = info.free_ram(); 
    cout << ram; 

上面的代碼中,運行時,返回該消息:

sh: 1: Syntax error: "(" unexpected 

我怎樣才能放置'/'符號,這個命令能夠正常工作?

+1

貌似默認的shell - 'sh' - 不支持'<(free -m)'語法。考慮調用'bash'。 –

+0

in terminal這個命令看起來不錯 –

+0

你的終端shell可以是'bash',它支持*這種語法,而'popen'在'sh',更原始的低級shell中運行。試試'echo $ 0'。我剛剛嘗試在'sh'中運行您的命令,但它失敗並顯示相同的消息。 –

回答

3

您的問題不在於C++。你與popen調用你的命令,並在popen外殼sh,不支持<()語法,而在你的終端您有bashzsh或任何其他的外殼,即不支持<()語法運行您的命令。

編輯:更好的選擇!使用管道!

popen("free -m | awk ...") 

原來的答覆,不工作!:嘗試在popen調用bash

bash -c "awk '/^Mem/ {print $4}' <(free -m)" 
代碼

popen("bash -c \"awk '/^Mem/ {print $4}' <(free -m)\"") 
+0

內存:3398 2848 550 380 209 959 '{print $ 4}'不起作用 –

+0

適用於我(因爲我正在運行俄語本地化,所以我將'Mem'改爲'Пам')。我添加了一個新的選項來回答,查看它。 –

+0

我也使用它。但最好的,我看到的是'Память:3398 2785 613 339 212 918' –