在string中命令替换复合命令

时间:2013-11-11 04:22:45

标签: bash

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

2 个答案:

答案 0 :(得分: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]不包含格式字符串。

答案 1 :(得分: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

相关问题