「cd -」和「cd ~-」之間的區別

「cd -」和「cd ~-」之間的區別

Bash 指令

cd - 

列印先前使用的目錄並對其進行更改。

另一方面,Bash 命令

cd ~-

直接更改到先前使用的目錄,而不回顯任何內容。

這是唯一的差別嗎?每個命令的用例是什麼?

答案1

這裡有兩件事在起作用。首先,-單獨將其擴展到您先前的目錄。這在(強調我的)cd部分中進行了解釋:man bash

-在嘗試更改目錄之前, 參數會轉換為 $OLDPWD。如果使用 CDPATH 中的非空目錄名,或者 if-是第一個參數,且目錄變更成功,則新工作目錄的絕對路徑名將寫入標準輸出。 如果目錄變更成功,則傳回值為true;否則為假。

因此,一個簡單的操作cd -會將您移回先前的目錄並列印該目錄的名稱。另一個命令記錄在「波浪線擴展」部分:

如果波浪號前綴是 a ~+,則 shell 變數 PWD 的值將取代波浪號前綴。如果波形符前綴為 a ~-,則將取代 shell 變數 OLDPWD 的值(如果已設定)。如果波浪號前綴中波浪號後面的字元由數字 N 組成,可選地以 a +或 a為前綴-,則波浪號前綴將替換為目錄堆疊中的相應元素,因為它將由調用的 dirs 內建函數顯示波形符前綴作為參數。如果波浪號前綴中波浪號後面的字元由不帶前導的數字組成,+則假定為 , 。-+

透過一個例子可能會更容易理解:

$ pwd
/home/terdon
$ cd ~/foo
$ pwd
/home/terdon/foo
$ cd /etc
$ pwd
/etc
$ echo ~        ## prints $HOME
/home/terdon
$ echo ~+       ## prints $PWD
/etc
$ echo ~-       ## prints $OLDPWD
/home/terdon/foo

所以,一般來說,-意思是「上一個目錄」。這就是為什麼cd -它本身會把你帶回原來的地方。

主要區別是cd -特定於cd內建的。如果你嘗試echo -它只會打印一個-.它~-是波形符擴展功能的一部分,其行為與變數類似。這就是為什麼你可以echo ~-得到一些有意義的東西。您也可以在其中使用它,cd ~-但也可以在任何其他命令中使用它。例如,cp ~-/* .這相當於cp "$OLDPWD"/* .

答案2

~-受波形符擴充影響(參見 man bash),所以cd看到的就是直接之前的目錄名稱。-不被 shell 擴展,cd直接看到它,並且行為如文檔所示:

- 參數相當於 $OLDPWD。如果使用 CDPATH 中的非空目錄名,或者如果 - 是第一個參數,並且目錄變更成功,則新工作目錄的絕對路徑名將寫入標準輸出。

答案3

TL;DR:cd -內建於cd~-是 的後續擴展~[name],而不是特定於cd

POSIX.1-2008 殼牌與公用事業定義cd -為一種特殊情況,即具體的為了cd命令:

當 a-用作操作數時,這相當於命令:

cd "$OLDPWD" && pwd

它會變更為先前的工作目錄,然後寫入其名稱。

擴展~-名將擴展到$OLDPWD任何命令執行之前,並且可以作為任何命令的參數傳遞,而不僅僅是cd.這是後來的擴展

上述 POSIX.1-2008 Shell & Utilities 標準也有波浪號擴充的詳細解釋。該措辭非常具體,以允許~-標準範圍內的未定義行為,其中~[name]$HOME如果[name]是空字串,或者name如果name是有效的用戶名,則指用戶的主目錄。

相關內容