Чувствую себя идиотом прямо сейчас. Почему это не работает?
echo "/some/directory/path" | xargs -n1 cd
Чувствую себя идиотом прямо сейчас. Почему это не работает?
echo "/some/directory/path" | xargs -n1 cd
Ответы:
Канал запускает xargs в подпроцессе, а xargs запускает cd в подпроцессе. Изменения в подпроцессе не распространяются на родительский процесс.
cd `echo "/some/directory/path" | cut -d\ -f1`
желаемый эффект, используя обратные кавычки: (Обратите внимание, что я добавил 'cut', чтобы разделить пробелы и захватить первый элемент, как это делает xargs)
xargs
не может работать, cd
так как это, по необходимости, встроенная оболочка и xargs
может запускать только автономные исполняемые файлы. Однако то, что вы сказали, верно в отношении подпроцессов.
cd `port file libcudd | sed -e 's/\/Portfile//'`
(как правило, длинные, которые вы не хотите обрабатывать вручную, например, это расположение файла портов MacPorts).
Команда cd
является встроенной, поскольку информация о текущем каталоге связана с процессом, и только встроенная оболочка может изменить текущий каталог запущенной оболочки.
Есть две проблемы с вашим кодом:
xargs
не может работать, cd
потому что cd
это встроенная команда и xargs
может запускать только исполняемые файлы.cd
подпроцесс, вызванный из xargs
, он не окажет никакого влияния на родительский процесс, как описано выше.Решение состоит в том, чтобы запустить вложенную оболочку, запустить ее cd
и затем выполнить команды в новом текущем каталоге.
ls | xargs -L 1 bash -c 'cd "$0" && pwd && ls'
ls | xargs ...
в этом примере. Должно быть указано значение для $0
вроде:echo "/some/directory/path" | xargs -L 1 bash -c 'cd "$0" && pwd && ls'