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

2023/11/08閱讀時間約 3 分鐘
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這類的指令在我們一般使用上比較少用到, 但以軟體開發的角度來開發腳時就會非常有用, 可以協助我們清楚的將目錄切換執行工作區塊標記出來, 也在完成工作時跳回原目錄, 就如同電影場景的時間暫停一般, 當時間恢復時, 一切既如往常, 但事實上我們看不到的背後已經完成重要的工作。

91會員
260內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言0
查看全部
發表第一個留言支持創作者!