許多 Linux 用戶可能對 pushd
和 popd
這兩個命令感到陌生,但它們實際上一直存在於系統中。它們能夠顯著提高在命令行介面中導航目錄的效率。本文將引導您了解如何運用這兩個實用的命令。
pushd
和 popd
的概念
在 1978 年,比爾·喬伊將目錄堆疊的概念引入了他的 C shell,並提供了操作這些堆疊的方法:pushd
和 popd
。由於模仿是最高的讚美,目錄堆疊、pushd
和 popd
命令很快被整合到其他 shell (例如 Bash) 甚至其他作業系統中。
堆疊的概念很簡單:項目一個接一個地被放置到堆疊上,最近添加的項目總是位於最頂端。當從堆疊中取出項目時,它們會依照從頂端到底部的順序被移除。這種特性通常被稱為後進先出 (LIFO) 隊列。
實際上,pushd
和 popd
比這稍微靈活一些,但這是一個很好記的模型。
當我們提到目錄堆疊時,pushd
和 popd
中的 “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
目錄會從堆疊中的最後一個位置被移除。
要變更目錄、執行一些操作,然後跳回先前的目錄,可以同時使用 pushd
和 popd
。
我們將使用 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
在您習慣使用 pushd
和 popd
命令之後(可能還為它們建立了一些別名),您將擁有一種在目錄之間跳轉的超快方式。
這就是我們在命令行介面中徘徊的原因。效率至上,不是嗎?