Переменное назначение, не работающее в трубе

Для bash теперь будут перезагружены определенные в настоящее время сопоставления

bind -f  ~/.inputrc
-2
29.06.2018, 13:49
2 ответа

Команда не имеет особого смысла, так как присваивание не производит никакого вывода и 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
3
28.01.2020, 05:15

Ваш пример не имеет смысла, но позвольте мне привести пример получше:

echo foo | read REPLY

— это конструкция оболочки, которая может работать (так, как вы ожидаете ), или нет, поскольку POSIX не предоставляет определенного способа установки pipesв оболочке.

Мой пример будет иметь fooв $REPLY, если вы попробуете его с bosh, ksh93или zsh, и будет пустой REPLYна других оболочках.

Это связано с тем, что bosh, ksh93и zshзапускают самую правую программу конвейера в основной оболочке, если это встроенная оболочка, в то время как другие оболочки всегда запускают крайнюю правую программу в подчиненной -оболочке. который читает ответ и тут же умирает.

0
28.01.2020, 05:15

Теги

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