Bashプロンプトでは表示をカスタマイズできる環境変数(PS0,PS1,PS2,PS3,PS4)が用意されています。
今回はリファレンスマニュアルを読み、これらを設定するとどのような動作になるか確認してみます。
ドキュメント
Bash Reference Manual - 5 Shell Variables
Bash Reference Manual - 6.3.3 Interactive Shell Behavior
Bash Reference Manual - 6.9 Controlling the Prompt
実行環境
- WSL2なUbuntu 22.04.3 LTS
- GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
PS0,PS1,PS2,PS3,PS4って?
Bashのリファレンスマニュアルに記載があり、それぞれ下記のような記載になっています。
マニュアルを読んでいて気が付きましたが、PS1とPS2はBourne Shell Variablesとして記載されており。
PS0,PS3,PS4はBash Variablesとして記載されていました。
時代を感じます。
PS1
Bash Reference Manual - 6.3.3 Interactive Shell Behavior
コマンドの入力が開始される前に表示されるプライマリプロンプトでデフォルト値は‘\s-\v$ ’のようです。
今回の実行環境では
- /etc/profile
- ~/.bashrc
の中でPS1を設定してたためこれらの設定を削除すると下記のようになりました。
エスケープ文字は下記ドキュメントに記載があり
Bash Reference Manual - 6.9 Controlling the Prompt
- \sでシェル名の表示
- \vでBashのバージョン表示
となっています。
PS2
Bash Reference Manual - 5.2 Bash Variables
この環境変数は複数行コマンドを入力する際に、改行した後に設定した値を表示します。
PS2に">>>>> "という文字列を設定してコマンド入力で改行をしてみると、改行後に">>>>> "が表示されている事がわかります。
PS0
Bash Reference Manual - 5.2 Bash Variables
コマンドが読み込まれた後、コマンドの結果が表示される前に、変数の内容を表示します。
下記の例ではPS0に"foobar "と入力し、echoでhelloworldと表示される前に環境変数PS0に設定したfoobarが表示される例。
PS3
Bash Reference Manual - 5.2 Bash Variables
PS3はBashのselect組み込みコマンドによってインタラクティブメニューが表示されるときに利用されるプロンプトとなり。
select variable in foo bar hello world; do echo $variable; break;done
上記のようにPS3に"Select! "と設定すると、select組み込みコマンドで選択時にSelect! とコンソールに表示される事がわかります。
PS4
Bash Reference Manual - 5.2 Bash Variables
PS4を設定するとデバッグ時に各コマンドの前に出力されます。
なおPS4のデフォルト値は‘+ ’。
#!/usr/bin/env bash
function fx_foo() {
echo "foo"
fx_bar
}
function fx_bar() {
echo "bar"
}
set -x
fx_foo
上記のようにset -x
をつけてスクリプトを実行すると下記のように表示されます。
上から
1.function名
2.実行したコマンド
3.実行結果
4.function名
5.実行したコマンド
6.実行結果
といった具合に表示されている事がわかります。
またPS4はPS1と同様の記法でカスタマイズできるため、設定すれば色々な情報を表示できるようになります。
総評
何となくで利用していた環境変数について一度ドキュメントを確認してみました。
リファレンスマニュアル読んでて気が付きましたが、PS1とPS2は5.1 Bourne Shell Variablesで説明されていて、PS0とPS3とPS4は5.2 Bash Variablesで説明されているので。
PS1とPS2はBourne Shell時代からある環境変数で、PS0,PS3,PS4はGNUなBashで追加された環境変数って事かと思います。