
光碟~
做同樣的事情
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
~
後跟的使用者名稱擴展到該使用者的主目錄。