Используя xargs для перехода в каталог
Чувствую себя идиотом прямо сейчас. Почему это не работает?
echo "/some/directory/path" | xargs -n1 cd
2 ответа
Решение
Канал запускает xargs в подпроцессе, а xargs запускает cd в подпроцессе. Изменения в подпроцессе не распространяются на родительский процесс.
Команда cd
является встроенным, потому что информация о текущем каталоге связана с процессом, и только встроенная оболочка может изменить текущий каталог запущенной оболочки.
Есть две проблемы с вашим кодом:
xargs
не могу бежатьcd
так какcd
это встроенная команда иxargs
может запускать только исполняемые файлы.- Даже если вы бежите
cd
в подпроцессе, вызванном изxargs
, это не будет иметь никакого влияния на родительский процесс, как объяснено выше.
Решение состоит в том, чтобы запустить вложенную оболочку, внутри нее запустить cd
а затем вы можете выполнять команды в новом текущем каталоге.
ls | xargs -L 1 bash -c 'cd "$0" && pwd && ls'