2016-08-03 128 views
2

可以在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而言,这三者中没有一个能保证“工作”?

(通过“工作”,我的意思是“产生相同的结果,如果替换的结果在终端上的命令本身进行分型”)

+0

在第二个和第三个例子中,命令是'echo',而不是命令替换的结果。只有echo命令的参数是命令替换的结果。这是你的意图吗? – John1024

+0

是的;并按照标准,这是不能保证工作,是吗?我的意思是,“工作”产生的结果与在命令本身中简单键入替换结果相同。 –

+0

你打算写'$(echo foobar)'代替'echo $(echo foobar)'吗? – John1024

回答

0

之所以这样:

$ echo $(echo ';') 

不输出与此相同:

$ echo ; 

道理是一样的,为什么这样的:

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

不输出与此相同:

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

最新情况下,从命令替换的输出(()预期要被()令牌;?)被解释为一命令,因为它作为子shell中的命令传递[和解释],而不是作为命令解释器内置令牌。

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

编辑:回答这个问题

你说:

这似乎意味着它是唯一保证工作,如果你 替代的整个命令名 ;如果您替换部分 它或其他东西,那么它可能或可能不起作用

而POSIX标准状态:

应由在子shell环境中执行命令 展开命令替换(参见壳牌执行环境)和 替换命令替换(命令文本加 加上“$()”或反引号)与标准输出 命令,删除一个或更多<newline>字符在 末尾的替换。

该标准似乎很清楚发生了什么。这不是包含命令替换的命令中存在什么的问题,只是包含在封闭的$()或or中的命令。

+0

谢谢,但恕我直言,你没有回答我的问题,但不同的一个 –

+0

@MarkGaleck编辑标准的相关部分,关于什么是它指的是什么命令的区别(不是'$()'以外的东西,但到里面)。 – pah