‘cd’ 和 ‘cd ~’ 的區別
我想知道,如果cd單獨將我發送到我的主文件夾並且**cd ~**做同樣的事情,那麼為什麼首先添加 ~ 呢?
它是特定於 BASH 的,還是它們在另一個 Shell 中的行為會有所不同?
~
可以用於更多。任何命令都可以從主文件夾的快捷方式中受益。因此,如果您想 cd 進入您的家,則沒有必要,但是呢~/.config
?$ cd ~/.config
否則,您必須寫出主路徑、使用
$HOME
var 或執行兩個cd
s。也用於復製或移動文件:$ 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
已在此問題中得到解答:曾幾何時,波浪字元與HOME
Lear-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 ~
為什麼首先添加〜呢?
我會說方便和歷史原因,如有關波浪號的連結答案中所解釋的那樣。最終,它變得不僅僅是主目錄擴展。