2016-05-23 1 views
0

私はC++でいくつかのコマンドシェルを実行してシステムに関する情報を取得できるアプリケーションを作成しています。この問題は、[[ "$devname" == "bus/"* ]]&& continue;のスクリプトコードでこのコマンドを実行するとエラーが発生します。シェルスクリプトを実行すると、環境がbashの代わりにdashになるためです。私は#!/usr/bin/env bashでコマンドを実行しようとしましたが、うまくいきません。完全なコマンドはインラインでハードコードされているので、シェルスクリプトファイルの使用は避けています。明示的にputenv()経由SHELLを設定C++でシェルコマンドを実行するときに環境を強制的にbashにする

1):

答えて

1

あなたの場合次のようなコマンドがあります。

[[ "$devname" == "bus/"* ]] && hostname || echo "no" 

あなたは、このようにそれを実行することができます。

bash -c '[[ "$devname" == "bus/"* ]] && hostname || echo "no"' 

だから、あなただけの上記が含まれている1つの文字列を構築する場合、あなたはpopen()または何を使用してそれを実行することができます。 C++では、上の文字をそのまま使用すると内部引用符をエスケープする必要があります。

const char* command = "bash -c '[[ \"$devname\" == \"bus/\"* ]] && hostname || echo \"no\"'"; 
+0

私の解決策で私はpopenを使用しているので、私はこのソリューションを使用しますが、16進形式のコマンドを使用してscape文字 – JulianOliveira

2

は、次の2つのオプションがあり

putenv("SHELL=/bin/bash"); 
execl(...); 

2)明示的に代わりhashbangに頼るので、/bin/bashを実行します。

execl("/bin/bash", script.c_str(), NULL); 

// script is the script you're trying to execute. 
+0

解決策(1)はうまくいきません。誰が 'SHELL'変数を尊重すべきですか? C++は必ずしもそれを行うわけではありません(それを課す標準には何もありません)。また、プログラムローダーにとっても特別なものではありません。ロードされるスクリプトにシェーバン行がない場合、デフォルトシェルが使用されます(これは 'sh'を使用します)。 – user1934428

関連する問題