【发布时间】:2021-08-27 04:58:34
【问题描述】:
似乎命令替换将第一个令牌作为命令,其余作为命令的参数, 不被解析为 shell 语句。但 bash 手册说:
Bash 通过在子 shell 中执行命令来执行扩展 环境
例子
$ c="echo 123 ; echo 124"
$ d=`$c`
$ echo $d
123 ; echo 124
为什么 d 是 13 ; echo 124 而不是 123 124
【问题讨论】:
-
有很多问题——而且结局不会很好(或干净)。 命令替换 运行单个命令或管道,但不运行单独的命令。本质上,您正在尝试包含两个命令的
c='echo "123"; echo "124"'。你可以做d=$(eval $c),结果123 124,但请记住eval与evil只有一个字符——避免它。我会重构你的两个echo语句以避免任何这种混乱。 -
@DavidC.Rankin 你不解释为什么命令作为单个命令执行,如果
c="{ echo 123; echo 124 ; }"然后命令替换将其视为 shell 语句 -
不要将命令放在变量中。请改用函数。
-
或者如果你真的想要CommandSub那么直接
c=$(echo 123 ; echo 124); echo "$c" -
@yuanjianpeng - 来自
man 1 bash,有两种形式:$(command)和旧的`command`。在这两种情况下都不是$(command1; command2)形式。 Bash 在子shell 中执行命令。它不执行命令然后去寻找另一个。在d=$($c)中调用时,变量中的命令替换不会进行分词。正如 Jetchisel 指出的那样——您可以将命令替换为c=$(echo "123"; echo "124"),只是不能将内部部分存储在变量中并在后续命令替换中扩展。