Bash - 展示替代的顺序

时间:2012-06-18 23:10:19

标签: bash unix substitution

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

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

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

2 个答案:

答案 0 :(得分:2)

$(...)命令替换返回命令的输出,对于赋值,该输出为空。所以你最终只能运行ls

答案 1 :(得分:1)

同时评估参数和算术扩展以及命令替换,最左边到最右边。赋值,空和空扩展以及重定向都是有效的简单命令。赋值将丢失到子shell中,echo的参数将扩展为空。 echo输出换行符,但命令替换将其删除,ls没有args。此外,如果您期望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))