让我们弄清楚发生了什么使用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 个单独的命令进行评估,而是作为 1 个printf
具有 4 个参数的命令进行评估,这等于win
.