bashプロンプト(PS1)を手動で設定すると、rootが#ではなく$を持つようになるのはなぜですか?


11

CentOS 6.4を使用しています。デフォルトでは、rootユーザーのプロンプトには#記号があります[root@myserver ~]# 。つまり、のようなものです。

echo $PS1印刷し[\u@\h \W]\$ます。しかし、もしそうするならPS1="[\u@\h \W]\$"(何も変えてはいけない、afaics)、次のようなプロンプトが表示されます[root@myserver ~]$

自分で設定しようとすると(最終的にはもっと便利なものに変更したいのですが)、$文字どおりに解釈されるのはなぜですか?私が見つけることができるほぼすべてのページ(例:方法:bashカスタムプロンプト(PS1)の変更/設定)には、rootユーザーに対して\$a が必要であると書かれてい#ます。


PS1=[\u@\h \W]\$を返します-bash: W]$: command not found
チョロバ

@chorobaおっと、申し訳ありませんが、二重引用符を忘れてしまいましたPS1="[\u@\h \W]\$"
stripybadger

回答:


14

あなたの質問では、その行をまったく引用していないことを暗示しています。スペースが引数の割り当て "PS1 = [\ u @ \ h"をコマンド "\ W] \ $"から分離するため、明らかに間違っています。すべてのキャラクターが重要であることを理解してください。

とにかく、おそらくあなたがしていることは、単一引用符( ')ではなく二重引用符(')を使用していることです。入力した内容を解釈するシェルに関しては、動作が大きく異なります。バックスラッシュ/いくつかの文字のシーケンス。この割り当てでは、\ u、\ h、および\ Wに特別なものはないため、そのまま残されます。角括弧はさまざまな場所で特別な意味を持つことができますが、そのため、それらもそのまま残されます。ただし、a $にはさまざまな意味があり、すべて特別であるため、\$シーケンスは「ドル記号の特殊性を無視し、そのままにしておく」と解釈され、そのシーケンスはさらに解析されていない単一のドル記号。そのすべての結果はPS1、および\$シェルが実際のプロンプトを作成するときのマジックシーケンスではなく、リテラルのドル記号があるため、実効ユーザー依存の文字ではなく、ドル記号を取得するだけです。実際の解析はもう少し複雑ですが、それがこの特定の例の要点です。

あなたは何を入力した:PS1="[\u@\h \W]\$ "
シェルが割り当てられて何を:PS1 <- "[\u@\h \W]$ "
あなたは何を望むか:PS1 <- "[\u@\h \W]\$ "
ユーザーが入力するもの:PS1='[\u@\h \W]\$ '

次にすべきこと:このチュートリアルのようなものを読んで、シェルのクォートについて詳しく学んでください。


1
うん、あなたはその場にいた、私は二重引用符を使っていた(元の質問からそれらを紛失して申し訳ない)、私の間違いを指摘してくれてありがとう。
stripybadger

あなたがいる場合行う何らかの理由で二重引用符を使用する必要性を、使用することは、PS1="...\\\$"文字通りのペアがいることを確実にするため\$に格納されPS1、後に解釈するシェルのため。
chepner

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