我正在学习《命令行速成课程》。我一直做得很好,但现在发现自己完全被 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 的来源。
举个例子:假设我们有目录one
,one/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,这也会变得更加清晰。然后“盘子堆”的类比就变得显而易见了。pushd
popd
答案2
为了节省屏幕上的垂直空间,pushd
将水平显示堆栈,新项目从左侧推送。
您从堆栈中的一个项目开始,即工作目录 ~/temp。执行 时pushd i/like/icecream
,pushd
将 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
)