103

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.

5 Answers 5

135

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

Example:

$ pwd; pushd /tmp; pwd; popd; pwd
/home/me
/tmp ~
/tmp
~
/home/me
1
  • 4
    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. Jan 12, 2019 at 8:39
36

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 )
0
15

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.")

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

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'
3
  • 1
    Can you explain in more detail what this code does?
    – bwDraco
    Feb 17, 2015 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. Jan 5, 2017 at 0:00
  • 1
    Is the alias ..cd robust enough? it looks like it only remove the last 10 items from the stack. Mar 16, 2018 at 17:30
1

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"

You must log in to answer this question.