環境變數前\的意義

環境變數前\的意義

在舊 Solaris 機器上的 ksh 中,我使用了:

export PS1="$PWD $"

將提示符號設定為目前目錄。它工作得很好,直到你在其他地方 cd ,然後你會發現它並不是每次都評估 PWD 。我注意到它是透過像這樣設定 PS1 來修復的:

export PS1="\$PWD $"

只是好奇它叫什麼,它是如何工作的,其他應用程式等等。

答案1

一些文件將有助於解釋這一點。

來自shell 的 POSIX 標準文檔:

以下變數將影響 shell 的執行:
PS1:每次互動式 shell 準備好讀取命令時,該變數的值將進行參數擴展並寫入標準錯誤。
...
單引號
將字元括在單引號中應保留單引號內每個字元的字面值。
……
雙引號
用雙引號括起來的字元應保留雙引號內所有字元的字面值,$ 除外
:美元符號應保留其引入參數擴展的特殊含義
...
轉義字元(反斜線)
未加引號的反斜線應保留後續字元的字面值。

因此 的值PS1受參數擴展的影響,這就是您想要的,因此$PWD每次收到提示時都會對其進行評估。這意味著$PWD的值中需要有一個實際的字串PS1。但,

PS1="$PWD $ "

將把值PWD 運行賦值語句時進入PS1PS1會是這樣的/home/poldie $,之後就永遠不會改變。你不要這樣。

PS1="\$PWD $ "

反斜杠將引用$,以便PS1包含文字字串$PWD $。你要這個。

PS1='$PWD $ '

也會做同樣的事情。當參數被單引號括起來時,參數不會被擴展。

(注意:我最初將所有這些作為export語句,因為 OP 選擇將它們寫為export語句。@Kusalananda 刪除了它們。我不確定為什麼。如果您想要子 shell(例如由:shvi 中的命令)以保留您的自定義提示符號。

答案2

\字元對後面的(特殊)字元進行轉義。在這種情況下,它轉義了$我們通常用來取消引用變數的 。當 shell 計算變數賦值時,它會先擴展表達式的右側。如果沒有\before $PWD,shell 會擴展$PWD並將結果指派給PS1.

但是,對於\,shell 將其$PWD視為文字字串,並將其按原樣分配給PS1,以便PS1包含字串$PWD,而不是變數 的擴展值$PWD。當shell即將顯示提示符號時,它再次進行變數擴展,而這一次,因為$PS1contains $PWD,沒有\,shell 成功將其擴展到目前目錄。

可以使用相同的方法在 shell 腳本中建立動態變​​數名稱(NetBSDrcNG系統非常廣泛地使用此方法,特別是在控製網路介面的腳本中,其中NetBSD 和FreeBSD 中網路適配器指定的數量使得為每個適配器明確編碼變得不切實際)。

相關內容