Bash PS1と一重引用符と二重引用符


0

私はLinuxとBashの初心者なので、PS1 env varを割り当てる際のシングルクォートとダブルクォートの役割を理解するのに助けを求めたいです。常に現在のディレクトリを表示するようにターミナルを設定したかった。最初にこれを試しました:

export PS1="\[\e[38;5;46m\]>\[\e[38;5;255m\]\[\e]0;$(pwd)\007\]"

これは、現在のディレクトリを表示するように更新され、端末のタイトルを引き起こした私はEnterキーを押したときが、ではない、私はその後、どこか別の場所にcd'ed場合

目的のない試行錯誤を通して、私は最終的に試しました:

export PS1='\[\e[38;5;46m\]>\[\e[38;5;255m\]\[\e]0;$(pwd)\007\]'

単一引用符を使用した2番目のバージョンには、望ましい効果がありました。新しいディレクトリにcdするたびに、端末のタイトルが更新されました。

単一引用符と二重引用符の使用がこのように異なる理由を誰かが説明できますか?ありがとうございました。

私はこの議論を見つけました:minttyウィンドウのタイトルを変更するには?しかし、OPは回答にフラグを立てていないようであり、そのリンクから試した回答はシェルでは効果がないように見えました。

回答:


0

一重引用符と二重引用符の違いは補間です。

最初の例では、シェルは二重引用符の間の式を補間してからPS1変数に代入するため、補間後の変数の値は次のようになります。

> /home/user

2番目の例では、単一引用符のため、シェルは式を文字通り変数に割り当てます。これにより、予期される動作が発生します(プロンプトが出力されるたびに、bashは現在のディレクトリに基づいて式を補間します)。PS1の値は次のとおりです。

\[\e[38;5;46m\]>\[\e[38;5;255m\]\[\e]0;$(pwd)\007\]

これは、いくつかのコマンドで簡単に確認できます。

$ a='hello'
$ b="${a} world"
$ c='${a} world'

$ echo $b
hello world
$ echo $c
${a} world

では$b、変数aは文字列に補間されますが$c、そうではないため、文字列は文字どおりに出力されます。

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