dir_files=`ls -l`
或date_time=$(date)
;而進程替換則是把一個命令的輸出結果傳遞給另一個(組)命令。echo "http://c.biancheng.net/shell/" | read echo $REPLY以上程式碼輸出結果總是為空,因為 echo 命令在父 Shell 中執行,而 read 命令在子 Shell 中執行,當 read 執行結束時,子 Shell 被銷毀,REPLY 變數也就消失了。管道中的命令總是在子 Shell 中執行的,任何給變數賦值的命令都會遭遇到這個問題。
幸運的是,Shell 提供了一種“特異功能”,叫做進程替換,它可以用來解決這種麻煩。使用 read 讀取資料時,如果沒有提供變數名,那麼讀取到的資料將存放到環境變數 REPLY 中,這一點已在《Shell read》中講到。
<(commands)
另一種用來接受標準輸入,藉助輸出重定向,它可以接收另一個命令的輸出結果:>(commands)
commands 是一組命令列表,多個命令之間以分號;
分隔。注意,<
或>
與圓括號之間是沒有空格的。read < <(echo "http://c.biancheng.net/shell/") echo $REPLY輸出結果:
echo "http://c.biancheng.net/shell/"
的輸出結果作為 read 的輸入。<()
用來捕獲 echo 命令的輸出結果,<
用來將該結果重定向到 read。<
之間是有空格的,第一個<
表示輸入重定向,第二個<
和()
連在一起表示進程替換。echo "C語言中文網" > >(read; echo "你好,$REPLY")
執行結果:echo "C語言中文網"
的輸出結果中讀取資料。/dev/fd/n
(n 是一個整數)。該檔案會作為引數傳遞給()
中的命令,()
中的命令對該檔案是讀取還是寫入取決於進程替換格式是<
還是>
:
>()
,那麼該檔案會給()
中的命令提供輸入;藉助輸出重定向,要輸入的內容可以從其它命令而來。<()
,那麼該檔案會接收()
中命令的輸出結果;藉助輸入重定向,可以將該檔案的內容作為其它命令的輸入。[c.biancheng.net]$ echo >(true) /dev/fd/63 [c.biancheng.net]$ echo <(true) /dev/fd/63 [c.biancheng.net]$ echo >(true) <(true) /dev/fd/63 /dev/fd/62
/dev/fd/
目錄下有很多序號檔案,進程替換一般用的是 63 號檔案,該檔案是系統內部檔案,我們一般檢視不到。echo "shellscript" > >(read; echo "hello, $REPLY")
第一個>
表示輸出重定向,它把第一個 echo 命令的輸出結果重定向到/dev/fd/63
檔案中。>()
中的第一個命令是 read,它需要從標準輸入中讀取資料,此時就用/dev/fd/63
作為輸入檔案,把該檔案的內容交給 read 命令,接著使用 echo 命令輸出 read 讀取到的內容。/dev/fd/63
檔案起到了資料中轉或者資料橋樑的作用,借助重定向,它將>()
內部的命令和外部的命令聯絡起來,使得資料能夠在這些命令之間流通。