2017-01-13 1 views
1

私は、この例のようなコードを使用して、C++内のLinuxシェルコマンドに結果を得ました。基本的なコマンドでうまくいくようです。私はシェルのエラーを取得する例のコマンドでそれを実行しようとするただし、:予期しないトークンの近くに構文エラー `(」C++で複雑なシェルコマンドを実行する適切な方法は何ですか?

#include <stdio.h> 
#include <iostream> 

int main(int argc, char *argv[]) { 

    std::string cmdString = "cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | " 
          "awk -v RS=\"\" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5) }' 2>&1"; 

    std::string result, file; 
    FILE *stream; 

    std::cout << "cmdString = " << cmdString << std::endl; 

    stream = popen(cmdString.c_str(), "r"); 

    char buffer[256]; 
    if(fgets(buffer, sizeof(buffer), stream) != NULL) { 
     file = buffer; 
     result += file.substr(0, file.size() - 1); 
    } 
    pclose(stream); 

    std::cout << "result = " << result << std::endl; 

    return 0; 
} 

私が何か間違ったことをやっている私は何とか文字列を再フォーマットする必要がありますか?

+1

「私は何か間違っていますか?」 - あなたがシェルに呼び出すという単純な事実に基づいて、私は「はい」と言います。それだけで巨大な警鐘が鳴り、多くの赤旗が浮上します。 *非常に*少なくとも*慎重に入力慎重にチェックし、環境が正常であることを確認し、エラーをチェックし、あなたが本当に意図している実行可能ファイルを実行しているかどうかなどを確認します。 –

+2

これはありますかコマンド自体はシェルで動作しますか? – Drop

+0

ここから読んでください:http://man7.org/linux/man-pages/man2/pipe.2.html –

答えて

3

あなたはコマンドラインでbash固有の構文を使用しているpopenの引数がbin/sh、ないユーザーの現在のシェルに渡されるPOSIXの義務を

を使用すると、以下のいずれかを行うことができ、問題を解決するには:。。

  1. /bin/shに準拠するようにコマンドを書き直してください。
  2. 明示的にコマンドラインでbashを使用します。
    std::string cmdString = "bash -c \".....\"";
  3. 完全にシェルを削除して、パイプラインを自分で実装します。
関連する問題