Это не то, что труба идет обратно в каталог, то, что вы сделали первую команду (до запятой), применимой только к команде cat
. Вы, по существу, соединяете выходные данные подпроцесса mkdir
и cd
и pwd
, переходите к процессу cat
.
Например: { mkdir dir; cd dir; pwd; } | cat; pwd;
Первый расширяется на два процесса: 1) { mkdir dir; cd dir; pwd; } | cat;
и 2) pwd
Первый процесс расширяется на два процесса, { mkdir dir; cd dir; pwd; }
, который затем посылает его к stdout
stdin
из cat
. Когда первый из этих двух процессов заканчивается и собирается stdout
, его подпроцесс выходит, и это похоже на то, что cd
никогда не происходило, потому что cd
влияет только на каталог процесса, в котором он работал. pwd
никогда не изменялся $PWD
, он только печатался который был предоставлен по адресу stdin
.
Чтобы решить эту проблему (при условии, я понимаю, что вы пытаетесь сделать) я хотел бы изменить это:
{ mkdir dir; cd dir; pwd; }; pwd; cd -
http://stackoverflow.com/questions/5760640/left-side-of-pipe-is-the-subshell, ваш 'cd' работает в подоболочке. – Mat
Во втором скрипте также находится в подоболочке – yegor256
@ yegor256 Нет, во втором это ** не ** в подоболочке. – devnull