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
-
4Excerpt from the link
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.
Jan 12, 2019 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 )
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.")
-
is it posix compatible? could not quickly find the answer, probably someone knows right away– moudrickOct 23, 2020 at 13:00
-
UPD. found, yes, compatible, this is actually
cd "$OLDPWD" && pwd
. unix.com/man-page/posix/1posix/cd– moudrickOct 23, 2020 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. Jan 5, 2017 at 0:00
-
1Is the alias
..cd
robust enough? it looks like it only remove the last 10 items from the stack. Mar 16, 2018 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"