推送/弹出当前目录?


66

使用bash有没有一种方法可以推送和弹出当前工作目录?我尝试编写,bash;cd dir; ./dostuff;exit;但是当前目录是现在dir

linux  bash 

Answers:


91

pushdpopd

Bash会保留您访问的目录的历史记录,您只需询问即可。Bash将历史记录存储在堆栈中,并使用推入和弹出的命令来管理堆栈。

更多阅读

例:

$ pwd; pushd /tmp; pwd; popd; pwd
/home/me
/tmp ~
/tmp
~
/home/me

1
链接摘录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.
首席

31

调用将bash启动一个新的子shell,该子shell具有自己的输入;直到退出,其他命令都不会运行。围绕要使用parens运行的命令也将启动一个新的子shell,但是它将在其中运行命令。

( cd dir ; ./dostuff )

1
辉煌!如果只想在其他目录中运行命令(例如更新依赖项),然后返回到当前目录,则无需按下/弹出。
Dan Dascalescu

12

如果不需要多个级别的目录历史记录,则还可以执行以下操作:

cd foo
# do your stuff in foo
cd -

pushd/ 相比popd,这样做的缺点是,如果cd foo失败,您将使用进入错误的目录cd -

(可能cd -在外部脚本中更方便。“让我们回到原来的位置。”)


4

我使用别名来跟踪我的目录更改,因此在某个地方可以将cd更改为cd,然后回到使用cd。的位置,或者使用cd ..返回两个。

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
您能否更详细地解释此代码的作用?
bwDraco

那很聪明。我在推送和弹出操作周围有别名,可以做一些自己喜欢的事情。我一直在使用目录堆栈。我讨厌在某处看人cd,然后向后滚动以查找要剪切和粘贴的上一个目录。由于配额的原因,我无法在主目录中完成大部分工作,因此我必须使用网络上的池存储。
Michael Mathews

1
别名..cd足够健壮吗?看起来它仅从堆栈中删除了最后10个项目。
reynoldsnlp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.