Для bash теперь будут перезагружены определенные в настоящее время сопоставления
bind -f ~/.inputrc
Команда не имеет особого смысла, так как присваивание не производит никакого вывода и echo
не считывает стандартный ввод.
Вместо:
a=15; printf '%s\n' "$a"
Кроме того, обе части конвейера выполняются в разных средах, поэтому установка a
слева не повлияет на значение a
справа от конвейера.
Пример:
{ a=15; printf 'on the left:\ta=%s\n' "$a"; } | { cat; printf 'on the right:\ta=%s\n' "$a"; }
Выход:
on the left: a=15
on the right: a=
... предполагая, что a
не имеет значения до выполнения вышеуказанного. Если бы это было так, правая сторона -приняла бы это значение. Установка значения в любой части конвейера не изменит значение a
в окружающей среде.
Если была установлена опция lastpipe
оболочки и оболочка работала без управления заданиями (, как это было бы, если бы это был не -интерактивный сценарий ), тогда последняя часть канала будет работать в той же среде, что и окружающий скрипт.Это означает, что задание там «переживет» трубу :
#!/bin/bash
shopt -s lastpipe
a=10
printf 'LHS: a=%s\n' "$a" | { cat; printf 'RHS: a=%s\n' "$a"; a=30; }
printf 'a is now %s\n' "$a"
Выход:
LHS: a=10
RHS: a=10
a is now 30
Удалениеshopt -s lastpipe
:
LHS: a=10
RHS: a=10
a is now 10
Ваш пример не имеет смысла, но позвольте мне привести пример получше:
echo foo | read REPLY
— это конструкция оболочки, которая может работать (так, как вы ожидаете ), или нет, поскольку POSIX не предоставляет определенного способа установки pipes
в оболочке.
Мой пример будет иметь foo
в $REPLY
, если вы попробуете его с bosh
, ksh93
или zsh
, и будет пустой REPLY
на других оболочках.
Это связано с тем, что bosh
, ksh93
и zsh
запускают самую правую программу конвейера в основной оболочке, если это встроенная оболочка, в то время как другие оболочки всегда запускают крайнюю правую программу в подчиненной -оболочке. который читает ответ и тут же умирает.