Cd-Command

‘cd’ 和 ‘cd ~’ 的區別

  • November 3, 2017

我想知道,如果cd單獨將我發送到我的主文件夾並且**cd ~**做同樣的事情,那麼為什麼首先添加 ~ 呢?

它是特定於 BASH 的,還是它們在另一個 Shell 中的行為會有所不同?

~可以用於更多。任何命令都可以從主文件夾的快捷方式中受益。因此,如果您想 cd 進入您的家,則沒有必要,但是呢~/.config

$ cd ~/.config

否則,您必須寫出主路徑、使用$HOMEvar 或執行兩個cds。也用於復製或移動文件:

$ cp ~/downloads/some-file some/path/

由於您的大部分文件都在家裡,所以有一個快捷方式總是好的。

執行cd 基本上是cd不帶參數呼叫,並根據cd行為“…如果未提供 dir,則 HOME shell 變數的值是預設值。” (來自bash 手冊)。相比之下,cd ~當您向cd命令提供參數時,恰好是~並且 shell 將執行波浪號擴展。至於回到使用者的主目錄 - 沒有區別。無論哪種情況,HOME都會查詢環境變數:

$ env 'HOME=/usr' bash -c 'cd;pwd; cd ~;pwd'                                      
/usr
/usr

實際上,這也與cd $HOME. 然而,雖然cd只會做一件事,但波浪號可用於執行其他擴展,例如~+目前工作目錄。

然而,有趣的是,我們可以unset HOME打破cd~仍然可以工作:

$ bash -c 'cd /usr;unset HOME;cd;pwd;cd ~;pwd'                                    
bash: line 0: cd: HOME not set
/usr
/home/xieerqi

為什麼 ?再次,在手冊中回答:

如果 HOME 未設置,則替換執行 shell 的使用者的主目錄。否則,波浪號前綴將替換為與指定登錄名關聯的主目錄。

請注意,取消設置與製作空變數不同HOME=並且確實有效。文件專門討論了取消設置變數。使變數等於空字元串的效果與我們預期的相反:

bash-4.3$ env 'HOME=' bash -c 'cd /usr;set|grep "^HOME"; stat -c "%F" ~;cd;pwd'
HOME=
stat: cannot stat '': No such file or directory
/usr

在這裡,您可以看到製作HOME空字元串會破壞波浪號和cd行為。


代字號和$HOME有一定的區別和不同的存在理由。$HOME是一個 shell 變數,它也恰好是環境變數之一——它適用於所有程序;在 C 中,您將使用它environ()來訪問它。相比之下,tilde執行波浪號擴展的是特定於 shell 的語法,儘管您也可以使用wordexp()函式在 C 中執行類似 shell 的擴展(參考)。

~代表的原因HOME已在此問題中得到解答:曾幾何時,波浪字元與HOMELear-Siegler ADM-3A 終端上的共享密鑰相同。HOME相比之下,環境變數具有純粹的象徵意義,沒有物理表示。

此外,HOME作為環境變數的事實允許我們取消設置它,因為我們無法~通過簡單的方式設置其他內容。

# cd ~ will still work, because ~ is blank, so it's same as just cd
$ bash -c 'unset HOME; echo $HOME; cd ~;pwd'                           

/home/xieerqi
$ env 'HOME=' bash -c 'echo $HOME; cd ~;pwd'                                

/home/xieerqi

請注意首先輸出未設置變數的空白行echo,以及 . 相比之下,我們不能對波浪號做這樣的事情:

$ bash -c '~=; cd ~;pwd'                                                    
bash: ~=: command not found
/home/xieerqi
$ bash -c '~=$'\0'; cd ~;pwd'                                               
bash: ~=bash: command not found
/home/xieerqi
$ bash -c 'unset ~; cd ~;pwd'                                               
bash: line 0: unset: `/home/xieerqi': not a valid identifier
/home/xieerqi

但是,更改HOME確實會影響~

$ env 'HOME=' bash -c 'echo $HOME; stat ~;'                                 

stat: cannot stat '': No such file or directory

此外,因為~也可以作為擴展字元,我們可以這樣做來顯示目前工作目錄:

$ bash -c 'cd /etc/;stat -c "%n" ~+'                                        
/etc

而如果我們想通過環境變數來做到這一點,我們需要PWD,並且HOME保持不變,或者如果你做類似的事情echo $HOME+- 那隻是字元串/變數連接。但同樣,~+從環境變數中獲取資訊:

$ bash -c 'cd /etc/;PWD="/usr";stat -c "%n" ~+'                             
/usr

注意~+and~-擴展適用於ksh,但不適用於dash.


要回答您的一些具體問題:

它是特定於 BASH 的,還是它們在另一個 Shell 中的行為會有所不同?

不,這應該是一致的行為。ksh, dash, and - 與or的csh行為相同。cd``cd ~

為什麼首先添加〜呢?

我會說方便和歷史原因,如有關波浪號的連結答案中所解釋的那樣。最終,它變得不僅僅是主目錄擴展。

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