LINUX.ORG.RU

По башу, видимость переменных внутри цикла


0

1
st=0
echo $st
df -h | while read var
do
st=1
echo $var
echo $st
done
echo $st
st=0
echo $st
while read var
do
st=1
echo $var
echo $st
done < /etc/passwd
echo $st

Два почти одинаковых скрипта, но в первом случае после выхода из цикла $st равно 0, во втором 1.

Я что-то теряюсь, где описано такое поведение и почему?

★★★★★

Последнее исправление: Aceler (всего исправлений: 1)

  • Используй тег [code]
  • Когда ты используешь пайп, то создаётся новый инстанс баша и то что с правой стороны баша выполняется в нём.

То есть по поведению код аналогичен такому:

int main()
{
 int a = 1;
 int pid = fork();
 if (pid == 0) { a+=1; exit(0); }
 wait();
 printf("%d\n", a);
}
kim-roader ★★
()
Ответ на: комментарий от joy4eg

т.е. ты изменяешь значение $st в дочернем, а потом, когда цикл закончился, выводишь значение из родителя.

joy4eg ★★★★★
()
Ответ на: комментарий от kim-roader

Когда ты используешь пайп, то создаётся новый инстанс баша

Делааа.

Спасибо, дальше покурю сам.

Aceler ★★★★★
() автор топика

где описано такое поведение

Такое поведение описано в «The Open Group Base Specifications Issue 7 IEEE Std 1003.1™-2008 (POSIX.1-2008), Shell & Utilities, Chapter 2, Shell Command Language.» и предыдущих, а также в POSIX.1-2013.

и почему?

Потому что в стандарте любой член pipeline выполняется в отдельном дочернем процессе. В ksh93 утверждается, что некоторые реализации могут (но не обязаны) исполнять последний член pipeline в основном процессе, если он является встроенной командой. В современном bash (не помню с какой версии 4+) такое же поведение может быть установлено опцией 'lastpipe'.

ABW ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.