两者的实际用途是什么pushd
?使用这两个命令相对于和popd
有何优势?cd
cd -
编辑:我正在寻找这两个命令的一些实际用途示例或将堆栈与目录保持在一起的原因(当您有制表符补全、cd -
缩短的别名cd ..
等时)。
答案1
pushd
,popd
, 和dirs
是 shell 内置函数,允许您操纵目录栈。这可用于更改目录,但返回到您原来的目录。
例如
从以下目录启动:
$ pwd
/home/saml/somedir
$ ls
dir1 dir2 dir3
推送到 dir1
$ pushd dir1
~/somedir/dir1 ~/somedir
$ dirs
~/somedir/dir1 ~/somedir
dirs
命令确认堆栈上现在有 2 个目录。dir1
和原始目录,somedir
. 笔记:我们的“当前”目录是~/somedir/dir1
.
Pushd 到 ../dir3 (因为我们dir1
现在在里面)
$ pushd ../dir3
~/somedir/dir3 ~/somedir/dir1 ~/somedir
$ dirs
~/somedir/dir3 ~/somedir/dir1 ~/somedir
$ pwd
/home/saml/somedir/dir3
dirs
显示堆栈中现在有 3 个目录。dir3
,dir1
, 和somedir
。注意方向。每个新目录都会添加到左侧。当我们开始弹出目录时,它们也将从左侧出现。
手动将目录更改为../dir2
$ cd ../dir2
$ pwd
/home/saml/somedir/dir2
$ dirs
~/somedir/dir2 ~/somedir/dir1 ~/somedir
现在开始弹出目录
$ popd
~/somedir/dir1 ~/somedir
$ pwd
/home/saml/somedir/dir1
请注意,我们突然回到了dir1
.
再次流行...
$ popd
~/somedir
$ pwd
/home/saml/somedir
我们又回到了起点somedir
。
可能会有点令人困惑,但堆栈的头部是您当前所在的目录。因此,当我们回到 时somedir
,尽管dirs
显示了以下内容:
$ dirs
~/somedir
我们的堆栈实际上是空的。
$ popd
bash: popd: directory stack empty
答案2
有pushd
和popd
命令的一个非常有用的用例用于同时处理多个文件夹。
您可以非常轻松地浏览堆栈,因为它是枚举的。这意味着,您在工作期间可以使用多个工作文件夹。
请参阅下面的一个简单示例。
首先,让我们创建示例文件夹结构。
user@vb:~$ mkdir navigate
user@vb:~/navigate$ mkdir dir1
user@vb:~/navigate$ mkdir dir2
user@vb:~/navigate$ mkdir dir3
然后您可以将所有文件夹添加到堆栈中:
user@vb:~/navigate$ pushd dir1/
~/navigate/dir1 ~/navigate
user@vb:~/navigate/dir1$ pushd ../dir2/
~/navigate/dir2 ~/navigate/dir1 ~/navigate
user@vb:~/navigate/dir2$ pushd ../dir3/
~/navigate/dir3 ~/navigate/dir2 ~/navigate/dir1 ~/navigate
您可以通过以下方式查找:
user@vb:~/navigate/dir3$ dirs -v
0 ~/navigate/dir3
1 ~/navigate/dir2
2 ~/navigate/dir1
3 ~/navigate
为了安全导航,您需要添加最后一个(零)文件夹两次,因为它总是会被重写:
user@vb:~/navigate/dir3$ pushd .
user@vb:~/navigate/dir3$ dirs -v
0 ~/navigate/dir3
1 ~/navigate/dir3
2 ~/navigate/dir2
3 ~/navigate/dir1
4 ~/navigate
现在,您可以跳转这些文件夹并像使用文件夹的别名一样使用堆栈。我想以下部分是不言自明的:
user@vb:~/navigate/dir3$ cd ~4
user@vb:~/navigate$ dirs -v
0 ~/navigate
1 ~/navigate/dir3
2 ~/navigate/dir2
3 ~/navigate/dir1
4 ~/navigate
user@vb:~/navigate$ cd ~3
user@vb:~/navigate/dir1$ dirs -v
0 ~/navigate/dir1
1 ~/navigate/dir3
2 ~/navigate/dir2
3 ~/navigate/dir1
4 ~/navigate
user@vb:~/navigate/dir1$ touch text.txt
user@vb:~/navigate/dir1$ cp text.txt ~2
user@vb:~/navigate/dir1$ ls ~2
text.txt
user@vb:~/navigate/dir1$ dirs -v
0 ~/navigate/dir1
1 ~/navigate/dir3
2 ~/navigate/dir2
3 ~/navigate/dir1
4 ~/navigate
额外提示是为 . 创建一些别名dirs -v
。
例如:
# In ~/.bashrc
alias dirs="dirs -v"
答案3
使用 dirs stack 的一个简单用例是仅通过 cd 无法做到的:
pushd .
将当前目录 XX 添加到dirs
堆栈中。之后,您可以使用 、 来移动cd
,并返回到 XX,popd
无论您在目录树中有多“远”(可以跳过多个级别、横向等)。在 bash 脚本中特别有用。
答案4
为了巴什,基本上:可以使用 cdpushd
来更改目录,而不是使用 cd 。实际使用:保存访问过的目录的历史记录(正确:堆叠)并且可以在它们之间切换:
pushd /home; pushd /var; pushd /tmp
要查看堆栈使用dirs
并更轻松地导航(要获取“堆栈条目”的数量,请使用:
dirs -v
输出:
me@myhost:/home$ dirs -v
0 /home
1 /var
2 /tmp
现在将这些数字与cd
和~
类似地使用:
cd ~1
但这些数字现在重新排列,位置“0”将会改变,所以只需将pushd
目录移动到顶部位置两次(或在位置 0 上使用虚拟),如下所示:
me@myhost:/home$ dirs -v
0 /home
1 /home
2 /var
3 /tmp
现在1..3将保持他们的位置
(要从堆栈中释放当前目录/从历史记录中删除它,请使用popd
)