私は最近bashプロンプトを調整し始めましたが、エスケープ文字がどのように機能するかを理解していないことがわかりました。私は以下を持っています:
PS1="\[$RED\]\342\224\214\342\224\200"
ここで文字を\[
エスケープし[
、\xxx
UTF-8文字をエスケープしました。ただし、次の行では奇妙な結果が表示されます。
PS1+="$([·\$?·!=·0·]·&&·echo·\[$RED\]\342\234\227\·)"
これは常にX
プロンプトに印刷されますが、最初のプロンプトから出ると、コマンド$
の終了ステータスがゼロでない場合にのみ印刷されます。なぜそうなのか理解できません。$(commands)
与えられた結果を出力してはいけませんかcommands
?このようにエスケープすると\$()
、シーケンス全体がエスケープされますか、それともドル記号だけがエスケープされますか?脱出しないとなぜ印刷されないのですか$
?ただ印刷されますX
。$
角かっこにも同じ問題があります。なぜ私はそれから逃げなければならないのですか?
私はこれが他の質問にも適していると思いますが、プロンプトで実際の終了ステータスを印刷する方法はありますか?
答え1
二重引用符で囲まれた文字列は、コマンド置換()と変数拡張$(...)
($foo
)を処理します。これは宿題中PS1="$(...)"
またはPS1="\$(...)"
。
ただし、プロンプトを印刷しても同じ拡張が処理されるため、割り当て時にドル記号をエスケープすると結果にエスケープされていないPS1
ドル記号が表示され、プロンプトが印刷されると拡張が発生します。
したがって、エスケープされていないコマンド置換を使用すると、プロンプトが割り当てられたときにコマンドは一度だけ実行されます。バックスラッシュを使用すると、プロンプトが印刷されるたびに実行されます。
次の2つを使用して違いを簡単にテストできます。
PS1="$(date) "
PS1="\$(date) "
これは\[
違います。通常の二重引用符文字列ではなくプロンプトを処理する場合にのみ関連します。これは、表示される文字を印刷しないプロンプト部分を表示するために使用されます。また、プロンプトでのみ機能します。今後拡張機能があるため、PS1='$(echo "\[...\]")'
必要に応じて機能しない可能性があります。