如何使用 Pushd 和 Popd 命令?

如何使用 Pushd 和 Popd 命令?

两者的实际用途是什么pushd?使用这两个命令相对于和popd有何优势?cdcd -

编辑:我正在寻找这两个命令的一些实际用途示例或将堆栈与目录保持在一起的原因(当您有制表符补全、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 个目录。dir3dir1, 和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

pushdpopd命令的一个非常有用的用例用于同时处理多个文件夹。

您可以非常轻松地浏览堆栈,因为它是枚举的。这意味着,您在工作期间可以使用多个工作文件夹。

请参阅下面的一个简单示例。


首先,让我们创建示例文件夹结构。

    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

相关内容