Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

Bashシェルのプロンプトを制御する:PS1・PS2・PS3・PS4・PROMPT_COMMANDの使い方

Bashシェルのプロンプトを制御する:PS1・PS2・PS3・PS4・PROMPT_COMMANDの使い方

PS1、PS2、PS3、PS4、PROMPT_COMMANDといった環境変数を効果的に使いこなせば、Linux Bashシェルとのやり取りは格段に快適になります。「PS」は「Prompt Statement(プロンプトステートメント)」の略です。この記事では、シンプルな実行例を通じて、Linuxのコマンドプロンプトに関わる環境変数の基本をわかりやすく解説します。

1. PS1 ― デフォルトの対話型プロンプト

Linuxのデフォルトの対話型プロンプトは、自由にカスタマイズして、より実用的で情報量の多い表示にできます。次の例では、デフォルトのPS1である「\s-\v\$」(シェル名とバージョン番号を表示)を、ユーザー名・ホスト名・現在の作業ディレクトリを表示する形式へ変更しています。

-bash-3.2$  export PS1="\u@\h \w> "

ramesh@dev-db ~> cd /etc/mail
ramesh@dev-db /etc/mail>
[注:プロンプトが「ユーザー名@ホスト名 カレントディレクトリ>」形式に変わりました]

この例で使用しているPS1の主なコードは以下の通りです。

  • \u ― ユーザー名
  • \h ― ホスト名
  • \w ― 現在のディレクトリのフルパス。ホームディレクトリにいる場合は「~」のみ表示されます

なお、PS1の値の末尾にはスペースを入れています。プロンプトの末尾にスペースがあると視認性が向上するため、個人的にもおすすめの設定です。

この設定を永続化するには、export PS1="\u@\h \w> ".bash_profile または .bashrc のいずれかに追記します。

ramesh@dev-db ~> vi ~/.bash_profile (または)
ramesh@dev-db ~> vi ~/.bashrc
[注:上記いずれかのファイルに export PS1="\u@\h \w> " を追加]

PS1には他にも多数の特殊文字が用意されており、色付けや時刻表示なども可能です。次回の記事では、PS1の実用的な活用例をさらに詳しく紹介する予定です。

2. PS2 ― 継続行プロンプト

非常に長いコマンドは、行末に「\」(バックスラッシュ)を付けることで複数行に分割できます。複数行コマンドの継続行で表示されるデフォルトのプロンプトは「> 」です。PS2環境変数を使えば、これを「continue->」など任意の文字列に変更できます。

ramesh@dev-db ~> myisamchk --silent --force --fast --update-state \
> --key_buffer_size=512M --sort_buffer_size=512M \
> --read_buffer_size=4M --write_buffer_size=4M \
> /var/lib/mysql/bugs/*.MYI
[注:デフォルトの ">" が継続行プロンプトとして表示されています]
ramesh@dev-db ~> export PS2="continue-> "

ramesh@dev-db ~> myisamchk --silent --force --fast --update-state \
continue-> --key_buffer_size=512M --sort_buffer_size=512M \
continue-> --read_buffer_size=4M --write_buffer_size=4M \
continue-> /var/lib/mysql/bugs/*.MYI
[注:変更後の "continue-> " が継続行プロンプトとして表示されています]

「\」で長いコマンドを複数行に分割すると、可読性が大きく向上し、タイプミスの防止にもつながり非常に便利です。一方で、コマンドをあえて分割しないスタイルを好む人もいます。あなたはどちら派でしょうか?

3. PS3 ― シェルスクリプト内の「select」で使われるプロンプト

シェルスクリプト内のselectループでは、PS3環境変数を使って、選択肢の入力を促すプロンプトをカスタマイズできます。

PS3未設定の場合のスクリプトと実行結果:

ramesh@dev-db ~> cat ps3.sh

select i in mon tue wed exit
do
  case $i in
    mon) echo "Monday";;
    tue) echo "Tuesday";;
    wed) echo "Wednesday";;
    exit) exit;;
  esac
done

ramesh@dev-db ~> ./ps3.sh

1) mon
2) tue
3) wed
4) exit
#? 1
Monday
#? 4
[注:selectコマンドのデフォルトプロンプト "#?" が表示されています]

PS3を設定した場合のスクリプトと実行結果:

ramesh@dev-db ~> cat ps3.sh

PS3="Select a day (1-4): "
select i in mon tue wed exit
do
  case $i in
    mon) echo "Monday";;
    tue) echo "Tuesday";;
    wed) echo "Wednesday";;
    exit) exit;;
  esac
done

ramesh@dev-db ~> ./ps3.sh
1) mon
2) tue
3) wed
4) exit
Select a day (1-4): 1
Monday
Select a day (1-4): 4
[注:変更後の "Select a day (1-4): " がselectコマンドのプロンプトとして表示されています]

4. PS4 ― 「set -x」によるトレース出力の接頭辞

PS4シェル変数は、シェルスクリプトをデバッグモード(set -x)で実行した際に表示されるトレース出力の接頭辞を定義します。

PS4未設定の場合のスクリプトと実行結果:

ramesh@dev-db ~> cat ps4.sh

set -x
echo "PS4 demo script"
ls -l /etc/ | wc -l
du -sh ~

ramesh@dev-db ~> ./ps4.sh

++ echo 'PS4 demo script'
PS4 demo script
++ ls -l /etc/
++ wc -l
243
++ du -sh /home/ramesh
48K     /home/ramesh
[注:set -xでのトレース時にデフォルトの "++" が表示されています]

PS4を設定した場合のスクリプトと実行結果:
ここでは、ps4.sh内で定義したPS4に以下の2つの変数を使用しています。

  • $0 ― スクリプト名を示します
  • $LINENO ― スクリプト内の現在の行番号を表示します
ramesh@dev-db ~> cat ps4.sh

export PS4='$0.$LINENO+ '
set -x
echo "PS4 demo script"
ls -l /etc/ | wc -l
du -sh ~

ramesh@dev-db ~> ./ps4.sh
../ps4.sh.3+ echo 'PS4 demo script'
PS4 demo script
../ps4.sh.4+ ls -l /etc/
../ps4.sh.4+ wc -l
243
../ps4.sh.5+ du -sh /home/ramesh
48K     /home/ramesh
[注:set -xでのトレース時に "{スクリプト名}.{行番号}+" 形式が表示されています]

5. PROMPT_COMMAND

Bashシェルは、PS1変数を表示する直前に、PROMPT_COMMANDに設定された内容を実行します。

ramesh@dev-db ~> export PROMPT_COMMAND="date +%k:%m:%S"
22:08:42
ramesh@dev-db ~>
[注:PROMPT_COMMANDの出力とPS1が別々の行に表示されています]

PROMPT_COMMANDの出力をPS1と同じ行に表示したい場合は、以下のように echo -n を使用します。

ramesh@dev-db ~> export PROMPT_COMMAND="echo -n [$(date +%k:%m:%S)]"
[22:08:51]ramesh@dev-db ~>
[注:PROMPT_COMMANDの出力とPS1が同じ行に表示されています]

PS1からPROMPT_COMMANDまで、これらの変数を使いこなせるようになると、ターミナル作業の効率と快適さが大きく向上します。まずは手軽なPS1のカスタマイズから試してみてはいかがでしょうか。

  1. jm-shell – 情報量豊富で自由にカスタマイズできるBashシェル

    jm-shellとは jm-shellは、無料で利用できるオープンソースの軽量Bashシェルです。シェル上での操作に関する豊富な情報をリアルタイムに表示するだけでなく、システムの負荷平均やノートパソコンのバッテリー状態など、実用的なシステム情報もひと目で確認できます。 特筆すべき点として、通常のBashが重複を除いたコマンドのみを履歴ファイルに保存するのに対し、jm-shellはすべてのシェル操作をログファイルに記録します。これにより、過去に実行したコマンドを後から確実に検索・確認できます。 さらに、現在のディレクトリがGit、Subversion、Mercurialなどのバージョン管理システ

  2. BashのPS1変数を極める:機能的でおしゃれなLinuxプロンプトを作る10の実例

    Photo courtesy of f1r3storm85 前回の記事では、Linuxの環境変数であるPS[1-4]とPROMPT_COMMANDについて解説しました。PS1を効果的に活用すれば、コマンドプロンプト上に直接、有用な情報を表示させることができます。 映画『トゥームレイダー』のアンジェリーナ・ジョリーは、謎をスタイリッシュに解き明かすために、あらゆるガジェットや武器を自由に操ります。彼女の装備やスタイルに完全に匹敵するのは難しいとしても、せめて普段使いのLinuxプロンプトくらいは、この記事で紹介する10の実例を使って、高機能かつおしゃれにカスタマイズしてみてはいかがでしょうか。