2017-04-25 11 views
1

私はbashdashで次のコマンドを実行しようとしています。envのPATH =」:後の実行のための文字列でシェルコマンドを構築する移植可能

x="env PATH=\"$PATH:/dir with space\"" 
cmd="ls" 
"$x" $cmd 

これは

-bashで失敗します/ opt/local/bin:/ opt/local/sbin:/ usr/local/bin:/ usr/bin// bin:/ usr/sbin:/ sbin:/ opt/X11/bin:/ usr/local/git/bin:/ usr/local/go/bin:/ dir (空白あり):このようなファイルまたはディレクトリはありません

注次作品:

env PATH="$PATH:/dir with space" $cmd 

私はx変数ENVに割り当てていた理由を、それはまた、複雑な変数である$cmdに大きなコマンドラッパーの一部であるため、あります。

初期の例より複雑です。私はこれらの変数を毎回繰り返す代わりに設定するという論理を持っています。ここに示すように、最終的に呼び出しは次のとおりです。

path_value="$PATH" 
invocation="env PATH=\"$path_value\" $other_val1 $other_val2" 
base="python python_script.py --opt1=a,b,c script_args" 
add_on="$base more_arg1 more_arg2" 
"$invocation" $base 
+0

あなたは、スペースをエスケープしてみましたか? – MikeVelazco

+0

より簡単な例を見てみましょう: 'x =" echo hello "; "$ x" ' - これは' echo hello:command not found'を返します - "$ x"を引用符で囲まずに実行してみてください。 –

+0

下のコメントにサブプロセスを記述すると、_shell_コードを使用して実際にコマンドライン文字列を作成していますか?文字列をPythonで構築する場合、異なる考慮事項が適用されます。 – mklement0

答えて

1

あなたが保存して再利用するためにシェルの配列を使用することができます。

x=(env PATH="$PATH:/dir with space") 
cmd="ls" 
"${x[@]}" "$cmd" 
+1

これは最もクリーンな解決策です。シェル配列を使用します。 –

+0

それは良い解決策です。警告を追加する必要があります。これは、bash配列や{}をサポートしていない環境で使用しています。 –

+0

しかし、あなたは 'bash'とタグ付けしました。どんな殻ですか? – anubhava

0

anubhava's helpful array-based bash answerあなたがあるように思われたのみbash(をとることができる場合には最良の選択であります最初はケース)。

ほとんどの場合、POSIX sh機能のみをサポートするdashもサポートする必要があることから、配列はオプションではありません。

should generally be avoided、あなたは完全にあなたが文字列であなたのコマンドラインを構築するために使用する値を制御したり、信頼し、あなたがevalを使用できると仮定すると:

path_value="$PATH" 
invocation="env PATH=\"$path_value\" $other_val1 $other_val2" 
base="python python_script.py --opt1=a,b,c script_args" 
add_on="$base more_arg1 more_arg2" 

eval "$invocation $add_on" 
関連する問題