[英]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.