使用 _< 而非 < 用於使用 bash 的標準輸入

使用 _< 而非 < 用於使用 bash 的標準輸入

使用進程替換時, 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 ,並且會根據上下文執行不同的操作。

我建議在重定向之前添加一個空格以使事情更清晰。我在中放置了一些關於良好重定向樣式的指南本文

相關內容