PS1 = '$(pwd)'これが機能する理由、およびPS1 = $(pwd)と異なる理由


18

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

PS1='$(pwd)'

私は一重引用符を使用しています。つまり、補間はありませんecho '$(pwd)'-→$(pwd)

さらに、これがなぜ機能するのかを明確にしたとしましょう...なぜ機能が異なるのPS1=$(pwd)ですか?(引用符なし)

別の言い方をすれば、引用符を使用すると、ターミナルをナビゲートするときにプロンプ​​トが現在のディレクトリに変わり続けるということです。しかし、引用符を使用しない場合、プロンプトは常に、コマンドを最初に入力したときのディレクトリのままです。PS1=$(pwd)

どうして?


2
いくつかのCPUサイクルを節約し、同等のPS1 = '$ PWD'を使用します
jlliagre

回答:


29

単純に変数に値を割り当てると、$(...)式が単一引用符で囲まれていない場合(またはバックスラッシュでエスケープされていない場合)、式が評価されます。理解するには、これら2つを比較してみてください。

A=$(pwd)
echo "$A"
B='$(pwd)'
echo "$B"

の値はAすぐに文字列になり、/home/yourusernameこの文字列がどこから来たかは明らかに記憶されていません。ディレクトリを変更しても同じままです。Bただし、の値は$(pwd)解釈されずにリテラル文字列になります。

さて、PS1特別な何かの値が発生します。プロンプトが出力されるたびに、特定の特別な構成要素が解釈されます。たとえば$(...)A変数への代入で上記のようにコマンド置換が実行されます。明らかにPS1、あなたのホームディレクトリのリテラル文字列が含まれている場合(上でA)、変更できる方法はありません。ただし、$(pwd)上記のように文字列が含まれている場合B、プロンプトが出力されるたびに評価され、実際のディレクトリが表示されます。


14

bashとzshの両方で、の値はPS1プロンプトとしてそのまま使用されず、いくつかの拡張が行われます。ルールは、2つのシェルのために異なるが、どちらの場合も、ステップの一つは、(通常のシェル構文と同じ構文で「ドル」展開(変数置換、コマンド置換、算術評価)を行うことで、、または、、) 。$VARIABLE${VARIABLE}$(COMMAND)`COMMAND`$((EXPRESSION))$[EXPRESSION]

  • bashでは、ドルの拡大はデフォルトでオンになっていますが、でオフにできますshopt -u promptvars
  • zshでは、ドル拡張はデフォルトでオフになっていますが、多くの人々(およびWebで見つかるほとんどの構成フレームワーク)はでオンにしsetopt prompt_substます。

ドルオンプロンプトの拡大、とPS1='$(pwd)'設定PS16文字値に$(pwd)、従って原因$(pwd)置換される、従ってpwd、コマンドが実行される、たびに、シェルは、新しいプロンプトを表示します。一方、その時点でのシェルの現在の作業ディレクトリをPS1=$(pwd)設定PS1します。ドル展開をオフにPS1='$(pwd)'すると、プロンプトがリテラル文字列になります$(pwd)

プロンプトで作業ディレクトリを取得するより便利な方法があることに注意してください。

  • bashでは、などのバックスラッシュエスケープを使用します\w。これは、ホームディレクトリを~に短縮し、を設定することでトリミングできますPROMPT_DIRTRIM
  • zshのでは、とのパーセントエスケープなど%/%~(は%/同じで$PWD%~トリミングの設定を持つことができ、ホームディレクトリを略記します)。
  • どちらのシェル(および他のBourneスタイルのシェル)でも、$PWDと同等$(pwd)です:現在の作業ディレクトリを取得するためにサブプロセスを実行する必要はありません。

7

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.