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

8733
Ian Lotinsky

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

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

2 ответа на вопрос

19
parpa

The command cd is a built-in because the information about the current directory is tied to a process and only shell built-in can change current directory of the running shell.

There are two problems with your code:

  1. xargs cannot run cd because cd is a built-in command and xargs can run only executable files.
  2. Even if you run cd in a sub-process called from xargs, it will not have any effect on the parent process as explained above.

The solution is to run a sub-shell, inside it run cd and then you can execute commands in the new current directory.

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'` wisbucky 5 лет назад 0
17
Ignacio Vazquez-Abrams

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

Это имеет полный смысл. Спасибо за помощь Unix Noob. Ian Lotinsky 13 лет назад 0
Вы можете получить желаемый эффект, используя обратные кавычки: `cd \` echo "/ some / directory / path" | cut -d \ -f1 \ `` (обратите внимание, что я добавил 'cut', чтобы разделить пробелы и захватить первый элемент, как это делает xargs) Slartibartfast 13 лет назад 2
На самом деле, `xargs` не может запустить` cd`, так как это, по необходимости, встроенная оболочка, а `xargs` может запускать только автономные исполняемые файлы. Однако то, что вы сказали, верно в отношении подпроцессов. Dennis Williamson 13 лет назад 5
/ usr / bin / cd - определенно автономная документированная команда Unix, по крайней мере в Solaris. jlliagre 13 лет назад 0
Использование @Slartibartfast для автоматически сгенерированных путей: `` cd` файл порта libcudd | sed -e 's / \ / Portfile //' `` `(обычно это длинные, которые вы не хотите обрабатывать вручную, например, это расположение в MacPorts Portfile). Ioannis Filippidis 10 лет назад 0