[bash]環境変数PS1とその仲間たち

bash

一度設定すると変えることがほとんどないコマンドラインのプロンプト。
知ってる設定にしがちなので、改めて調べなおしてみました。
PS1以外にもPS2、PS3もあると新しい発見も。

1. 環境変数 PS1 とは?

PS1は、プライマリプロンプト(通常のプロンプト)を制御する環境変数です。
以下のようにカスタマイズすることでプロンプトを変更できます。

デフォルト例

PS1='[\u@\h \W]\$ '

■例
[testUser@localhost ~]$

各記号の意味

  • \u:ユーザー名
  • \h:ホスト名
  • \W:現在のディレクトリ(最後の部分のみ)
  • \$:スーパーユーザーなら#、一般ユーザーなら$

これを変更すると、プロンプトの見た目が大きく変わります。たとえば、以下のようにカスタマイズ可能です。

カスタマイズ例

PS1='[\t \u@\h \w]\$ '

■例
[20:01:03 testUser@localhost /var/log]$

上記では、時刻(\t)(mm:dd:ssの形式)、フルパスの現在のディレクトリ(\w)が含まれたプロンプトが表示されます。
他にもあるのでそれは後述します


2. PS1と類似するプロンプト関連の環境変数

LinuxにはPS1以外にもプロンプトを制御する環境変数があります。それぞれの役割を見ていきましょう。

PS2: 継続プロンプト

PS2は、コマンドが複数行にまたがる場合に表示される継続プロンプトを制御します。

デフォルト例

PS2='> '
■例
$ echo "これは
> 複数行
> コマンド"
これは
複数行
コマンド

PS2を変更することで、この>を別の文字に置き換えることができます。

PS2='次の行: '
■例
$ echo "これは
次の行: 複数行
次の行: コマンド"
これは
複数行
コマンド

PS3: selectコマンドのプロンプト

PS3は、selectコマンドでユーザーに選択肢を提示するときのプロンプトを制御します。

デフォルト例

PS3='#? '
■例
select option in 赤 青
do
echo "選んだのは: $option"
break
done
1) 赤
2) 青
#? 2
選んだのは: 青

置き換え例

PS3='選択肢を入力してください:'
■例
select option in 赤 青
(中略)
2) 青
選択肢を入力してください:2
選んだのは: 青

PS4: デバッグプロンプト

PS4は、スクリプトをデバッグする際に使用されるプロンプトを制御します。set -xを使用すると、各コマンドの前にこのプロンプトが表示されます。

デフォルト例

PS4='+ '
■例
$ set +x
$ echo 'Test message'
+ echo 'Test message'
Test message
(略)

置き換え例

PS4='debug: '
■例
$ set +x
$ echo 'Test message'
debug: echo 'Test message'
Test message
(略)

3. カスタマイズ例

カラフルなPS1の設定

PS1はANSIエスケープシーケンスを使って色を付けることができます。以下はカラフルなプロンプトの例です。

PS1='[\[\e[32m\]\u@\h \[\e[34m\]\w\[\e[0m\] ]\$ '
■出力例
[ testUser@localhost /var/log ]$
  • \[\e[32m\]:緑色
  • \[\e[34m\]:青色
  • \[\e[0m\]:色リセット

PS4を活用したスクリプトデバッグ

PS4='+ 行$LINENO: '
■出力例
cd /etc
+ 行81: cd /etc

デバッグ時にコマンドの実行行を追いやすくするため、スクリプトの行番号をPS4に追加する例です。


4. プロンプト変数を永続化する

設定を一時的に適用する場合はシェル上で直接コマンドを実行すればOKですが、永続化するには以下のファイルに設定を追加します。

  • 個別ユーザーの設定: ~/.bashrc
  • システム全体の設定: /etc/bashrc または /etc/profile

例: ~/.bashrcに追記

PS1='[\u@\h \w]\$ '
PS2='次の行> '
PS3='選択肢を入力してください: '
PS4='+ 行$LINENO: '

設定後、次のコマンドで反映させます。

source ~/.bashrc

5. PS1に指定できる記号あれこれ

ユーザーやホスト情報

  • \u : ユーザー名
  • \h : ホスト名(最初のドットまで)
  • \H : ホスト名(完全なホスト名)
  • \w : 現在の作業ディレクトリ(フルパス)
  • \W : 現在の作業ディレクトリ(最後の部分のみ)
  • \$ : ユーザーがスーパーユーザーなら#、一般ユーザーなら$

日時や時間情報

  • \d : 日付("曜日 月 日"形式、例: Mon Nov 20
  • \t : 現在時刻(24時間形式、例: 14:35:21
  • \T : 現在時刻(12時間形式、例: 02:35:21
  • \@ : 現在時刻(12時間形式、AM/PM付き、例: 02:35 PM
  • \A : 現在時刻(24時間形式、秒なし、例: 14:35
  • \j : 現在のシェルで管理されているジョブの数

シェルやプロセス情報

  • \! : コマンド履歴の番号
  • \# : シェルの実行コマンド数(開始からの順番)
  • \v : Bashのバージョン(例: 5.1
  • \V : Bashのバージョンとパッチレベル(例: 5.1.8
  • \s : 使用中のシェル名(例: bash

スタイル設定

  • \e : エスケープ文字(ANSIエスケープシーケンスの開始)
  • \033 : エスケープシーケンス(\eと同じ)
  • \r : 改行(カーソルを行頭に移動)
  • \n : 改行
  • \a : 警告音(ビープ音)

特殊な値

  • \\ : バックスラッシュ(\

6. まとめ

PS4まであったのは知らなかったなー。PS2以降は機会があったら取り込んでみよう。

  • PS1: 通常のプロンプト
  • PS2: 複数行コマンド用プロンプト
  • PS3: selectコマンドの選択プロンプト
  • PS4: スクリプトデバッグ用プロンプト

コメント

タイトルとURLをコピーしました