是否可以在POSIX shell中使用命令替换来代替命令名?

时间:2016-08-03 07:13:29

标签: shell posix

的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外壳,这三者都不能保证“工作”吗?

(通过“工作”,我的意思是“产生与在终端上命令本身中输入替换结果相同的结果”)

1 个答案:

答案 0 :(得分:0)

之所以这样:

$ echo $(echo ';')

输出与此相同:

$ echo ;

原因与此相同:

$ ;
bash: syntax error near unexpected token `;'

输出与此相同:

$ `echo ';'`
;: command not found

最新的情况,命令替换的输出((?)期望的(?)标记;)被解释为命令,因为它被传递[并解释]作为子shell中的命令,而不是作为命令解释器内置令牌。

正如我的解释,这不符合标准。

编辑:回答问题

你说:

  

这似乎暗示只有保证可以工作,如果你   替换整个命令名称;如果你替换的一部分   它,或其他什么,然后它可能或可能无效

POSIX标准规定:

  

shell 应通过执行命令扩展命令替换   在子shell环境中(请参阅Shell执行环境)和   替换命令替换(命令文本加上   将“$()”或反引号括起来与标准输出   命令,删除一个或多个<newline>个字符的序列   替换结束。

关于发生的事情,标准似乎很清楚。这不是包含命令替换的命令中存在的内容的问题,而是在封闭的$()或者``中的命令。