Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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

echo "/some/directory/path" | xargs -n1 cd
share|improve this question
up vote 16 down vote accepted

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.

share|improve this answer
That makes complete sense. Thanks for helping a Unix noob. – Ian Lotinsky Nov 3 '10 at 19:36
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
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

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'
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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