Что означает "<<(cmd args)" означает в оболочке?

При циклическом переходе через папки с файлами, содержащими пробелы, оболочка script, я использую эту форму, скопированную из internet:

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

Я думаю, что я понимаю бит IFS, но я не понимаю, что означают символы < <(...). Очевидно, что здесь происходит какой-то трубопровод.

Это очень сложно для Google "<", как вы видите.

Ответы

Ответ 1

<() называется подстановка процесса в руководстве и похожа на канал, но передает аргумент формы /dev/fd/63 вместо использования stdin.

< читает ввод из файла с именем в командной строке.

Вместе эти два оператора функционируют точно как труба, поэтому его можно переписать как

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

Ответ 2

< перенаправляет на stdin.

<() кажется своего рода обратной трубой, как указано на странице:

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

не будет работать, потому что цикл while будет выполнен в подоболочке, и вы потеряете изменения, сделанные в цикле

Ответ 3

< (команда) является заменой процесса. В принципе, он создает специальный тип файла, называемый "named pipe", а затем перенаправляет вывод команды на именованный канал. Например, предположим, что вы хотите просмотреть список файлов в очень большом каталоге. Вы можете сделать это:

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/whatever действует как текстовый файл с выходом команды между скобками.

Ответ 4

Оператор << вводит here-document, который берет вывод другой команды как входной для первой команды.

Обновление

Хорошо, поэтому они, должно быть, добавили несколько вещей в оболочку, так как я последний раз ее использовал 15 лет назад.
Просьба не обращать внимания.