PS1 = '$(pwd)'これがうまくいくのはなぜですか?これがPS1 = $(pwd)と異なるのはなぜですか?

PS1 = '$(pwd)'これがうまくいくのはなぜですか?これがPS1 = $(pwd)と異なるのはなぜですか?

このコマンドを入力すると、プロンプトが私のディレクトリに変わるのはなぜですか?

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)pwdPS1=$(pwd)PS1PS1='$(pwd)'$(pwd)

プロンプトから作業ディレクトリをインポートするより便利な方法があります。

  • バッシュでは、以下を使用してください。バックスラッシュエスケープたとえば\w、ホームディレクトリをに短縮し、~設定で整理できますPROMPT_DIRTRIM
  • zsh では、次を使用します。脱出率例えば%/または%~(、短縮型ホームディレクトリ%/と同じ)整理設定ができます。$PWD%~
  • 2つのシェル(および他のBourneスタイルのシェル)に$PWD対応するものは次のとおりです$(pwd)。現在、作業ディレクトリをインポートするために子プロセスを実行する必要はありません。

答え3

引用符がない場合は、PS1の設定時に$(pwd)が評価されます。引用符を使用すると、プロンプトが表示されるまで$(pwd)評価が延期されます。

引用符がない場合は、PS1を設定するとPS1が現在のディレクトリに設定されます。 PS1は一重引用符を使用して$(pwd)に設定されます。これは、プロンプトが表示されるたびに現在のディレクトリを評価して印刷することを意味します。

関連情報