文字列操作のために bash プロンプトで特殊文字をエスケープするには、バックスラッシュを使用します。

文字列操作のために bash プロンプトで特殊文字をエスケープするには、バックスラッシュを使用します。

にある\etc\defaultsときにbashプロンプトが機能したいと思います。PS1/etc/defaults

私はこの2つの方法を試しました。

PS1="$(echo "\w" | sed 's/\//\\/g')"
PS1="$(tmp="\w" && echo ${tmp//\//\\})"

ただし、両方の結果は同じです/etc/defaults

どちらも変だから

echo $PWD | sed 's/\//\\/g'
tmp=$PWD && echo ${tmp//\//\\}

印刷\etc\defaults

答え1

スラッシュをバックスラッシュに置き換えることについてどう考えても、これは実際に興味深い引用問題です。他の同様の構造を思いつく人。

PS1含めると$(echo "\w" | sed 's/\//\\/g')どうなりますか?最初Bashはプロンプトをエスケープするためにこれを処理します(例:)\w。デフォルトでは、良いパス名で動作します。しかし、同時にそれは単一のものに変わるかもしれません...だからあなたが入るべきことです。または、追加のバックスラッシュと同様に二重引用符を使用します。echo "\w"echo "/etc/defaults"\\\PS1$(echo "\w" | sed -e 's/\\//\\\\/g')$(echo "\w" | sed -e "s/\\\\//\\\\\\\\/g")

もしそうなら問題があります仕事を使用するには、PS1一重引用符で囲まれた文字列が必要な場合があります。一重引用符を含める必要があるため、'\''次のように置き換える必要があります。

PS1='$(echo "\w" | sed -e '\''s/\\//\\\\/g'\'')'

これは厄介で、SE構文の強調表示がそれに正しく従わないようです。'\''s 間の部分を引用符で囲まれていないとマークします。

しかし...これを行うより良い方法があります。


シェルのコマンドラインでデータを直接テキストに置き換えることは基本的に問題を引き起こすので、これらの\w置換はやや不審です。パスがある場合は、引用符が欠落して/tmp/quote"me直接置き換えられます。echo "/tmp/quote"me"Bashは実際に引用符をエスケープするためにバックスラッシュを追加するためです。これはecho "/tmp/quote\"me"大丈夫です。でもそれでもひどいので避けた方がいいと思います。エスケープが解析と一致しない場合、非常に正当なコマンド挿入の問題がある可能性があります。たとえば、似たようなecho '\w'ものいいえパスにが含まれている場合は、追加の"$\バックスラッシュが表示されます'

また、実行する関数を定義することで、プロンプト自体からコマンドを非表示にしてsed参照地獄を回避できます。ただし、関数自体がプロンプトの一部ではないため、機能しないため、ここでs///使用する必要があります。$PWD\w

manglepath() {
    echo "$PWD" | sed 's/\//\\/g'
}
PS1='$(manglepath)\$ '

${var//pattern/replacement}実際には、 を呼び出す代わりに拡張機能を使用できる必要があり、sedおそらく次のものを使用する必要があります。printf変えるecho:

manglepath() {
    printf "%s\n" "${PWD//\//\\}"
}
PS1='$(manglepath)\$ '

答え2

PS1='$(echo "\w" | sed '\''s#/#\\\\#g'\'')'

これによりPS1が発生します。$(echo "\w" | sed 's#/#\\\\#g')

関連情報