21

Feeling like an idiot right now. Why does this not work?

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

The pipe runs xargs in a subprocess, and xargs runs cd in a subprocess. Changes in a subprocess do not get propagated to the parent process.

  • That makes complete sense. Thanks for helping a Unix noob. – Ian Lotinsky Nov 3 '10 at 19:36
  • 2
    You can get the effect you want by using back-quotes: cd `echo "/some/directory/path" | cut -d\ -f1` (Note that I added 'cut' to split on spaces and grab the first item the way xargs does) – Slartibartfast Nov 3 '10 at 20:27
  • 5
    Actually, xargs can't run cd since it's, of necessity, a shell builtin and xargs can only run free-standing executables. What you said is true about subprocesses, however. – Dennis Williamson Nov 3 '10 at 20:36
  • /usr/bin/cd is definitely a Unix free standing documented command, at least on Solaris. – jlliagre Nov 3 '10 at 23:31
  • Using @Slartibartfast for auto-generated paths: cd `port file libcudd | sed -e 's/\/Portfile//'` (usually long ones you don't want to handle manually, like this MacPorts Portfile location). – Ioannis Filippidis Dec 5 '13 at 10:22
20

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'
  • It doesn't make sense to do ls | xargs ... in this example. It should be passing in the value for $0, like echo "/some/directory/path" | xargs -L 1 bash -c 'cd "$0" && pwd && ls' – wisbucky Nov 6 '18 at 23:36

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.