请帮助我形象化地展示popd和pushd

请帮助我形象化地展示popd和pushd

我正在学习《命令行速成课程》。我一直做得很好,但现在发现自己完全被 popd 和 pushd 难住了。我读过一摞盘子或煎饼的比喻。我仍然不明白,因为我无法想象后面的代码。例如:

pats-MacBook-Pro:temp pat$ pushd i/like/icecream

〜/温度/我/喜欢/冰淇淋〜/温度

如果 pushd 类似于 cd,那么为什么第二行在行末显示 ~/temp?这部分如何与“盘子堆”类比?

然后如果我输入 popd,它会带我回到原始文件夹 ~/temp。为什么?

非常感谢您的帮助!谢谢!

答案1

pushd可以接受一个参数(目录名),将当前目录存储在DIRSTACK并将当前工作目录更改为给定目录。手册页进一步解释:

如果 pushd 命令成功,dirs也会执行 a。

dirs打印当前记住的目录。popd的目的是弹出(从堆栈中删除)“最上层”记住的目录并cd放入新的“最上层”记住的目录中。 成功后popd,再次dirs执行命令以打印当前堆栈。 如果您dirs在新的 shell 中执行此操作,您将看到当前 workind 目录始终包含在变量中DIRSTACK- 这就是您的 ~/temp 的来源。

举个例子:假设我们有目录oneone/two并且three在我们的主目录中:

~ $ pushd one   # change into one, remember current location
~/one ~
~/one $ pushd two   # change into two, remember current location
~/one/two ~/one ~   
~/one/two $ cd ../../three  # change into three, don't remember where we came from
~/three $ dirs  # show where we are and where we can get back to
~/three ~/one ~
~/three $ popd  # go back one step in the remembered directories
~/one ~
~/one $

您可以将pushd/popd命令视为“切换到此目录,但记住我们来自哪里(pushd);在新目录中执行操作;更改目录( )”的一种方式。如果您连续popd执行多个 s 而不进行 ing,这也会变得更加清晰。然后“盘子堆”的类比就变得显而易见了。pushdpopd

答案2

为了节省屏幕上的垂直空间,pushd将水平显示堆栈,新项目从左侧推送。

您从堆栈中的一个项目开始,即工作目录 ~/temp。执行 时pushd i/like/icecreampushd将 i/like/icecream 推到堆栈顶部,将 ~/temp 推到下方。pushd不过,显示结果的方式是显示 i/like/icecream 已从左侧推入堆栈,将 ~/temp 移到右侧。pushd还将工作目录更改为刚刚推入堆栈的目录,即 i/like/icecream。

popd弹出堆栈,删除顶部项目(i/like/icecream)并让下一个项目(~/temp)弹出到堆栈顶部,成为新的工作目录。

popd,例如pushd,显示堆栈的侧面,堆栈的顶部在左侧,堆栈的底部在右侧。

dirs -v使用垂直显示堆栈的命令可能有助于您直观地看到堆栈的当前状态。

答案3

一开始我也发现 popd 很难,但下面的内容对我有帮助:

为了狂欢cd,基本上:您可以使用而不是pushd来更改目录,因此它们被堆叠,或者换句话说:更改目录的历史记录被保存了。

pushd /home; pushd /var; pushd log

要查看堆栈(或历史记录),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

相关内容