環境変数の前の\の意味

環境変数の前の\の意味

以前の Solaris システムの ksh では、以下を使用しました。

export PS1="$PWD $"

プロンプトを現在のディレクトリに設定します。他の場所でCDを使用するまではうまくいきますが、毎回PWDを評価しないことがわかります。 PS1を次のように設定すると、問題が解決したことがわかりました。

export PS1="\$PWD $"

名前が何であるか、どのように機能するか、他のアプリケーションなどが気になります。 (これはGoogleが難しいことの1つです。)

答え1

一部の文書はこれを説明するのに役立ちます。

~からシェル用POSIX標準ドキュメント:

次の変数はシェルの実行に影響します。
PS1:対話型シェルがコマンドを読み取る準備ができたときはいつでも、この変数の値はパラメータ拡張され、標準エラーに書き込まれます。
...
一重引用符
一重引用符で囲まれた文字は、一重引用符内の各文字のリテラル値を保持する必要があります。
...
二重引用符
二重引用符で囲まれた文字は、$を除いて二重引用符内のすべての文字のリテラル値を保持する必要があります。
ドル記号はパラメータ拡張を導入するための特別な意味を維持する必要があります
...
エスケープ文字(バックスラッシュ)
は追加されません。引用符付きバックスラッシュは、次の文字のリテラル値を保持する必要があります。

So値はPS1目的のパラメータ拡張に依存するため、プロンプトが表示さ$PWDれるたびに評価されます。これは$PWD、値に実際の文字列が含まれていることを意味しますPS1。しかし、

PS1="$PWD $ "

価値を置きますPWD 割り当て文を実行するとき入力するPS1PS1これからもそうだろうし決して/home/poldie $変わらないだろう。あなたはこれをしたくありません。

PS1="\$PWD $ "

バックスラッシュはリテラル文字列を含める$ために引用されています。あなたはこれが欲しいです。PS1$PWD $

PS1='$PWD $ '

同じことをします。パラメータを一重引用符で囲んでも拡張されません。

export(注:OPがステートメントとして作成することを選択したので、もともとこれをすべてステートメントとして作成しました。@Kusalanandaはこれをexport削除しました。理由はわかりません。:sh保存するプロンプトを定義します。)

答え2

この\文字は次の(特殊)文字をエスケープします。この場合、$変数を逆参照するために通常使用することをエスケープします。シェルが変数の割り当てを評価するときは、まず式の右側を展開します。\beforeがない場合、$PWDシェルは展開され、$PWD結果がに割り当てられますPS1

ただし、\シェルはそれを$PWDリテラル文字列として扱っているままに割り当てるため、PS1変数の拡張値ではなくPS1文字列が含まれます。シェルがプロンプトを表示しようとしたときに変数拡張を再実行し、今回は$PWD$PWD$PS1$PWDいいえ\、シェルはそれを現在のディレクトリに正常に拡張します。

同じ方法を使用してシェルスクリプトで動的変数名を作成できます(NetBSDrcNGシステムはこの方法を非常に広く使用しています。)に明示的に指定されています。

関連情報