Linux Shell程式設計(28)——程式替換

尹成發表於2014-09-30
程式替換與命令替換很相似. 命令替換把一個命令的結果賦給一個變數,例如 dir_contents=`ls -al`或xref=$. 程式替換則是把一個程式的輸出回饋給另一個程式 (換句話說,它把一個命令的結果傳送給另一個命令).


命令替換的一般形式


由圓括號括起的命令
>(command)
<(command)


啟動程式替換. 它是用/dev/fd/<n>檔案把在圓括號內的程式的處理結果傳送給另外一個程式.

在"<" 或or ">" 與圓括號之間是沒有空格的. 如果加了空格將會引起錯誤資訊.


Bash在兩個檔案描述符(file descriptors)之間建立了一個管道, --fIn 和 fOut--. true命令的標準輸入被連線到fOut(dup2(fOut, 0)), 然後Bash把/dev/fd/fIn作為引數傳給echo.如果系統的/dev/fd/<n>檔案不夠時,Bash會使用臨時檔案. 

cat <(ls -l)
# 等同於     ls -l | cat


sort -k 9 <(ls -l /bin) <(ls -l /usr/bin) <(ls -l /usr/X11R6/bin)
# 列出系統中3個主要的'bin'目錄的所有檔案,並且按檔名排序.
# 注意是三個明顯不同的命令輸出回饋給'sort'.


 
diff <(command1) <(command2)    # 給出兩個命令輸出的不同之處.


tar cf >(bzip2 -c > file.tar.bz2) $directory_name
# 呼叫"tar cf /dev/fd/?? $directory_name",和"bzip2 -c > file.tar.bz2".
#
# 因為/dev/fd/<n>的系統屬性,
# 所以兩個命令之間的管道不必是命名的.
#
# 這種效果可以模仿出來.
#
bzip2 -c < pipe > file.tar.bz2&
tar cf pipe $directory_name
rm pipe
#        或者
exec 3>&1
tar cf /dev/fd/4 $directory_name 4>&1 >&3 3>&- | bzip2 -c > file.tar.bz2 3>&-
exec 3>&-


相關文章