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)工作?有人会假设命令替换通过插入声明命令的标准输出来工作......?

此外,当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

printf 忽略所有以 argv[2] 开头的参数,因为 argv[1] 不包含格式字符串。

于 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 个单独的命令进行评估,而是作为 1 个printf具有 4 个参数的命令进行评估,这等于win.

于 2013-11-11T05:27:19.863 回答