Bash

‘cd -’ 和 ‘cd ~-’ 的區別

  • June 27, 2019

Bash 命令

cd - 

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

另一方面,Bash 命令

cd ~-

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

這是唯一的區別嗎?每個命令的案例是什麼?

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

在嘗試更改目錄之前,參數 of-將轉換為 $OLDPWD。 如果使用 CDPATH 中的非空目錄名,或者如果-是第一個參數,並且目錄更改成功,則將新工作目錄的絕對路徑名寫入標準輸出。 如果目錄更改成功,則返回值為 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"/* .

引用自:https://unix.stackexchange.com/questions/330876