Bashプロンプト表示の環境変数（PS0,PS1,PS2,PS3,PS4)について

Bashプロンプトでは表示をカスタマイズできる環境変数（PS0,PS1,PS2,PS3,PS4)が用意されています。

今回はリファレンスマニュアルを読み、これらを設定するとどのような動作になるか確認してみます。

## ドキュメント

[Bash Reference Manual - 5 Shell Variables](https://www.gnu.org/software/bash/manual/bash.html#Shell-Variables)

[Bash Reference Manual - 6.3.3 Interactive Shell Behavior](https://www.gnu.org/software/bash/manual/bash.html#Interactive-Shell-Behavior)

[Bash Reference Manual - 6.9 Controlling the Prompt](https://www.gnu.org/software/bash/manual/html_node/Controlling-the-Prompt.html)

## 実行環境

- 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](https://www.gnu.org/software/bash/manual/bash.html#Interactive-Shell-Behavior)

[5.1 Bourne Shell Variables](https://www.gnu.org/software/bash/manual/bash.html#index-PS1)

コマンドの入力が開始される前に表示されるプライマリプロンプトでデフォルト値は‘\s-\v\$ ’のようです。

今回の実行環境では

- /etc/profile
- ~/.bashrc

の中でPS1を設定してたためこれらの設定を削除すると下記のようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/634fac28-99ab-301c-50fc-e47d1f4749c0.png)

エスケープ文字は下記ドキュメントに記載があり

[Bash Reference Manual - 6.9 Controlling the Prompt](https://www.gnu.org/software/bash/manual/html_node/Controlling-the-Prompt.html)

- \sでシェル名の表示
- \vでBashのバージョン表示

となっています。

### PS2

[Bash Reference Manual - 5.2 Bash Variables](https://www.gnu.org/software/bash/manual/bash.html#index-PS2)

この環境変数は複数行コマンドを入力する際に、改行した後に設定した値を表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/8da14a4d-86cb-9908-59dc-1d25ca41f0be.png)

PS2に">>>>> "という文字列を設定してコマンド入力で改行をしてみると、改行後に">>>>> "が表示されている事がわかります。


### PS0

[Bash Reference Manual - 5.2 Bash Variables](https://www.gnu.org/software/bash/manual/bash.html#index-PS0)

コマンドが読み込まれた後、コマンドの結果が表示される前に、変数の内容を表示します。

下記の例ではPS0に"foobar "と入力し、echoでhelloworldと表示される前に環境変数PS0に設定したfoobarが表示される例。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/77045b59-8ec2-61aa-f818-76bed972db0d.png)


### PS3

[Bash Reference Manual - 5.2 Bash Variables](https://www.gnu.org/software/bash/manual/bash.html#index-PS3)

PS3はBashのselect組み込みコマンドによってインタラクティブメニューが表示されるときに利用されるプロンプトとなり。

```bash:select
select variable in foo bar hello world; do echo $variable; break;done
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/8ef8980a-675b-dbf3-519d-f04612d4633d.png)

上記のようにPS3に"Select! "と設定すると、select組み込みコマンドで選択時にSelect! とコンソールに表示される事がわかります。

### PS4

[Bash Reference Manual - 5.2 Bash Variables](https://www.gnu.org/software/bash/manual/bash.html#index-PS4)

PS4を設定するとデバッグ時に各コマンドの前に出力されます。
なおPS4のデフォルト値は‘+ ’。

```bash:test_ps4.sh
#!/usr/bin/env bash

function fx_foo() {
  echo "foo"
  fx_bar
}

function fx_bar() {
  echo "bar"
}

set -x

fx_foo
```

上記のように`set -x`をつけてスクリプトを実行すると下記のように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/1b3ecdc9-7c4d-7a5c-9b38-c064520fabf3.png)

上から

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で追加された環境変数って事かと思います。