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

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

留言
avatar-img
留言分享你的想法!
avatar-img
阿Han的沙龍
139會員
303內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
阿Han的沙龍的其他內容
2024/12/04
當我們在Ubuntu下載 cursor 這套編輯工具並進行以下步驟安裝時: sudo apt-get install libfuse2 chmod +x cursor-0.42.5x86_64.AppImage ./cursor-0.42.4x86_64.AppImage sudo mv
Thumbnail
2024/12/04
當我們在Ubuntu下載 cursor 這套編輯工具並進行以下步驟安裝時: sudo apt-get install libfuse2 chmod +x cursor-0.42.5x86_64.AppImage ./cursor-0.42.4x86_64.AppImage sudo mv
Thumbnail
2024/06/25
咦! 怎麼啟動個docker compose up -d就出現了可疑的訊息: +] Running 2/2d orphan containers ([xxxx]) for this project. If you removed or renamed this service in your
Thumbnail
2024/06/25
咦! 怎麼啟動個docker compose up -d就出現了可疑的訊息: +] Running 2/2d orphan containers ([xxxx]) for this project. If you removed or renamed this service in your
Thumbnail
2023/12/19
情境描述 小明身為Linux系統工程師, 目前接到一個緊急任務, 需要在客戶端確保csv表的某個欄位的值不能重複, 對於軟體工程師來說只要寫個程式就能夠解決, 但客戶端並沒有相關的程式語言啊! 這時候只能夠使用現成的工具來完成,而經驗老道的我們很快就想到了解決方法, 不要急, 就讓我們一步
Thumbnail
2023/12/19
情境描述 小明身為Linux系統工程師, 目前接到一個緊急任務, 需要在客戶端確保csv表的某個欄位的值不能重複, 對於軟體工程師來說只要寫個程式就能夠解決, 但客戶端並沒有相關的程式語言啊! 這時候只能夠使用現成的工具來完成,而經驗老道的我們很快就想到了解決方法, 不要急, 就讓我們一步
Thumbnail
看更多
你可能也想看
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
在先前的文章中說明了Linux大致上的安裝流程,整個過程只要依照畫面的指示設定,都可以安裝成功。其中可能比較困難在於硬碟空間的分配,這對於許多新手來說也是一個難點,也是這篇所要說的重點。
Thumbnail
在先前的文章中說明了Linux大致上的安裝流程,整個過程只要依照畫面的指示設定,都可以安裝成功。其中可能比較困難在於硬碟空間的分配,這對於許多新手來說也是一個難點,也是這篇所要說的重點。
Thumbnail
路徑處理 basename(string [.string]):回傳第一個參數路徑字串的檔案名稱,包含副檔案,如果有第二個參數字串,就會在檔案名稱刪除此字串,例如:刪除副檔名".php"。 dirname(string):回傳參數路徑字串中的路徑。 realpath(string):回傳參數路
Thumbnail
路徑處理 basename(string [.string]):回傳第一個參數路徑字串的檔案名稱,包含副檔案,如果有第二個參數字串,就會在檔案名稱刪除此字串,例如:刪除副檔名".php"。 dirname(string):回傳參數路徑字串中的路徑。 realpath(string):回傳參數路
Thumbnail
Linux的軟體安裝流程大致上與其他系統並沒有太大的區別,僅此在於安裝的方式會比較多元。但也因為這樣,常會讓新手感到很混亂,不知道要下手。所以本篇就來說說如何在Linux上安裝軟體。
Thumbnail
Linux的軟體安裝流程大致上與其他系統並沒有太大的區別,僅此在於安裝的方式會比較多元。但也因為這樣,常會讓新手感到很混亂,不知道要下手。所以本篇就來說說如何在Linux上安裝軟體。
Thumbnail
接續上一篇文章,本文再深入一點關於ETCD基本操作以及在其他文章中關於ETCD節點資料不一致情況的除錯內容分享
Thumbnail
接續上一篇文章,本文再深入一點關於ETCD基本操作以及在其他文章中關於ETCD節點資料不一致情況的除錯內容分享
Thumbnail
我們偶爾在Linux的Bash腳本都會看到「pushd …」、「popd」的影子, 一開始看到也覺得這是什麼碗粿…, 這樣很難讀耶, 但指令被發明出來一定是有它存在的意義與道理的, 我們不能因為未知就直覺的認為該指令毫無作用, 而是要在正確的情境之下去使用。 pushd與popd我們就理解
Thumbnail
我們偶爾在Linux的Bash腳本都會看到「pushd …」、「popd」的影子, 一開始看到也覺得這是什麼碗粿…, 這樣很難讀耶, 但指令被發明出來一定是有它存在的意義與道理的, 我們不能因為未知就直覺的認為該指令毫無作用, 而是要在正確的情境之下去使用。 pushd與popd我們就理解
Thumbnail
👨‍💻 簡介 今天快速介紹一下對檔案的操作所使用的package os,包括檔案和資料夾操作等。 檔案和資料夾操作 os package 可以執行各種檔案和資料夾操作,如建立、讀取、寫入、刪除檔案,以及取得資料夾內容等。
Thumbnail
👨‍💻 簡介 今天快速介紹一下對檔案的操作所使用的package os,包括檔案和資料夾操作等。 檔案和資料夾操作 os package 可以執行各種檔案和資料夾操作,如建立、讀取、寫入、刪除檔案,以及取得資料夾內容等。
Thumbnail
本文教你如何運用終端機指令來操作你的電腦,包括Mac和Windows用法。包括指令如pwd, ls, cd, mkdir, touch, rm, rmdir, cp, mv。另外,還附有相關的影片教學和額外資源教學。
Thumbnail
本文教你如何運用終端機指令來操作你的電腦,包括Mac和Windows用法。包括指令如pwd, ls, cd, mkdir, touch, rm, rmdir, cp, mv。另外,還附有相關的影片教學和額外資源教學。
Thumbnail
sed 指令 ( 取代 , 截取行 ) 删除文件第一行: sed -i ‘1d’ filename 删除文件最后一行: sed -i ‘$d’ fileName 刪除首行空白 sed ‘s/^[ \t]*//g’ 參考 : https://codertw.com/前端開發/393321/ 在檔案最後
Thumbnail
sed 指令 ( 取代 , 截取行 ) 删除文件第一行: sed -i ‘1d’ filename 删除文件最后一行: sed -i ‘$d’ fileName 刪除首行空白 sed ‘s/^[ \t]*//g’ 參考 : https://codertw.com/前端開發/393321/ 在檔案最後
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News