Fedora/Red Hat の /etc/bashrc ファイルに次の行が表示されます。
[ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ "
どのテストが行われていますか[ "$PS1" = "\\s-\\v\\\$ " ]
?テストが成功した場合にのみPS1が設定されるのはなぜですか?
答え1
\s-\v\$␣
デフォルトのプロンプト文字列です。、PS1
設定されていない場合、Bash が対話式で起動したときに設定される値です。これには、シェルプロセスのデフォルト名(通常bash
はまたはsh
)、バージョン、およびドル記号(たとえば)が表示されますbash-4.4$
。 (またはifの代わりに#
aを使用$
してrootとして実行します。)
より便利なプロンプトを設定するアイデアのようですが、他の起動ファイルがすでに設定されている場合はそうではありません。
"\\s-\\v\\\$ "
二重引用符で囲まれた文字列内の特定の値は\x
特別な意味を持つため、バックスラッシュは2倍になりますx
。\\
リテラルバックスラッシュを明示的に表します。 (何らかの理由で彼らは宿題をそうしなかったが)。
一重引用符で囲まれた文字列を使用すると、バックスラッシュを読みやすくします。
[ "$PS1" = '\s-\v\$ ' ] && PS1='[\u@\h \W]\$ '
答え2
実行されるチェックは文字列比較です=
。 $ PS1の値を文字列\s-\v\$
からバックスラッシュをエスケープする必要がある文字列と比較して、次の文字をエスケープしようとする代わりに、実際のバックスラッシュと比較します。
この&&
構文は、以前のテストが成功した場合にのみPS1を設定する部分です。
ここでの全体的なロジックは、明らかにPS1が以前に特定の値に設定されていた場合にのみPS1を更新することです。
答え3
(こんなスウェーグラだから回答で入れるかなとか悩んだけど、そこまで…)
これは理論にすぎませんが、最初のフォーム(たとえばbash-3.2.1$
)は、ルートまたは他の「非ユーザー」アカウントでログインしたときによく表示されるプロンプトに似ています。 2番目に重要な形式(例[joeblow@myhost /tmp]$
:)はよりユーザー中心です。したがって、これはシステムアカウントからユーザーアカウントに移動したときにそれを検出してから、より適切なプロンプトに変更するだけです。それ以外の場合は、誰かが現在のプロンプトを維持したいとします。
答え4
比較は、シェルが対話型セッションであることを確認することだと思います。\s-\v$
$ PS1 varはbash-5.0$
私のコンピュータで評価されます。ここで違いを確認してください。
Jonathans-Air:~ lirum$ bash
bash-5.0$ echo "$PS1"
\s-\v\$
bash-5.0$ exit
exit
Jonathans-Air:~ lirum$ echo "$PS1"
\h:\W \u\$