命令替換(Command substitution)
利用某個指令的輸出來替換正在執行的指令的一種方式,它有以下兩種形式:
⤍ $(command)
⤍ `command`
假設指令command
的輸出是abc
,則:
⤍ $(command)
bash: abc: command not found
⤍ abc
bash: abc: command not found
⤍ echo $(command)
abc
命令替換中的指令會在子Shell裡執行,所以在子Shell更改或新增的變數父Shell將無法存取:
⤍ temp=5
⤍ echo $(temp=6 ; echo $temp)
6
⤍ echo $temp
5
上面的例子可以發現變數temp
只有在子Shell被更改。
進程替換(Process substitution)
進程替換有以下兩種形式:
⤍ <(commands)
⤍ >(commands)
搭配重導向運算子前者可以作為另一個指令的輸入檔案,後者可以作為另一個指令的輸出檔案。
在使用進程替換的時候,我們把它當成檔案在操作就可以了:
⤍ cat <(echo test)
test
⤍ echo <(echo test)
/dev/fd/63
當我們對進程替換運算子用echo
時,會顯示一個檔案位置,這是因為進程替換不是直接替換成輸出而是替換成一個包含輸出的檔案。
在介紹管線處理的時候,有提到:
⤍ echo "test" | read
⤍ echo $REPLY
read
在子Shell執行,所以環境變數REPLY
無法被父Shell存取,這時候我們可以改用進程替換:
⤍ read < <(echo "test")
⤍ echo $REPLY
test
發佈留言