Я понимаю, что с |
инициирует новый процесс для команды (ы) после трубы, любая команда оболочки формы cmd | cd newdir
(где cmd
не изменяет текущий рабочий каталог) будет оставить рабочий каталог исходного процесса в неизменной. (Не говоря уже о том, что это немного глупо, так как cd
не считывают данные из стандартного ввода.)Трубопровод `cd` или` popd` выход предотвращает изменение каталогов?
Однако на моей машине (а CentOS 6 коробки, используя bash
, ksh
или zsh
), представляется, что следующее команда также не удается изменить каталоги:
cd newdir | cat
(Пожалуйста, игнорируйте, как глупо это для вывода труб кошке здесь, я просто пытаюсь сделать простой пример.)
Почему это? Есть ли способ обойти эту проблему? В частности, я пытаюсь написать псевдоним, который использует popd
, но ловит вывод, отбрасывает stdout и повторно выводит stderr.
(Для любопытных, это мой текущий, нерабочий псевдоним:.. popd 2>&1 >/dev/null | toerr && lsd
Здесь toerr
просто ловит стандартный ввод, выводят его на стандартный вывод ошибки и возвращает число прочитанных строк/распечатан lsd
является каталог-name- который должен выполняться только при успешном завершении popd
. Причина, по которой я отправляю stderr в stdout, обманывать его, ловить его и повторно выводить на stderr, это просто сделать его красным, используя stderred, так как моя оболочка сессия не загружена LD_PRELOAD, так Баш встроенные модули, такие как popd
не получить красный цвета STDERR.)
В ответ на то, кто голосует, чтобы закрыть это, потому что это вне темы: во-первых, эта проблема применяется как к сценариям оболочки, так и к интерактивным сеансам оболочки; во-вторых, проблема возникает в контексте написания псевдонима, который (особенно в этом случае, когда у меня есть относительно сложная логика) по существу является крошечной программой; –
Третий вопрос по темам о процессах и подпроцессах на SuperUser имеет тенденцию больше фокусироваться на взаимодействии пользователя с запущенными процессами (просмотр/убийство заданий, процессы нереста и т. Д.), В то время как этот вопрос касается технического поведения '|', который кажется Мне больше нравится программирование. –