То, когда цикличное выполнение рекурсивно через папки с файлами, содержащими, располагает сценарий оболочки с интервалами, я использую, имеет эту форму, скопированную с Интернета:
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
Оператор <<
вводит здесь-документ
, который принимает выходные данные другой команды в качестве входных данных для первой команды.
Обновление
Итак, они, должно быть, добавили кое-что в оболочку с тех пор, как я последний раз использовал ее 15 лет назад.
Любезное игнорирование.
<( команда ) - это подстановка процесса. По сути, она создает специальный тип файла под названием "именованная труба", а затем перенаправляет вывод команды в именованную трубу. Например, предположим, что вы хотите просмотреть список файлов в очень большом каталоге. Вы можете сделать так:
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 действует как текстовый файл с выводом команды между скобками.
<
перенаправляет на стандартный ввод.
<()
кажется своего рода обратным конвейером, как упоминалось на странице:
find /bar -name *foo* -print0 | \
while IFS= read -r -d $'\0' file; do
dosomethingwith "$file" # do something with each file
done
не будет работать, потому что цикл while будет выполняться в подоболочке, и вы потеряете сделанные изменения в цикле