Вот загадка: может ли кто-нибудь объяснить, почему cd не работает, когда вывод перенаправляется на канал?
Например.:
james@machine:~$ cd /tmp # fine, no problem
james@machine:~$ cd /tmp | grep 'foo' # doesn't work
james@machine:~$ cd /tmp | tee -a output.log # doesn't work
james@machine:~$ cd /tmp >out.log # does work
Проверено на OSX, Ubuntu и RHEL.
Любые идеи?
РЕДАКТИРОВАТЬ: Кажется странным, что я распаковываю вывод cd? Причина в том, что это от функции, которая обертывает произвольные команды оболочки записями журнала и обрабатывает вывод.





Когда вы перенаправляете вывод, он порождает дочерний процесс оболочки, изменяет каталог в дочернем процессе и завершает работу. Если вы не перенаправляете вывод, он не порождает никаких новых процессов, потому что это встроенная команда оболочки.
Вы имеете в виду вывод в out.log в своем примере? Этот файл создается и перенаправление настраивается перед выполнением команды cd.
Точно ... Если я правильно помню свой класс ОС, оболочка разветвляет дочерний процесс, дочерний процесс открывает новый stdin, stdout и / или stderr, а затем выполняет свою команду.
Я имею в виду, что это: "cd / tmp | echo 'foo'> out.log" создает файл out.log в текущем каталоге, а не в / tmp. Созданный дочерний элемент не работает в / tmp - если вы не имеете в виду, что стандартный вывод порожденного дочернего элемента устанавливается до выполнения cd?
Это многообещающе, но порожденная команда по-прежнему работает в текущем каталоге: вывод, отправленный в файл, не соответствует компакт-диску ... Я был бы рад принять это с дополнительными объяснениями, возможно, обходным путем? ;)