Este é essencialmente o mesmo problema que Por que o array vazio após o loop while? isto é (independentemente de você estar ou nãosource
), o pushd
está ocorrendo em um subshell diferente.
Contraste
$ cat pathnames | while read pathname; do pushd "$pathname"; dirs -v; done
/tmp/my dir1 ~
0 /tmp/my dir1
1 ~
/tmp/dir2 /tmp/my dir1 ~
0 /tmp/dir2
1 /tmp/my dir1
2 ~
/tmp/dir3 /tmp/dir2 /tmp/my dir1 ~
0 /tmp/dir3
1 /tmp/dir2
2 /tmp/my dir1
3 ~
$
$ dirs -v
0 ~
com
$ while read pathname; do pushd "$pathname"; dirs -v; done < pathnames
/tmp/my dir1 ~
0 /tmp/my dir1
1 ~
/tmp/dir2 /tmp/my dir1 ~
0 /tmp/dir2
1 /tmp/my dir1
2 ~
/tmp/dir3 /tmp/dir2 /tmp/my dir1 ~
0 /tmp/dir3
1 /tmp/dir2
2 /tmp/my dir1
3 ~
$
$ dirs -v
0 /tmp/dir3
1 /tmp/dir2
2 /tmp/my dir1
3 ~
$