2023-11-08|閱讀時間 ‧ 約 3 分鐘

【Linux疑難雜症】關於pushd與popd的妙用

raw-image



我們偶爾在Linux的Bash腳本都會看到「pushd …」、「popd」的影子, 一開始看到也覺得這是什麼碗粿…, 這樣很難讀耶, 但指令被發明出來一定是有它存在的意義與道理的, 我們不能因為未知就直覺的認為該指令毫無作用, 而是要在正確的情境之下去使用。

pushd與popd我們就理解成資料結構中的堆疊, 首先是pushd的部份, 他就等同於cd某個目錄, 只是除了進入該目錄之外, 也會將前目錄路徑推入堆疊裡, 而搭配上popd就能夠切回上一層目錄, 過程中不需要另外宣告一個變數來特別記載進入前的目錄。

常用命令

dirs

呈現目前的目錄堆疊中有儲存著哪些路徑。

(base) ➜  Downloads dirs

~/Downloads

pushd

將目錄加到堆疊區之後, 再切換到目標目錄。

(base) ➜  Downloads pushd parent

# 這邊我們可以看到「~/Downloads/parent」被推入了堆疊區
~/Downloads/parent ~/Downloads

popd

刪除堆疊中的目錄後再切換到刪除的目錄。

(base) ➜  parent popd

# 這邊我們可以看到堆疊剩下最原本的目錄, 並且位置也進行了切換
~/Downloads
(base) ➜ Downloads

與cd cd cd …進行對比

我們就來舉一個例子來對比一下cd與pushd、popd的差異, 假設我們一樣有一的任務, 這個任務希望切換到指定目錄後進行git checkout後, 再回到原本目錄, 那麼兩種作法大致上如下:

首先以cd至目錄來說, 為了讓我們避免迷路, 我們會用標記的方式先記載當前位置, 一旦迷路還能夠跳回原點。

#!/bin/bash
# 為了避免迷路我們需要標記一下當前位置, 待事情完成後跳回
cur=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
cd prj
echo "git checkout ."
cd ${cur}

看到這邊, 不知道大家有沒有發現一個問題, 假設我們很常有cd來cd去之前, 是不是都得先多一個變數來標記呢? 這顯得有點冗餘, 故而我們可以這樣做…。

pushd prj
echo "git checkout ."
popd

讓pushd與popd成雙成對包住執行工作區, 如此一來讓我們在閱讀腳本時可以更加簡潔, 避免多餘的腳本變數宣告。

結語

雖然pushd、popd這類的指令在我們一般使用上比較少用到, 但以軟體開發的角度來開發腳時就會非常有用, 可以協助我們清楚的將目錄切換執行工作區塊標記出來, 也在完成工作時跳回原目錄, 就如同電影場景的時間暫停一般, 當時間恢復時, 一切既如往常, 但事實上我們看不到的背後已經完成重要的工作。

分享至
成為作者繼續創作的動力吧!
主軸圍繞於軟體科技, 除了過往經驗成章以外也持續學習新技能, 並將學習心法記錄與分享, 以期幫助相同道路之夥伴。 裡面包含著各種程式語言的疑難雜症解題技巧, 也提供資料庫、AI、認證與授權、工具庫...等技巧, 讓您自由找出您想要的解答, 如果您想要系統化的教學課程也歡迎至「🔒 阿Han的軟體心法實戰營」。
© 2024 vocus All rights reserved.