Что означает <<(command args) "в оболочке? - PullRequest
29 голосов
/ 14 марта 2010

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

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

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

Гуглу очень сложно "<<", понимаешь. </p>

Ответы [ 4 ]

36 голосов
/ 14 марта 2010

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

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

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

find /bar -name *foo* -print0 | while read line; do
  ...
done
5 голосов
/ 14 марта 2010

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

<() похоже на какую-то обратную трубу, как указано на странице:

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

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

4 голосов
/ 15 марта 2010

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

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

0 голосов
/ 14 марта 2010

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

Обновление

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

...