Используя xargs для перехода в каталог

Чувствую себя идиотом прямо сейчас. Почему это не работает?

echo "/some/directory/path" | xargs -n1 cd

2 ответа

Решение

Канал запускает xargs в подпроцессе, а xargs запускает cd в подпроцессе. Изменения в подпроцессе не распространяются на родительский процесс.

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

Есть две проблемы с вашим кодом:

  1. xargs не могу бежать cd так как cd это встроенная команда и xargs может запускать только исполняемые файлы.
  2. Даже если вы бежите cd в подпроцессе, вызванном из xargs, это не будет иметь никакого влияния на родительский процесс, как объяснено выше.

Решение состоит в том, чтобы запустить вложенную оболочку, внутри нее запустить cd а затем вы можете выполнять команды в новом текущем каталоге.

ls | xargs -L 1 bash -c 'cd "$0" && pwd && ls'
Другие вопросы по тегам