Поведение команды чтения «bash» с помощью оператора перенаправления - PullRequest
0 голосов
/ 24 февраля 2019

Если я выполню следующую команду:

> read someVariable _ < <(echo "54 41")

и:

> echo $someVariable

Результат: 54.

Что делает < < (с пробелами)?

Почему _ дает первое слово из результата в команде "echo"?

Командывыше только пример.

Большое спасибо

1 Ответ

0 голосов
/ 24 февраля 2019

Подстановка процессов

Как объясняет tldp.org ,

Подстановка процессов направляет выходные данные процесса (или процессов) в стандартный поток данных другого процесса..

Таким образом, в действительности это похоже на передачу stdout одной команды в другую, например, echo foobar barfoo | wc.Но обратите внимание: на [man-странице bash] [3] вы увидите, что она обозначена как <(list).Таким образом, в основном вы можете перенаправить вывод нескольких (!) Команд.

Примечание: технически, когда вы говорите <<, вы ссылаетесь не на одну вещь, а на два перенаправления с одним <и обрабатывает перенаправление вывода из <(...). </p>

А что будет, если мы просто обработаем подстановку?

$ echo <(echo bar)
/dev/fd/63

Как вы можете видеть, оболочка создает временный файловый дескриптор /dev/fd/63, куда выводятся данные.Это означает, что < перенаправляет этот файловый дескриптор как ввод в команду.

Очень простой пример - сделать подстановку процесса вывода двух команд echo в wc:

$ wc < <(echo bar;echo foo)
      2       2       8

здесь мы создаем оболочку, создаем файловый дескриптор для всего вывода, который происходит в круглых скобках, и перенаправляем его в качестве ввода в wc. Как и ожидалось, wc получает этот поток от двух команд echo, которые сами выводят две строки, каждая из которых имеет слово,и соответственно у нас есть 2 слова, 2 строки и 6 символов плюс две новые строки.

Примечание для стороны : Подстановка процесса может упоминаться как bashism (команда или структура, используемая в расширенномон похож на bash, но не указан в POSIX), но он был реализован в ksh до существования bash как ksh man page .Однако такие оболочки, как tcsh и mksh, не имеют подстановки процессов.Итак, как мы могли бы перенаправить вывод нескольких команд в другую команду без подстановки процесса?Группировка плюс трубопровод!

$ (echo foo;echo bar) | wc
      2       2       8

По сути, это то же самое, что и в предыдущем примере. Однако это отличается от замены процесса под капотом, так как мы делаем стандартный вывод всей подоболочки и стандартный вывод wc [связанныйс трубой] [5].С другой стороны, подстановка процесса заставляет команду прочитать временный дескриптор файла.

Итак, если мы можем выполнить группировку с помощью конвейера, зачем нам подстановка процесса?Потому что иногда мы не можем использовать трубопровод.Рассмотрим приведенный ниже пример - сравнение выходных данных двух команд с diff (для которого нужны два файла, и в этом случае мы даем ему два файловых дескриптора)

diff <(ls /bin) <(ls /usr/bin)
...