簡體   English   中英

shell 中的“< <(command args)”是什么意思?

[英]What does "< <(command args)" mean in the shell?

當遞歸循環遍歷包含空格的文件的文件夾時,我使用的 shell 腳本是這種形式,從inte.net復制:

    while IFS= read -r -d $'\0' file; do
      dosomethingwith "$file"        # do something with each file
    done < <(find /bar -name *foo* -print0)

我想我了解 IFS 位,但我不明白 ' < <(...) ' 字符的含義。 顯然這里有某種管道。

很難用 Google 搜索“< <”或“<(”,你看。我試過“尖括號”和“小於括號”,但沒有找到任何東西。

<()在手冊中稱為進程替換 ,類似於管道,但傳遞的形式為/dev/fd/63而不是使用stdin。

<從命令行上命名的文件中讀取輸入。

這兩個操作符一起完全像管道一樣運行,因此可以重寫為

find /bar -name *foo* -print0 | while read line; do
  ...
done

<重定向到stdin。

<()似乎是某種反向管道,如頁面所述:

find /bar -name *foo* -print0 | \
while IFS= read -r -d $'\0' file; do
  dosomethingwith "$file"        # do something with each file
done

將無法工作,因為while循環將在子shell中執行,並且您將丟失循環中所做的更改

<(命令)是進程替換。 基本上,它創建一個稱為“命名管道”的特殊類型的文件,然后將命令的輸出重定向為命名管道。 例如,假設您想要翻閱超大目錄中的文件列表。 你可以這樣做:

ls /usr/bin | more

或這個:

more <( ls /usr/bin )

但不是這個:

more $( ls /usr/bin )

當您進一步調查時,原因就變得清晰了:

~$ echo $( ls /tmp )
gedit.maxtothemax.436748151 keyring-e0fuHW mintUpdate orbit-gdm orbit-maxtothemax plugtmp pulse-DE9F3Ei96ibD pulse-PKdhtXMmr18n ssh-wKHyBU1713 virtual-maxtothemax.yeF3Jo
~$ echo <( ls /tmp )
/dev/fd/63
~$ cat <( ls /tmp )
gedit.maxtothemax.436748151
keyring-e0fuHW
mintUpdate
orbit-gdm
orbit-maxtothemax
plugtmp
pulse-DE9F3Ei96ibD
pulse-PKdhtXMmr18n
ssh-wKHyBU1713
virtual-maxtothemax.yeF3Jo

/ dev / fd /無論是什么行為都像是一個文本文件,在括號之間輸出命令。

大多數情況下,當您需要將文件傳遞給命令但使用另一個命令的 output 而不是文件,從而避免了提前創建和填充該文件的需要。

對於前。 假設你想比較 2 個命令的 output,你可以這樣做:

diff <(command1) <(command2)

<<運算符引入了一個here-document ,它將另一個命令的輸出作為第一個命令的輸入。

更新

好的,所以自從我15年前上次使用它以來,它們必須為shell添加一些東西。
請不要理會。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM