2017-09-18 41 views
0
#1 
    f() { 
     cat "$1" >"$x" 
    } 
    #2 
    x=>(tr '[:lower:]' '[:upper:]') f <(echo 'hi there') 

#2哪部分首先執行? x=>(tr '[:lower:]' '[:upper:]')或f <(echo 'hi there')。 #2是複合複合還是單一命令?「var =>(...)somecommand」如何工作?

+0

一般來說,順便說一句,在變量中存儲過程替換句柄並不是特別安全。只要進程替換的重定向離開作用域(在本例中,該作用域是單個命令),FIFO就會關閉,從而使句柄不再可用。 –

+1

...如果你在這裏運行'{... multiline block ...; } 3>(...)',那麼你*知道*你的進程替換將在範圍內,並在FD 3上可用於整個塊。更好的實踐比開發變量和需要擔心變量範圍和流程替代的範圍不同。 –

+1

(你在做什麼是安全的*在這裏*特別是因爲賦值是單一命令的一部分,而不是複合命令,它的作用域是保證進程替換保持可用的單一命令;如果你做到了'''''''''''x =>(tr'[:lower:]''[:upper:]'); f <(echo'hi there')',你會看到這個變化:變量仍然可用,但流程替代將不再運行)。 –

回答

3

單個命令可以有任意數量的var=value前綴;這些變量會在該單個命令的持續時間內導出到環境中,並且稍後不存在。這不是特定於bash的內容,而是POSIX sh標準的一部分。

「哪一部分先執行?」不是一個有意義的問題。其中FIFO的文件名(如果操作系統允許相同,爲/dev/fd條目和匿名FIFO)存儲在X中的進程替換爲,首先啓動,但是執行是異步的。 (也就是說,因爲編號爲hi there的進程替換的輸出被重定向爲運行tr的進程的輸入,所以必須阻塞,直到tr準備好讀取它正在寫入的內容)。

相關問題