Bash: замена процесса и stdin

Просто запуск wicd-gtk, так как Вы используете пользователя root, wicd демон запустится автоматически Вами и настроит его в GUI. (Существует значок панели задач на панели, самой правой),

13
05.09.2014, 11:25
2 ответа

Это оболочка зависимая и не задокументированная АФАИКС. В ksh и bash, в первом случае, foo будет иметь тот же самый stdin, что и bar. Они будут бороться за выход echo.

Так, например, в

$ seq 10000 | paste - <(tr 1 X)'
1       X
2       X042
3       X043
4       X044
5       X045
[...]

вы видите доказательства того, что paste читает каждый второй блок текста из вывода seq, в то время как tr читает другие.

С помощью zsh он получает внешний stdin (если только это не терминал и оболочка не является интерактивной, в этом случае она перенаправляется из /dev/null). ksh (где он возник), zsh и bash являются единственными оболочками типа Борна с поддержкой замещения процесса AFAIK.

В эхо-"bla". | bar < <(foo), обратите внимание, что bar stdin будет трубой, подаваемой выходом foo. Это хорошо определенное поведение. В этом случае, кажется, что foo stdin - это труба, подаваемая echo во всех ksh, zsh и bash.

Если вы хотите иметь последовательное поведение во всех трех оболочках и быть уверенным в будущем, так как поведение может измениться, так как оно не документировано, я бы написал:

echo bla | { bar <(foo); }

Чтобы быть уверенным, что foo stdin также является трубой из echo (я не вижу, почему вы хотите это сделать). Или:

echo bla | bar <(foo < /dev/null)

Чтобы убедиться, что foo считывает , а не из трубы из echo. Или:

{ echo bla | bar 3<&- <(foo <&3); } 3<&0

чтобы foo считывал внешний stdin как в текущих версиях zsh.

9
27.01.2020, 19:53

эхо "бла" | foo | bar: Вывод echo "bla" перенаправляется на foo, вывод которого перенаправляется на bar.

echo "bla" | bar <(foo): Эта одна труба выводит эхо "bla" на bar. Но bar выполняется с аргументом. Аргументом является путь к дескриптору файла, куда будет отправлен вывод foo. Этот аргумент ведет себя как файл, содержащий вывод foo. Значит, это не то же самое.

эхо "bla" | bar < <(foo): Можно предположить, что вывод echo "bla" должен быть отправлен на bar и все утверждение эквивалентно первому. Но это неправильно. Происходит следующее: Поскольку входное перенаправление < выполняется после трубы (|), оно перезаписывается. Таким образом, < эхо "bla" не является трубой на бар. Вместо этого вывод foo перенаправляется как стандартный вход на bar. Чтобы очистить это, смотрите следующую команду и вывод:

$ echo "bla" | cat < <(echo "foo")
foo

Как видите, эхо "bla" заменяется на эхо "foo".

Теперь смотрите эту команду:

$ echo "bar" | cat < <(awk '{printf "%s and foo", $0}')
bar and foo

Итак, эхо-"бар" передается на awk, который читает stdin и добавляет строку и foo к выходу. Этот вывод вывод выводится в cat.

4
27.01.2020, 19:53

Теги

Похожие вопросы