使用進程替換時, using_<
和for stdin有什麼區別。<
這是使用 bash 完成的。
例子:
read bytes _< <(du -bcm random_iso.iso | tail -1); echo $bytes
答案1
這不是一個_<
運算符,而是_
傳遞給 read 和<
重定向運算符的參數。<(cmd)
本身就是一個進程替換(擴展為指向管道的檔案名稱)。
其作用是運行:
read bytes _ < /proc/self/fd/x
其中 fd x 是管道的讀取端。
在管道的另一個(寫入)端,後台子 shell 程序正在執行,du -bcm random_iso.iso | tail -1
其標準輸出重定向到該管道。
因此,read
會將$bytes
輸出的最後一行的第一個字儲存在變數中du -bcm
,並將該行的其餘部分儲存在$_
變數中。
現在我不知道這du -bcm
有什麼意義。-b
、-c
和選項都不-m
是標準的。 while-c
很常見,用於給出累積大小,對於 GNU du
,-b
是獲取以字節為單位的檔案大小(而不是磁碟使用情況),而 while-m
是將大小四捨五入到下一個兆字節,因此它們會是衝突的選項(儘管可能他們使用-b
其啟用的副作用--apparent-size
)。 FreeBSD du 有-m
(兆位元組),沒有-b
,Solaris 兩者都沒有...
看起來這是一種複雜的寫法:
wc -c < random_iso.iso
或者:
du --apparent-size -cm random_iso.iso | awk 'END{print $1}'
如果他們確實希望在 GNU 系統上將檔案大小四捨五入到下一個兆位元組。
答案2
如前所述,_<
這不是重定向。這將_
作為最終參數傳遞給read
.然後將其<
解釋為單獨的重定向運算符,將進程替換的輸出重定向到標準輸入。
_
在 Bash 腳本中,與內建變數一起用作「一次性變數」已成為慣例read
。在 bash 中,_
是一個特殊變量,在執行每個命令後,它被設定為命令的最後一個參數。在這種情況下,這意味著bytes
將分配第一個字段,並將剩餘字段丟棄到變數中_
,而不是將所有剩餘字段分配到bytes
。
雖然這是慣例,但有許多充分的理由避免_
以這種方式濫用。
_
POSIX 未指定此行為。大多數 shell 不會用它做任何特別的事情。- 在
zsh
,中_
有該readonly
屬性,使用該屬性將導致 shell 拋出錯誤。 - 在 中
mksh
,_
只有互動模式下的 bash 行為。在非互動式腳本中,_
用於不同的目的,並且在每個命令之後不會分配任何內容。 - in
ksh93
,_
僅設定為一行中最後一個指令的最後一個參數。命令必須在物理上位於單獨的程式碼行上才能使用_
.此外,_
在 ksh93 中,它被重載以在各種上下文中具有許多其他用途,因此_
不建議為此目的分配 to ,並且會根據上下文執行不同的操作。
我建議在重定向之前添加一個空格以使事情更清晰。我在中放置了一些關於良好重定向樣式的指南本文。