2016-08-03 126 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