にある\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')