進程替換和命令替換非常相似。命令替換是把一個命令的輸出結(jié)果賦值給另一個變量,例如dir_files=`ls -l`
或date_time=$(date)
;而進程替換則是把一個命令的輸出結(jié)果傳遞給另一個(組)命令。
寫法 | 含義 | 注意點 | 本質(zhì) |
---|---|---|---|
<(commands) | 它借助于輸入重定向,可以將它的輸出結(jié)果作為另一個命令的輸入 | commands 是一組命令列表,多個命令之間以分號 注意, | /dev/fd/n文件接受(commands)的輸出,作為另一個命令的輸入 |
>(commands) | 它借助于輸出重定向,可以接受另一個命令的標(biāo)準(zhǔn)輸出結(jié)果 | 從/dev/fd/n文件中讀取內(nèi)容,作為(commands)的輸入 |
舉栗 | 結(jié)果 | 說明 |
---|---|---|
普通模式
| 輸出結(jié)果為空 | echo 命令在父?Shell?中執(zhí)行,而 read 命令在子 Shell 中執(zhí)行, 當(dāng) read 執(zhí)行結(jié)束時,子 Shell 被銷毀,AA 變量也就消失了。 管道中的命令總是在子 Shell 中執(zhí)行的,任何給變量賦值的命令都會遭遇到這個問題。 |
使用進程替換
| 輸出結(jié)果為aaaaa | 整體上來看,Shell 把
讀取的數(shù)據(jù)也會保存到當(dāng)前進程的?AA 變量,所以使用 echo 能夠成功輸出。 |
進程替換用作「接受標(biāo)準(zhǔn)輸入」的例子 echo "qpy" > >(read; echo "你好,$REPLY") | 運行結(jié)果:你好,qpy | 因為使用了重定向,read 命令從echo "qpy" 的輸出結(jié)果中讀取數(shù)據(jù)。 |
為了能夠在不同進程之間傳遞數(shù)據(jù),實際上進程替換會跟系統(tǒng)中的文件關(guān)聯(lián)起來,這個文件的名字為/dev/fd/n
(n 是一個整數(shù))。該文件會作為參數(shù)傳遞給()
中的命令,()
中的命令對該文件是讀取還是寫入取決于進程替換格式是<
還是>
:
>()
,那么該文件會給()
中的命令提供輸入;借助輸出重定向,要輸入的內(nèi)容可以從其它命令而來。<()
,那么該文件會接收()
中命令的輸出結(jié)果;借助輸入重定向,可以將該文件的內(nèi)容作為其它命令的輸入。
使用 echo 命令可以查看進程替換對應(yīng)的文件名:
命令 | 輸出 | 說明 |
---|---|---|
echo >(true) | /dev/fd/63 | /dev/fd/ 目錄下有很多序號文件,進程替換一般用的是 63 號文件,該文件是系統(tǒng)內(nèi)部文件,我們一般查看不到。
使得數(shù)據(jù)能夠在這些命令之間流通。 |
echo <(true) | /dev/fd/63 | |
echo >(true) <(true) | /dev/fd/63 /dev/fd/62 | |
echo "qpy" > >(read; echo "hello, $REPLY") | hello, qpy | 第一個
|