farmer-logo.gif (14959 bytes) cshell-logo.gif (19625 bytes)
ch-3.gif (10141 bytes)
main-b.gif (271 bytes)
 

 

3-8-13 pushd [ +n | dir ]、popd [ +n ] 指令

這兩個內建指令在使用上有很大的關連性,所以我們放在一起為你說明。當你必須在幾個固定的目錄來回地操作時,你便可以用得上這些改善你使用效率的貼心的內建指令。以下讓我們來看一個實際的例子:

例子一

% cd ~/project/project-a (改變工作目錄)
... (修改或編輯一些檔案,此部份省略)
% cd /usr/etc/local/bin (改變工作目錄)
... (修改或編輯一些檔案,此部份省略)
% cd ~/project/project-a (改變工作目錄)
... (修改或編輯一些檔案,此部份省略)
% cd /usr/etc/local/bin (改變工作目錄)
... (修改或編輯一些檔案,此部份省略)

在上面的例子中我們可以很清楚的看到使用者為了短暫的工作型態需要,必須到三個不同目錄下去修改一些檔案,而且可能會重複多次。而上面用的是 cd 指令來更改工作目錄,這事實上是相當累人的沒有效率的。 C shell 特別為了這種情況開發了三個內建指令,也就是 popd、pushd 及 suspend。

這三個指令的使用概念是為你建立一個目錄堆疊(directory stack),用來供你放置必須常去的工作目錄,以便讓你的更改工作目錄更加方便及有效率。讓我們先來看看以下各個指令使用時所產生的目錄堆疊的資料變化情況:

1 % pwd
/home1/akira/project/project-a
2 % pushd ../project-b
~/project/project-b ~/project/project-a (directory stack的內容)
3 % pwd
/home1/akira/project/project-b
4 % pushd /etc
/etc ~/project/project-b ~/project/project-a

由上例中在事件 1,工作目錄是在 /home1/akira/project/project-a ,我們請讀者注意到事件 2 也就是內建指令 pushd;它不但兼具cd指令的作用,同時也會將你所鍵入的目錄放入暫存器中,所以當你如事件 2 的方式執行後,所顯示出的訊息便是已被放入暫存器中的目錄,而第一個目錄是現在的工作目錄,其他的目錄在出現的次序上也請加以注意。接下來讓我們用 pushd 指令來重新做一次例子一,看看有什麼效率上的改變。

% cd ~/project/project-a (改變工作目錄)
... (修改或編輯一些檔案,此部份省略)
% pushd /usr/etc/local/bin (改變工作目錄)
/usr/etc/local/bin ~/project/project-a
... (修改或編輯一些檔案,此部份省略)
% pushd (改變工作目錄)
~/project/project-a /usr/etc/local/bin
...
% pushd (改變工作目錄)
/usr/etc/local/bin ~/project/project-a
... (修改或編輯一些檔案,此部份省略)

是不是簡單、省事多了呢?對了還記不記得我們提過的內建指令 dirs,它可以為你顯示目錄堆疊(directory stack)的內容,所以當你放很多目錄在目錄堆疊中時,想要知道目錄堆疊的內容就可以用的上。讓我們來看看下面的例子,順便為你介紹另一個 C Shell 內建指令 popd。

1 % cd ~/project/project-b
...
8 % pushd /usr/etc/local
/usr/etc/local ~/project/project-b
...
19 % pushd /bin
/bin /usr/etc/local ~/project/project-b
...
35 % pushd /etc
/etc /bin /usr/etc/local ~/project/project-b
...
43 % pushd +2
/usr/etc/local ~/project/project-b /etc /bin
...
59 % dirs
/usr/etc/local ~/project/project-b /etc /bin
60 % popd +1
/usr/etc/local /etc /bin
61 % popd
/etc /bin
62 % pwd
/etc

在事件 43 中 “ +2 ” 所代表的是目錄堆疊中的第三個目錄,pushd 指令在不加上任何引數時,所代表的便是目錄堆疊中的第一個目錄。內建指令 popd 的功能就如同事件 60 及 61 所顯示出來的,就是將目錄堆疊中的的某個目錄去除掉。事件 60 是除掉目錄堆疊中的第二個目錄;事件 61 是除去目錄堆疊中的第一項資料。但是請注意!當你如事件 61 去除掉第一個目錄堆疊的內容時,你的工作目錄也會自動改變到目錄堆疊中的第二個目錄,因為這時它已經變成目錄堆疊的第一項了。關於這一點,你可以從事件 61 及 62 看出來。

相信以上的例子中你可能會發覺,當你放入目錄堆疊中的目錄在兩個的情況下,這項功能還稱得上非常好用;但是一但目錄堆疊的內容多了,恐怕就不是人人都能用得順心如意的了。對於這種情況,建議你不妨採用設定 cdpath 變數的方式會來的好些。

某些舊版的 UNIX 作業系統的 directory stack 對於 symbol link 的功能會產生一個小小的 bug,由於這個 bug 會對內建指令 pushd 及 popd 的使用會有影響,使用上應注意到此點,關於這一點 bug 稍後我們會在變數 hardpaths 中還為你說明。


mail.gif (2925 bytes)

b-line.gif (2092 bytes)