2013-06-04 2 views
3

соответствии Баш (1) страницы человека, когда я бегу следующее:Глобальная переменная сбрасывается, если цикл отправки выход к трубе

set -e 
x=2 
echo Start $x 
while [ $((x--)) -gt 0 ]; do echo Loop $x; done | cat 
echo End $x 

Выходной сигнал будет:

Start 2 
Loop 1 
Loop 0 
End 2 

После того, как петли (работает как субоболочка) переменные й сбрасываются на 2. Но если снять трубку й будет обновлено:

Start 2 
Loop 1 
Loop 0 
End -1 

Мне нужно изменить XB ut, мне тоже нужна труба. Любая идея, как обойти эту проблему?

+1

Что '| кошка' здесь? Это что-то значимое? – devnull

+1

http://stackoverflow.com/q/4667509/900873 – Kevin

+0

@devnull, я думаю, что это просто для иллюстрации: добавление трубы ко всему будет означать, что цикл while запущен в подоболочке, а любые изменения переменной $ x теряются, когда заканчивается подоболочка. –

ответ

3

bash всегда (по крайней мере, начиная с 4.2) выполняет все неотправляемые части трубопровода в подоболочке. Если значение x необходимо изменить в вызывающей оболочке, вы должны переписать код, чтобы избежать конвейера.

Один ужасный выглядящий пример:

# If you commit to one bash feature, may as well commit to them all: 
# Arithmetic compound: ((x-- > 0)) 
# Process substitution: > >(cat) 
while ((x-- > 0)); do echo Loop $x; done > >(cat) 
+1

@udi, читает о замене процесса [здесь] (http://www.gnu.org/software/bash/ manual/bashref.html # Процесс-Замена) –

+0

@chepner, спасибо! У меня была небольшая опечатка, и теперь она работает. – Udi

Смежные вопросы