Почему ` cd` не действуют, если вывод передается по конвейеру?

Предполагая, что вы имеете в виду третий символ , а не третью букву ;

find . -name '[!akGQ]?[!0-9]*'
3
22.06.2018, 19:19
1 ответ

Каналы включают подоболочки, часть которых не запускается в родительской оболочке и, таким образом, не может влиять на рабочий каталог этого процесса родительской оболочки. Так ведет себя ЗШ:

% cd /tmp
% cd /var/tmp | tail
% pwd
/tmp
% echo foo | cd /var/tmp
(pwd now: /var/tmp)
% cd /tmp
% echo foo | cd /var/tmp | echo bar
bar
% pwd
/tmp
% 

Обратите внимание, что каталог изменился только тогда, когда cdбыла последней командой в конвейере; это было запущено в самой родительской оболочке и, таким образом, могло изменить рабочий каталог этого процесса.

Полезное использование этой функции обычно включает явную подоболочку и выполнение команд в ней:

dowork | ( cd elsewhere && domorework ) | andyetmore

также обязательно проверьте вызов cdна наличие ошибок, а не предполагайте, что он сработал, если только вы не хотите, чтобы вывод rsyncраспылялся по всему /, или другой подобный гипотетический беспорядок...

3
27.01.2020, 21:21

Теги

Похожие вопросы