Shell变量不会随着管道读取组合而改变
考虑案例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循环内部发生了变化,但是一旦它不在循环中就会发生变化。
我到底错过了什么?
在第一种情况下,所有命令都在同一个shell中执行。 COUNT
的内容已更改。
在第二种情况下,子管道以管道|
开始 ,子shell中的更改对当前shell没有影响。 但是他的子shell知道变量COUNT
,第一个输出是2
。