0

我试图证明替换顺序;主要是变量替换、命令替换和通配符依次发生。我执行了以下命令,但没有得到预期的输出。

bash-4.1$ a=file*
bash-4.1$ ls $(echo $($(b=$a)))

我希望输出列出以“文件”开头的所有文件名,但它会输出目录中所有文件的列表。知道为什么吗?

4

2 回答 2

2

$(...)命令替换返回命令的输出,对于分配,它是空白的。所以你只是最终运行ls

于 2012-06-18T23:13:20.050 回答
1

参数和算术扩展以及命令替换同时被评估,从最左到右。赋值、空和空扩展以及重定向都是有效的简单命令。分配丢失到子shell,并且参数echo扩展为空。echo输出换行符,但命令替换将其删除,并且ls没有得到任何参数。此外,如果您希望a=file*做的不仅仅是分配文字字符串,那么在分配中不会发生路径名扩展。

见:http ://wiki.bash-hackers.org/syntax/grammar/parser_exec

当您弄清楚所有这些时,这是一个具有挑战性的问题。的价值是x多少?(显示更多扩展顺序和一些小的 Bash 怪癖。)

declare -i x=0
x+=${x:-1} let x+=2 $((x+=4)) {x}<&$((x+=8,0))
于 2012-06-18T23:45:06.580 回答