With bash is there a way to push and pop the current working directory? I tried writing bash;cd dir; ./dostuff;exit; but the current directory is now dir.


There is pushd and popd

Bash will keep a history of the directories you visit, you just have to ask. Bash stores the history in a stack and uses the commands pushd and popd to manage the stack.

More to read


$ pwd; pushd /tmp; pwd; popd; pwd
/tmp ~
| improve this answer | |
  • 1
    Excerpt from the linkpushd Saves the current directory on the top of the directory stack and then cd to dir. With no arguments, pushd exchanges the top two directories. – Master Chief Jan 12 '19 at 8:39

Calling bash starts a new subshell, which has its own input; none of the other commands will run until it exits. Surrounding the commands to be run with parens will also start a new subshell, but it will run the commands within it.

( cd dir ; ./dostuff )
| improve this answer | |
  • 1
    Brilliant! No need to push/pop when the intention is to just run a command in a different directory (e.g. update a dependency) then come back to the current one. – Dan Dascalescu Jan 16 '18 at 8:27

If you don't need multiple levels of directory history, you can also do:

cd foo
# do your stuff in foo
cd -

Compared to pushd/popd, this has the disadvantage that if cd foo fails, you end up in the wrong directory with cd -.

(Probably cd - is more handy outside scripts. "Let's go back where I just was.")

| improve this answer | |
  • is it posix compatible? could not quickly find the answer, probably someone knows right away – moudrick Oct 23 at 13:00
  • UPD. found, yes, compatible, this is actually cd "$OLDPWD" && pwd. unix.com/man-page/posix/1posix/cd – moudrick Oct 23 at 16:41

I use alias for keeping track of my directory changes so to 'cd' somewhere I can just go back to where I was using 'cd.', or go back two using 'cd..', etc.;

alias pushdd="pushd \$PWD > /dev/null"
alias cd='pushdd;cd'
alias ssh='ssh -A'
alias soc='source ~/.bashrc'
#below to go back to a previous directory (or more)
alias popdd='popd >/dev/null'
alias cd.='popdd'
alias cd..='popdd;popdd'
alias cd...='popdd;popdd;popdd'
alias cd....='popdd;popdd;popdd;popdd'
#below to remove directories from the stack only (do not 'cd' anywhere)
alias .cd='popd -n +0'
alias ..cd='popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0;popd -n +0'
| improve this answer | |
  • 1
    Can you explain in more detail what this code does? – bwDraco Feb 17 '15 at 17:31
  • That's clever. I have aliases around my pushd and popd to do some things I like. I use the directory stack all the time. I hate watching people cd somewhere and then scroll back looking for the previous directory to cut and paste. I can't do most of my work in my home directory because of quotas, so i have to use pooled storage on the network. – Michael Mathews Jan 5 '17 at 0:00
  • 1
    Is the alias ..cd robust enough? it looks like it only remove the last 10 items from the stack. – reynoldsnlp Mar 16 '18 at 17:30

pushd add on to a directory stack

popd remove off of a directory stack

dirs view directory stack

dirs -p "display directory entries one per line"

dirs -c "clear the directory stack"

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy