bash - 变量扩展和命令替换之间的扩展顺序

标签 bash

bash 人说变量扩展发生在命令替换之前。我正在寻找一个可以清楚地说明这一点的例子。所以我尝试了这个:

root@antec:/# var=1 
root@antec:/# echo $(var=2; echo $var)
2
root@antec:/#

我期待 bash 做:
1) 在替换中用“1”替换 $var
2) 执行 echo $(var=2; echo 1)

显然这不是 bash 正在做的..
有人可以解释一下这里发生了什么吗?如果有人有一个例子显示变量扩展优先于命令替换,那也很好

最佳答案

我不知道 bash 手册页在说什么。

POSIX specification for the shell说:

The order of word expansion shall be as follows:

  1. Tilde expansion, parameter expansion, command substitution, and arithmetic expansion shall be performed, beginning to end.
  2. Field splitting shall be performed on the portions of the fields generated by step 1, unless IFS is null.
  3. Pathname expansion shall be performed, unless set -f is in effect.
  4. Quote removal shall always be performed last.

这很清楚变量扩展(又名“参数扩展”)与命令扩展(“命令替换”)同时发生,而不是之前或之后。

所以我认为您要求的示例不存在。

关于bash - 变量扩展和命令替换之间的扩展顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6891308/

相关文章:

Bash - <<EOF 和 <<'EOF' 之间的区别

linux - Bash,使用导出并在单个脚本中运行导出

linux - 如何在shell脚本中调用./etc/bash_completion?

linux - 后台任务的 PID 与使用 ps 列出的任务 PID 不同

linux - shell bash 脚本 - 上传一个大的 tar 文件,重试?

python - 运行一个 shell 脚本,该脚本运行一个 python 程序,然后运行一个 R 程序

bash - shell 中嵌套的 "su"命令调用有何含义?

linux - 为什么 linux bash 在将其输出分配给变量时不执行管道中的第一个命令?

linux - 从 linux 命令在屏幕上获取输出

windows - 通过启动脚本打开 Powershell 窗口时会去哪里?