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
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.
Example:
$ pwd; pushd /tmp; pwd; popd; pwd
/home/me
/tmp ~
/tmp
~
/home/me
- 11,071
- 34,446
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 )
- 112,653
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.")
- 463
-
is it posix compatible? could not quickly find the answer, probably someone knows right away – moudrick Oct 23 '20 at 13:00
-
UPD. found, yes, compatible, this is actually
cd "$OLDPWD" && pwd. https://www.unix.com/man-page/posix/1posix/cd/ – moudrick Oct 23 '20 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'
-
1
-
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 05 '17 at 00:00
-
1Is the alias
..cdrobust 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"
- 399
pushd 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 08:39