shell popd
push和popd命令是Bash shell的内置功能,可帮助您“标记”目录,以便在硬盘上的位置之间快速导航。 您可能已经感觉到终端是一种无法快速浏览计算机的方式。 只需按几次键,您就可以访问硬盘驱动器,附加存储或网络共享中的任何位置。 但是,当您发现自己在目录之间来回移动或在文件系统中“丢失”时,该速度可能会降低。 这些恰恰是问题pushd和popd命令可以帮你解决。
推
从最基本的角度来看 , push很像cd 。 它会将您从一个目录转到另一个目录。 假设您有一个名为one的目录,其中包含一个名为2的子目录,其中包含一个名为3的子目录,依此类推。 如果当前工作目录是1 ,则可以使用cd命令移动到两个或三个或任何位置:
$
pwd
one
$
cd two
/ three
$
pwd
three
您可以使用pushd进行相同操作:
$
pwd
one
$
pushd two
/ three
~
/ one
/ two
/ three ~
/ one
$
pwd
three
pushed的最终结果与cd相同,但还有一个中间结果: pushed回显您的目标目录和原始点。 这是您的目录堆栈 ,这是使push唯一的原因。
堆栈
用计算机术语来说,堆栈是指元素的集合。 在此命令的上下文中,元素是您最近使用pushd命令访问的目录。 您可以将其视为历史或痕迹。
您可以通过push来移动整个文件系统; 每次,您以前的位置和新的位置都会添加到堆栈中:
$
pushd four
~
/ one
/ two
/ three
/ four ~
/ one
/ two
/ three ~
/ one
$
pushd five
~
/ one
/ two
/ three
/ four
/ five ~
/ one
/ two
/ three
/ four ~
/ one
/ two
/ three ~
/ one
浏览堆栈
建立堆栈后,就可以将其用作书签或快速移动航路点的集合。 例如,假设在会话期间您在本示例的〜/ one / two / two / three / four / 5目录结构中进行了大量工作。 您知道您最近来过一次 ,但是您不记得它在推送堆栈中的位置。 您可以使用+0 (是加号,后跟零)参数查看堆栈,该参数告诉pushed不要更改到堆栈中的任何目录,但还会提示pushed回显当前堆栈:
$
pushd +
0
~
/ one
/ two
/ three
/ four ~
/ one
/ two
/ three ~
/ one ~
/ one
/ two
/ three
/ four
/ five
另外,您可以使用dirs命令查看堆栈,并可以使用-v选项查看每个目录的索引号:
$
dirs
-v
0 ~
/ one
/ two
/ three
/ four
1 ~
/ one
/ two
/ three
2 ~
/ one
3 ~
/ one
/ two
/ three
/ four
/ five
堆栈中的第一个条目是您的当前位置。 您可以像往常一样使用pwd确认这一点:
$
pwd
~
/ one
/ two
/ three
/ four
从0(您当前的位置和堆栈的第一个条目)开始,堆栈中的第二个元素是〜/ one ,这是您想要的目的地。 您可以使用+2选项在堆栈中前进:
$
pushd +
2
~
/ one ~
/ one
/ two
/ three
/ four
/ five ~
/ one
/ two
/ three
/ four ~
/ one
/ two
/ three
$
pwd
~
/ one
这会将您的工作目录更改为〜/ one,并且还移动了堆栈,以便您的新位置位于最前面。
您还可以在堆栈中向后移动。 例如,要快速达到示例输出的〜/ one / two / 3 ,您可以向后移动一位,并记住push以0开头:
$
pushd
-0
~
/ one
/ two
/ three ~
/ one ~
/ one
/ two
/ three
/ four
/ five ~
/ one
/ two
/ three
/ four
添加到堆栈
您可以继续以这种方式浏览堆栈,并且它将仍然是您最近访问的目录的静态列表。 如果要添加目录,只需提供目录的路径。 如果目录是堆栈中的新目录,则会按照您的期望将其添加到列表中:
$
pushd
/ tmp
/ tmp ~
/ one
/ two
/ three ~
/ one ~
/ one
/ two
/ three
/ four
/ five ~
/ one
/ two
/ three
/ four
但是,如果它已经存在于堆栈中,则会第二次添加:
$
pushd ~
/ one
~
/ one
/ tmp ~
/ one
/ two
/ three ~
/ one ~
/ one
/ two
/ three
/ four
/ five ~
/ one
/ two
/ three
/ four
尽管堆栈通常用作您要快速访问的目录的列表,但它确实是您去过的地方的真实历史记录。 如果不想将目录多余地添加到堆栈中,则必须使用+ N和-N表示法。
从堆栈中删除目录
显然,您的堆栈不是一成不变的。 您可以通过推入添加到其中,也可以通过popd从其中删除项目。
举例来说,假设你刚刚使用PUSHD添加〜/一到你的筹码,使得〜/一个当前工作目录。 要删除第一个(如果愿意,可以选择“ zeroeth”):
$
pwd
~
/ one
$
popd +
0
/ tmp ~
/ one
/ two
/ three ~
/ one ~
/ one
/ two
/ three
/ four
/ five ~
/ one
/ two
/ three
/ four
$
pwd
~
/ one
当然,您可以删除任何元素,从0开始计数:
$
pwd ~
/ one
$
popd +
2
/ tmp ~
/ one
/ two
/ three ~
/ one
/ two
/ three
/ four
/ five ~
/ one
/ two
/ three
/ four
$
pwd ~
/ one
您还可以使用堆栈背面的popd ,再次从0开始。例如,从堆栈中删除最终目录:
$
popd
-0
/ tmp ~
/ one
/ two
/ three ~
/ one
/ two
/ three
/ four
/ five
像这样使用时, popd不会更改您的工作目录。 它只会操纵您的堆栈。
使用popd导航
没有给出任何参数的popd的默认行为是从堆栈中删除第一个(zeroeth)项目,并将下一个项目作为当前工作目录。
例如,当您在两个不同的目录中工作并且只需要暂时离开一些其他位置时,这作为快速更改命令最有用。 如果不需要详细的历史记录,则不必考虑目录堆栈:
$
pwd
~
/ one
$
pushd ~
/ one
/ two
/ three
/ four
/ five
$
popd
$
pwd
~
/ one
您也不需要快速连续使用推入式和弹出式 。 如果您使用push来访问其他位置,然后因追踪错误或进行研究而分心了三个小时,那么您会发现目录堆栈耐心等待(除非您已结束终端会话):
$
pwd ~
/ one
$
pushd
/ tmp
$
cd
{
/ etc,
/ var,
/ usr
} ;
sleep
2001
[ ...
]
$
popd
$
pwd
~
/ one
在现实世界中被推挤
push和popd命令非常有用。 学习它们之后,您会发现充分利用它们的借口,并且您将熟悉目录堆栈的概念。 熟悉推入是帮助我理解git stash的原因 ,它与推入完全无关,但在概念上无形上相似。
在shell脚本中使用push和popd可能很诱人,但是通常最好避免使用它们。 它们在Bash和Zsh之外不可移植,当您重新阅读脚本时它们会变得钝( 推+3的清晰度不如cd $ HOME / $ DIR / $ TMP或类似名称)。
除了这些警告之外,如果您是常规的Bash或Zsh用户,则可以并且应该尝试push和popd 。
翻译自: https://opensource.com/article/19/8/navigating-bash-shell-pushd-popd
shell popd