4
arg1=$(printf win && printf 32)
echo $arg1
contents='printf win && printf 32'
arg1=$($contents)
echo $arg1
arg1=$( { eval $contents; } )
echo $arg1

結果は次のとおりです。

win32
win
win32

なぜ機能しないの$($contents)ですか?コマンド置換は、宣言されたコマンドの stdout を挿入することで機能すると思います...?

さらにcontents='echo win && echo 32'戻るとwin && echo 32

4

2 に答える 2

2

論理演算子の解析後にパラメーターの置換が行われるためです。

Bash は があることを認識しないため、次&&のようprintf win && printf 32に解釈されます。

argv[0]: printf
argv[1]: win
argv[2]: &&
argv[3]: printf
argv[4]: 32

argv[1] にはフォーマット文字列が含まれていないため、printf は argv[2] で始まるすべての引数を無視します。

于 2013-11-11T05:27:52.370 に答える
1

を使用して何が起こっているかを考えてみましょうset -x:

set -x

arg1=$(printf win && printf 32)
echo $arg1

contents='printf win & printf 32'
arg1=$($contents)
echo $arg1

arg1=$( { eval $contents; } )
echo $arg1

set +x
++ printf win
++ printf 32
+ arg1=win32
+ echo win32
win32
+ contents='printf win && printf 32'
++ printf win '&&' printf 32
+ arg1=win
+ echo win
win
++ eval printf win '&&' printf 32
+++ printf win
+++ printf 32
+ arg1=win32
+ echo win32
win32
+ set +x

ここで最も重要な部分は

+ contents='printf win && printf 32'
++ printf win '&&' printf 32

これは、コマンド置換が単語分割を実行し、ここでのコマンドとコマンド引数とは何かを評価する方法です。したがって、2 つの別個のコマンドとしてではなく、printf4 つの引数を持つ1 つのコマンドとして評価されますwin

于 2013-11-11T05:27:19.863 に答える