的POSIX shell标准
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_04
在第2.6.3节中说:
Command substitution allows the output of a command to be substituted in place of the command name itself
如果你替换整个命令名,这似乎意味着它只能保证工作;如果你替换它的一部分,或其他东西,那么它可能会或可能不会工作。
试验:
$ echo ;
$ $(echo echo) ;
$
到目前为止一直很好......
$ e$(echo cho) ;
$ echo $(echo ';')
;
$ echo $(echo foobar)
foobar
上面的第一个和第三个例子似乎“有效”,但第二个“不起作用”。这是所有简单的无证和随机行为,正如标准似乎暗示的那样,而实际上对于其他一些POSIX外壳,这三者都不能保证“工作”吗?
(通过“工作”,我的意思是“产生与在终端上命令本身中输入替换结果相同的结果”)
答案 0 :(得分:0)
之所以这样:
$ echo $(echo ';')
输出与此相同:
$ echo ;
原因与此相同:
$ ;
bash: syntax error near unexpected token `;'
输出与此相同:
$ `echo ';'`
;: command not found
最新的情况,命令替换的输出((?)期望的(?)标记;
)被解释为命令,因为它被传递[并解释]作为子shell中的命令,而不是作为命令解释器内置令牌。
正如我的解释,这不符合标准。
编辑:回答问题
你说:
这似乎暗示只有保证可以工作,如果你 替换整个命令名称;如果你替换的一部分 它,或其他什么,然后它可能或可能无效。
POSIX标准规定:
shell 应通过执行命令扩展命令替换 在子shell环境中(请参阅Shell执行环境)和 替换命令替换(命令文本加上 将“$()”或反引号括起来与标准输出 命令,删除一个或多个
<newline>
个字符的序列 替换结束。
关于发生的事情,标准似乎很清楚。这不是包含命令替换的命令中存在的内容的问题,而是在封闭的$()
或者``中的命令。