Что делает “<<(управляйте args)”, средний в оболочке?

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

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

Я думаю, что понимаю, что IFS укусила, но я не понимаю что'< <(...)'средние символы. Очевидно, существует своего рода передача по каналу, продолжающаяся здесь.

Это очень твердо к Google" <<", Вы видите.

31
задан stib 6 March 2019 в 21:01
поделиться

4 ответа

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

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

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

find /bar -name *foo* -print0 | while read line; do
  ...
done
39
ответ дан 27 November 2019 в 22:26
поделиться

Оператор << вводит здесь-документ , который принимает выходные данные другой команды в качестве входных данных для первой команды.

Обновление

Итак, они, должно быть, добавили кое-что в оболочку с тех пор, как я последний раз использовал ее 15 лет назад.
Любезное игнорирование.

-2
ответ дан 24 September 2019 в 03:26
поделиться

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

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
ответ дан 27 November 2019 в 22:26
поделиться

< перенаправляет на стандартный ввод.

<() кажется своего рода обратным конвейером, как упоминалось на странице:

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

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

5
ответ дан 27 November 2019 в 22:26
поделиться