如何在 Linux 上使用 pushd 和 popd

許多 Linux 用戶可能對 pushdpopd 這兩個命令感到陌生,但它們實際上一直存在於系統中。它們能夠顯著提高在命令行介面中導航目錄的效率。本文將引導您了解如何運用這兩個實用的命令。

pushdpopd 的概念

在 1978 年,比爾·喬伊將目錄堆疊的概念引入了他的 C shell,並提供了操作這些堆疊的方法:pushdpopd。由於模仿是最高的讚美,目錄堆疊、pushdpopd 命令很快被整合到其他 shell (例如 Bash) 甚至其他作業系統中。

堆疊的概念很簡單:項目一個接一個地被放置到堆疊上,最近添加的項目總是位於最頂端。當從堆疊中取出項目時,它們會依照從頂端到底部的順序被移除。這種特性通常被稱為後進先出 (LIFO) 隊列。

實際上,pushdpopd 比這稍微靈活一些,但這是一個很好記的模型。

當我們提到目錄堆疊時,pushdpopd 中的 “d” 代表 “目錄” 應該不令人意外。這些命令允許您將目錄推入或彈出目錄堆疊。

這對我們有什麼好處呢?

pushd 如何填充堆疊

當您使用 pushd 命令時,會發生以下三件事:

  • 您的目錄會如同使用 cd 命令一樣被變更。
  • 該目錄的名稱和路徑會被添加到堆疊中。
  • 堆疊會被顯示為一個以空格分隔的目錄列表。

在接下來的範例中,請注意目錄堆疊如何隨著每次新的 pushd 命令而擴增。同時,請注意堆疊的最頂端位於左側,新的條目會被添加到這裡。

在第一個 pushd 命令之後,堆疊中有兩個條目:您離開的目錄以及您移動到的目錄。

在我們的範例中,我們輸入以下內容:

pushd ~/Desktop
pushd ~/Music
pushd ~/Documents
pushd ~/Pictures
pushd ~

最後一個 pushd 命令將我們帶回主目錄,因此堆疊中的第一個和最後一個條目是波浪號 (~),它代表我們的主目錄。這表明,即使堆疊中已經存在一個目錄,對於其他 pushd 命令,它還是會再次被添加。

另請注意,堆疊中最左側的條目(最近添加的條目)是您當前的目錄。

dirs 命令

您可以使用 dirs 命令來顯示目錄堆疊,如下所示:

dirs

它不會影響堆疊,它只是顯示它。與 pushd 一起使用的一些選項是指目錄在堆疊中的位置。

如果您想要查看每個目錄的數字位置,可以使用 -v(垂直)選項,如下所示:

dirs -v

如果您想要看到主目錄的完整路徑,而不是波浪號 (~),請添加 -l (長格式) 選項,如下所示:

dirs -v -l

將目錄添加到堆疊

正如我們所見,當您使用 pushd 命令時,它會執行三項操作:變更您的目錄、將新的目錄添加到堆疊中,以及向您顯示堆疊。您可以使用 -n (不旋轉) 選項,在不變更當前目錄的情況下將目錄添加到堆疊。

這是我們的目錄堆疊:

dirs -v -l

現在,我們將使用帶有 -n 選項的 pushd 命令,並將 /home/dave 目錄作為參數傳遞。然後,我們會再次檢查目錄堆疊。

我們輸入以下內容:

pushd -n /home/dave
dirs -v -l

/home/dave 目錄被添加到堆疊中位於位置 1 的插槽中,這是堆疊中的第二個位置。它無法佔據最頂端的位置,因為插槽 0 始終是當前目錄。

我們沒有離開當前目錄 ~/Videos,因此它沒有旋轉到堆疊中的另一個位置。

通過旋轉堆疊來變更目錄

您可以將數字參數與 pushd 一起使用,以便移動到堆疊中的任何目錄,並且堆疊會在您執行此操作時旋轉。您選擇移動的目錄將會變成堆疊中的第一個條目。

您可以通過位置編號來引用堆疊中的目錄。您可以從堆疊的頂部或底部開始計數。對於正數,例如 +3,從頂部開始計數;對於負數,例如 -2,從底部開始計數。

/home/dave/Documents 目錄位於位置三。我們可以透過以下命令來移動到該目錄:

pushd +3

我們選擇的目錄上方的堆疊中的目錄會被移動到堆疊的底部。我們選擇的目錄現在佔據最頂端的位置,而我們也移動到了該目錄。

如果我們想要切換到堆疊底部的目錄,可以使用以下命令:

pushd -0

最後一個目錄會移動到第一個插槽,所有其他目錄會在堆疊中向下移動。我們已變更為 ~/Pictures 目錄。

popd 命令

您可以使用 popd 命令從堆疊中移除目錄。

如果我們查看目錄堆疊,可以看到位置 1 的目錄是 /home/dave。要從堆疊中移除它,我們需要鍵入以下內容,並將數字傳遞給 popd

dirs -v -l
popd +1

/home/dave 目錄已被刪除,堆疊中位於其下方的目錄已分別向上移動一個位置。

就像我們可以搭配 pushd 一樣,我們可以搭配 popd 從堆疊底部開始計數。要從堆疊中移除最後一個目錄,我們鍵入:

popd -0

~/Music 目錄會從堆疊中的最後一個位置被移除。

要變更目錄、執行一些操作,然後跳回先前的目錄,可以同時使用 pushdpopd

我們將使用 pushd 移動到不同的目錄。我們將使用 popd 捨棄堆疊最頂端的目錄,並移動到第二個位置的目錄。這是您剛剛移出的目錄,因此您將會回到您原本所在的目錄。

我們輸入以下內容:

pushd ~
popd

我們從 ~/Projects 目錄開始,使用 pushd 移動到主目錄,然後使用 popd 回到 ~/Projects 目錄。

在整個堆疊中旋轉

我們將說明如何在包含一些巢狀目錄的堆疊中循環,但您可以在檔案系統中的任何位置使用任何目錄。

我們最深層的巢狀是:

/home/dave/Projects/htg/articles

從主目錄開始,我們將逐步向下瀏覽每個目錄,直到抵達文章目錄。然後,我們將查看目錄堆疊。

我們輸入以下內容:

pushd ~/Projects
pushd htg
pushd articles
dirs -v -l

當您重複發出 pushd +1 命令時,您可以在目錄堆疊中循環。如果您經常這樣做, pushd +1 會是一個很好的別名候選者。

鍵入以下內容:

pushd +1

在堆疊上衝壓

恢復舊習慣並使用 cd 變更目錄是很容易的。如果您這樣做,您將會覆蓋堆疊中的第一個目錄。這是不可避免的,因為第一個位置是為當前工作目錄保留的,而其他位置都沒有變更。

為此,請鍵入以下內容:

dirs -v -l
cd ~/Music
dirs -v -l

在您習慣使用 pushdpopd 命令之後(可能還為它們建立了一些別名),您將擁有一種在目錄之間跳轉的超快方式。

這就是我們在命令行介面中徘徊的原因。效率至上,不是嗎?