変数に格納されたコマンドを呼び出す正しい方法は何ですか?
1と2の間に違いはありますか?変数に格納されたコマンドを実行する方法は?
#!/bin/sh
cmd="ls -la $APPROOTDIR | grep exception"
#1
$cmd
#2
eval "$cmd"
変数に格納されたコマンドを呼び出す正しい方法は何ですか?
1と2の間に違いはありますか?変数に格納されたコマンドを実行する方法は?
#!/bin/sh
cmd="ls -la $APPROOTDIR | grep exception"
#1
$cmd
#2
eval "$cmd"
UNIXシェルは、実行する前に入力の各行で一連の変換を実行します。
bash
manページから引用)このようになります置換$cmd
を使用してxpansion(別名グロブ)は直接、それはパラメータ展開の段階であなたのコマンドに置き換え取得し、それは、すべての次の変換を受けます。 eval "$cmd"
を使用して
は$cmd
があるとして返され、その機能が実行される前に再びチェーン全体を実行することですeval
にパラメータとして渡された引用除去相、までは何もしません。
基本的には、ほとんどの場合同じですが、コマンドがパラメータ拡張までの変換ステップを使用する場合は異なります。たとえば、中括弧拡張を使用します。
$ cmd="echo foo{bar,baz}"
$ $cmd
foo{bar,baz}
$ eval "$cmd"
foobar foobaz
'eval'を書かずに' eval '$ cmdを実行するには? '$($ cmd)'? '$ {$ cmd}'? –
@StevenLuこれらのどれも同等ではありません - '演算は構文としてデータを解析するため、セキュリティに非常に敏感であり、暗黙的に行うことは非常に悪い形式になります。 –
私は湯はあなただけ行う場合は、あなたの変数(Shiftキーが押された場合は〜と1)
これはコマンドの出力を実行します。 ls -lの場合は "total"コマンドが見つかりません "というメッセージが生成されます(合計はls -lの出力の一部なので)これはあなたが望むものではありません –
周り `記号を置くと思いますeval $cmd
我々はやるときcmd="ls -l"
(対話形式で、スクリプトで)我々が得ます所望の結果。あなたのケースでは、パターンのないgrepを持つパイプがあるので、grepパーツはエラーメッセージで失敗します。 $cmd
は「コマンドが見つかりません」(または何らかの)メッセージを生成します。 したがって、エラーメッセージを生成するコマンドではなく、evalを使用して終了したコマンドを使用してみてください。
それは誤った"grep exception"でなければなりません –
それはおそらく動かないでしょう(私のテストではbashとzshの下ではなかったので)$ cmdだけではなくevalを使用します。 –
[BashFAQ/050](http://mywiki.wooledge.org/BashFAQ/050)を参照してください。 –