
在舊 Solaris 機器上的 ksh 中,我使用了:
export PS1="$PWD $"
將提示符號設定為目前目錄。它工作得很好,直到你在其他地方 cd ,然後你會發現它並不是每次都評估 PWD 。我注意到它是透過像這樣設定 PS1 來修復的:
export PS1="\$PWD $"
只是好奇它叫什麼,它是如何工作的,其他應用程式等等。
答案1
一些文件將有助於解釋這一點。
以下變數將影響 shell 的執行:
PS1:每次互動式 shell 準備好讀取命令時,該變數的值將進行參數擴展並寫入標準錯誤。
...
單引號
將字元括在單引號中應保留單引號內每個字元的字面值。
……
雙引號
用雙引號括起來的字元應保留雙引號內所有字元的字面值,$ 除外
:美元符號應保留其引入參數擴展的特殊含義
...
轉義字元(反斜線)
未加引號的反斜線應保留後續字元的字面值。
因此 的值PS1
受參數擴展的影響,這就是您想要的,因此$PWD
每次收到提示時都會對其進行評估。這意味著$PWD
的值中需要有一個實際的字串PS1
。但,
PS1="$PWD $ "
將把值PWD
運行賦值語句時進入PS1
。PS1
會是這樣的/home/poldie $
,之後就永遠不會改變。你不要這樣。
PS1="\$PWD $ "
反斜杠將引用$
,以便PS1
包含文字字串$PWD $
。你要這個。
PS1='$PWD $ '
也會做同樣的事情。當參數被單引號括起來時,參數不會被擴展。
(注意:我最初將所有這些作為export
語句,因為 OP 選擇將它們寫為export
語句。@Kusalananda 刪除了它們。我不確定為什麼。如果您想要子 shell(例如由:sh
vi 中的命令)以保留您的自定義提示符號。
答案2
該\
字元對後面的(特殊)字元進行轉義。在這種情況下,它轉義了$
我們通常用來取消引用變數的 。當 shell 計算變數賦值時,它會先擴展表達式的右側。如果沒有\
before $PWD
,shell 會擴展$PWD
並將結果指派給PS1
.
但是,對於\
,shell 將其$PWD
視為文字字串,並將其按原樣分配給PS1
,以便PS1
包含字串$PWD
,而不是變數 的擴展值$PWD
。當shell即將顯示提示符號時,它再次進行變數擴展,而這一次,因為$PS1
contains $PWD
,沒有\
,shell 成功將其擴展到目前目錄。
可以使用相同的方法在 shell 腳本中建立動態變數名稱(NetBSDrcNG
系統非常廣泛地使用此方法,特別是在控製網路介面的腳本中,其中NetBSD 和FreeBSD 中網路適配器指定的數量使得為每個適配器明確編碼變得不切實際)。