~ 是 $HOME,但有時呢?

~ 是 $HOME,但有時呢?

光碟~

做同樣的事情

cd $HOME

這也與

cd /home/tandu

然而,

cd ~not-tandu

更改為/home/not-tandu

這純粹是文法選擇嗎?核心(或cd可執行檔)如何處理這個問題~?也就是說,~/~換到同一個目錄下,只不過~a是上一個目錄。對於您更改到的任何其他目錄,情況並非如此。

答案1

~$HOME是許多 shell 提供的別名,但$HOME更通用。 $HOME實際上要求 shell 在此處插入(替換)環境變數 HOME。有很多不同的環境變數可以替換,嘗試運行env一個列表。請注意,~當它不在單字開頭時,並不總是能被識別。嘗試這兩個命令進行比較:

ls /~
ls /$HOME

第一個被傳遞給 ls 可執行文件,/~然後嘗試查看~根目錄中調用的文件,第二個擴展$HOME並成為//home/user,然後作為命令列參數傳遞給 ls 可執行文件。所有 POSIX 系統(POSIX 是 UNIX 和 Linux 系統操作方式的標準)都允許將多個斜杠視為與一個斜杠相同,因此//home/user與以下內容相同/home/user~username是告訴 shell 在 passwd 檔案中尋找使用者名稱並傳回其主目錄的捷徑。沒有等效的環境變數。所有這些替換都是由 shell 完成的,並且大多數 shell 都支持,但只有像這樣的環境變數$HOME才能保證所有 shell 都支援。另外,cd實際上是一個內建指令。這是一個特別的指令,告訴 shell 本身更改目錄。它不像其他 shell 內建程式那樣可以作為單獨的可執行檔實現echo,因為它用於更改 shell 進程的基本屬性。 echo只是出於性能原因而內建的 shell,但在 UNIX 的美好時光中,只能作為自己的可執行檔使用/bin/echo

答案2

~foo表示「使用者 foo 的主目錄」。

這不是由內核完成的,而是由 shell 解釋的。每當 shell 看到~foo參數時,它都會透明地將其替換為使用者的主目錄foo,並將其傳遞到其位置。因此,當您運行時cd ~tandu,shell 實際上正在運行cd /home/tandu

答案3

~後跟的使用者名稱擴展到該使用者的主目錄。

相關內容