このコマンドを入力すると、プロンプトが私のディレクトリに変わるのはなぜですか?
PS1='$(pwd)'
私は補間がないことを意味する一重引用符を使用します。つまりecho '$(pwd)'
--→$(pwd)
また、これがうまくいく理由を明確にすると仮定すると、なぜ動作が異なりますかPS1=$(pwd)
? (引用は全くありません)
つまり、引用符を使用すると、端末をブラウズするときにプロンプトが現在のディレクトリに変わり続けます。ただし、引用符を使用しない場合、プロンプトは常にコマンドを最初に入力したときにあったディレクトリに残ります。PS1=$(pwd)
なぜ?
答え1
単に変数に値を割り当てると、$(...)
一重引用符で囲まれていないか、バックスラッシュでエスケープされない限り、式が評価されます。理解するには、次の2つを比較してください。
A=$(pwd)
echo "$A"
B='$(pwd)'
echo "$B"
値はA
すぐに文字列になります/home/yourusername
。明らかに、この文字列がどこから来たのか覚えておらず、ディレクトリを変更しても同じままです。ただし、値はB
リテラル文字列になり、$(pwd)
解釈されません。
これでPS1
特別なことが起こります。プロンプトが印刷されるたびに、いくつかの特別な構成が解釈されます。たとえば、コマンドの置き換えは、上記の変数割り当て$(...)
に対して行われたのと同じ方法で行われますA
。明らかに、PS1
ホームディレクトリのリテラル文字列(上記のようなA
)を含めると変更できません。ただし、文字列$(pwd)
(上記と同じB
)が含まれている場合は、プロンプトが印刷されるたびに評価され、実際のディレクトリが表示されます。
答え2
Bashとzshでは、値はPS1
プロンプトとして使用されず、やや拡張されます。両方のシェルの規則は異なりますが、どちらの場合も、ステップの1つは一般的なシェル構文(、、、、、、)です。値)。$VARIABLE
${VARIABLE}
$(COMMAND)
`COMMAND`
$((EXPRESSION))
$[EXPRESSION]
- Bashでは、ドル拡張はデフォルトでオンになっていますが、次のコマンドを使用してオフにすることができます。
shopt -u promptvars
。 - zshでは、ドル拡張はデフォルトでオフになっていますが、多くの人(そしてWeb上で見つけたほとんどの構成フレームワーク)はそれをオンにします。
setopt prompt_subst
。
プロンプトでドル拡張がオンになっている場合は、6文字の値にPS1='$(pwd)'
設定して、シェルが新しいプロンプトを表示するたびにコマンドを実行するようにします。一方、当時はシェルの現在の作業ディレクトリに設定されています。 USD拡張をオフにすると、プロンプトがリテラル文字列になります。PS1
$(pwd)
$(pwd)
pwd
PS1=$(pwd)
PS1
PS1='$(pwd)'
$(pwd)
プロンプトから作業ディレクトリをインポートするより便利な方法があります。
- バッシュでは、以下を使用してください。バックスラッシュエスケープたとえば
\w
、ホームディレクトリをに短縮し、~
設定で整理できますPROMPT_DIRTRIM
。 - zsh では、次を使用します。脱出率例えば
%/
または%~
(、短縮型ホームディレクトリ%/
と同じ)整理設定ができます。$PWD
%~
- 2つのシェル(および他のBourneスタイルのシェル)に
$PWD
対応するものは次のとおりです$(pwd)
。現在、作業ディレクトリをインポートするために子プロセスを実行する必要はありません。
答え3
引用符がない場合は、PS1の設定時に$(pwd)が評価されます。引用符を使用すると、プロンプトが表示されるまで$(pwd)評価が延期されます。
引用符がない場合は、PS1を設定するとPS1が現在のディレクトリに設定されます。 PS1は一重引用符を使用して$(pwd)に設定されます。これは、プロンプトが表示されるたびに現在のディレクトリを評価して印刷することを意味します。