To nie tak, że rura wraca do katalogu, jest to, że po dokonaniu pierwszego polecenia (przed średnikiem) zastosowanie tylko do komendy cat
. W gruncie rzeczy przetwarzasz wynik podprocesu procesu mkdir
i cd
i pwd
w procesie cat
.
Na przykład { mkdir dir; cd dir; pwd; } | cat; pwd;
najpierw rozszerza się dwoma sposobami: 1) { mkdir dir; cd dir; pwd; } | cat;
i 2) pwd
Pierwszy proces rozszerza się dwa procesy, { mkdir dir; cd dir; pwd; }
który następnie wysyła stdout
do stdin
z cat
. Gdy pierwszy z tych dwóch procesów się zakończy i zostanie pobrane stdout
, jego podproces kończy działanie i nie ma to miejsca, ponieważ cd
nigdy nie miało miejsca, ponieważ cd
wpływa tylko na katalog procesu, w którym działał. pwd
nigdy się nie zmienił $PWD
, został tylko wydrukowany to, co zostało dostarczone pod numerem stdin
.
Aby rozwiązać ten problem (zakładając, że rozumiem, co staramy się robić) Chciałbym zmienić to:
{ mkdir dir; cd dir; pwd; }; pwd; cd -
http://stackoverflow.com/questions/5760640/left-side-of-pipe-is-subshell, twoje 'cd' działa w podpowłoce. – Mat
W drugim skrypcie jest również w podpowierzchni – yegor256
@ yegor256 Nie, w drugim jest ** nie ** w podpowłoce. – devnull