可以在POSIX shell中使用命令替换命令吗?
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_04
的POSIX标准的贝说,在第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 shell而言,这三者中没有一个能保证“工作”?
(通过“工作”,我的意思是“产生相同的结果,如果替换的结果在终端上的命令本身进行分型”)
之所以这样:
$ echo $(echo ';')
不输出与此相同:
$ echo ;
道理是一样的,为什么这样的:
$ ;
bash: syntax error near unexpected token `;'
不输出与此相同:
$ `echo ';'`
;: command not found
最新情况下,从命令替换的输出(()预期要被()令牌;
?)被解释为一命令,因为它作为子shell中的命令传递[和解释],而不是作为命令解释器内置令牌。
正如我的解释,这不符合标准。
编辑:回答这个问题
你说:
这似乎意味着它是唯一保证工作,如果你 替代的整个命令名 ;如果您替换部分 它或其他东西,那么它可能或可能不起作用。
而POSIX标准状态:
壳应由在子shell环境中执行命令 展开命令替换(参见壳牌执行环境)和 替换命令替换(命令文本加 加上“$()”或反引号)与标准输出 命令,删除一个或更多
<newline>
字符在 末尾的替换。
该标准似乎很清楚发生了什么。这不是包含命令替换的命令中存在什么的问题,只是包含在封闭的$()
或or中的命令。
谢谢,但恕我直言,你没有回答我的问题,但不同的一个 –
@MarkGaleck编辑标准的相关部分,关于什么是它指的是什么命令的区别(不是'$()'以外的东西,但到里面)。 – pah
在第二个和第三个例子中,命令是'echo',而不是命令替换的结果。只有echo命令的参数是命令替换的结果。这是你的意图吗? – John1024
是的;并按照标准,这是不能保证工作,是吗?我的意思是,“工作”产生的结果与在命令本身中简单键入替换结果相同。 –
你打算写'$(echo foobar)'代替'echo $(echo foobar)'吗? – John1024