を使用して何が起こっているかを考えてみましょう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 つの別個のコマンドとしてではなく、printf
4 つの引数を持つ1 つのコマンドとして評価されますwin
。