“<<(command args)”在shell中意味着什么?

时间:2010-03-14 17:49:19

标签: bash shell built-in

当递归循环遍历包含空格的文件的文件夹时,我使用的shell脚本属于这种形式,从internet复制:

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

我想我理解IFS位,但我不明白'< <(...)'字符是什么意思。显然这里有一些管道。

谷歌很难“&lt;&lt;”,你知道。

4 个答案:

答案 0 :(得分:36)

<()在手册中被称为process substitution,类似于管道,但传递了/dev/fd/63形式的参数,而不是使用stdin。

<从命令行上命名的文件中读取输入。

在一起,这两个运算符的功能与管道完全相同,因此可以重写为

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

答案 1 :(得分:5)

<重定向到标准输入。

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

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

将无效,因为while循环将在子shell中执行,并且您将丢失在循环中所做的更改

答案 2 :(得分:4)

&lt;(命令)是进程替换。基本上,它创建一个称为“命名管道”的特殊类型的文件,然后将命令的输出重定向为命名管道。例如,假设您想要翻阅超大目录中的文件列表。你可以这样做:

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 /无论是一个文本文件的行为,在括号之间输出命令。

答案 3 :(得分:-2)

<<运算符引入here-document,它将另一个命令的输出作为第一个命令的输入。

<强>更新

好的,所以自从我15年前上次使用它以来,它们必须在shell上添加一些东西。
请不要理会。