Что означает "<<(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 лет назад.
Просьба не обращать внимания.