Переменная оболочки не изменяется при использовании комбинации "труба во время чтения"

Рассмотрим случай 1:

$ COUNT=0 ; while [ $COUNT -ne 3  ]; do echo $COUNT; COUNT=$(expr $COUNT + 1 );done
0
1
2
$ echo $COUNT
3

К концу цикла COUNT переменная равна 3, как и ожидалось

Рассмотрим случай 2:

$ COUNT=1; find . -print0 | while IFS= read -r -d '' FILE; do echo "$FILE"; expr $COUNT + 1; COUNT=$(expr $COUNT + 1 )  ;done 
.
2
./file name
3
./file
4
./a
b
5
$ echo $COUNT
1

Как видите, в этом случае COUNT остался прежним. Зачем? Видно, что он меняется внутри цикла while, но не раз за его пределами.

Что именно мне здесь не хватает?

1 ответ

Решение

В вашем первом случае все команды выполняются в одной оболочке. Содержание COUNT изменено

Во втором случае подоболочка запускается с трубопровода |и изменения в подоболочке не влияют на текущую оболочку. Но он подоболочка знает переменную COUNT и первый вывод 2,

Другие вопросы по тегам