當管道後面跟著命令分組時到底發生了什麼事?

當管道後面跟著命令分組時到底發生了什麼事?

我看到這樣的表達式command1 | {command2;command3;command4},我在想這實際上意味著什麼,我知道管道符號,我知道{...}強制運行主 shell 中大括號內的命令,但我很困惑它們的組合含義。

答案1

管道的各個部分有多複雜並不重要,如果需要,您通常可以將它們視覺化為單獨的腳本(特別是在像這樣無論如何bash都會在子 shell 中運行管道的每個部分的 shell 中)。

劇本

command2
command3
command4

... 哪個大致{ command2; command3; command4; }翻譯成的(不考慮{ ...; }名義上意味著命令不在子shell中運行),是從執行中給出的輸入

command1

根據第一個腳本中的這三個命令正在執行的操作,其中一個或多個命令可能會消耗來自 的輸入command1,如果其中一個或多個命令產生任何輸出,則該輸出將進入管道的下一部分,或終端或管道輸出重定向到的任何地方。

答案2

{...}強制執行主 shell 中大括號內的指令

這並不能很好地描述大括號的一般作用。以不建立子 shell 的方式將指令括起來。換句話說,大括號本身並不會創建子shell:大括號中的程式碼在同一個shell 中執行,就好像沒有大括號一樣,而不是括號中的程式碼始終在子shell 中執行(因此它的重定向、變數、等等不影響父 shell 或任何其他 shell)。

大括號的目的是允許在語法需要單一命令的情況下編寫複雜的命令。例如,在command1 | { command2; command3; command4; }(請注意空格和最後的分號是必需的)中,管道的右側是{ command2; command3; command4; }。該命令{ command2; command3; command4; }執行command2,然後command3,然後command4。所有這些命令都從管道獲取輸入。 (由於命令連續運行,command3因此獲取運行後留下的任何輸入command2,依此類推。)

答案3

將大括號視為未命名的函數。例如

command234 () { command2; command3; command4; }

command1 | command234 

給出相同的結果。當事情變得太複雜時,我更喜歡命名分組。如果只是為了測試。

答案4

標準輸出command1將用於命令區塊中的第一個命令,該命令開始從標準輸入讀取。在大多數情況下,這將是command2

相關內容