今回は軽めのネタでいきましょう。Bashなどのシェルではプロンプトで表示されるを変更することができます。デフォルトのプロンプトで表示される文字列では物足りない、不便だと思う人はいるでしょう。なお、今回はサンプルファイルや必要とするディレクトリはありません。プロンプトで表示される文字列を変更しても設定を保存しなければ、やりたい放題なので気軽に試してみるとしましょう。

Bashのプロンプト

 プロンプトで表示される文字列とはシェルで表示される「bash-3.2$」とか「PS /Users/weed>」とかの部分を示します。今回はこの文字列を変更しようということです。長いので以後、プロンプトとして進めます。

 まず、最もメジャーなBashからやってみましょう。Bashのプロンプトで何を表示するかはPS1の変数に入っています。PS1の内容を確認するにはechoを使うと確認できます。

echo "$PS1"

設定されている文字列は「\s-\v\$」のようです。この文字列はBashのリファレンスマニュアルに記載されています。

Bash Reference Manual https://www.gnu.org/software/bash/manual/bash.html

 BashにはPS1以外にもPS0,PS2,PS3,PS4があります。これもマニュアルに記載があります。

 プロンプトで表示される文字列に何が設定できるかはマニュアルに記載があります。

6.9 Controlling the Prompt
https://www.gnu.org/software/bash/manual/html_node/Controlling-the-Prompt.html

これらの文字列をPS1などに指定すればプロンプトを自由に変更できます。
それでは早速プロンプトを変更してみましょう。まず、何も文字列を指定しないとどうなるかやってみます。空文字は""をPS1に入れます。

PS1=""

実行してみると何もプロンプトが表示されなくなりました。コマンドを入力すると機能しているので、画面を広く使いたい場合にはよいかもしれません。
任意の文字列にしたい場合はPS1に好きな文字列を入れます。

PS1="mynavi>"

環境にもよりますが、日本語のプロンプトにすることもできます。

PS1="〆切まであと7日>"

これも環境によりますが、プロンプトを絵文字にすることもできます。使用している書体(フォント)によっては絵文字は表示されないことがあります。使用しているターミナルが対応していない場合は何も表示されなかったり?などの代替記号が表示されることがあります。

PS1="😀"

空文字だと以後の説明画面がわかりにくいので、一旦デフォルトに戻します。デフォルトのプロンプトに戻すには以下のように設定します。

PS1="\s-\v\$ "

プロンプトに日付を表示する

 次にプロンプトに現在の日付や時間を表示してみます。ただ、この日付や時間はリアルタイムに更新されるわけではなく、リターンキーを押して次に表示されるプロンプト時点での日付・時間になります。
 まず、日付を表示するには\dをPS1に設定します。

PS1="\d "

 日付は表示されましたが、環境依存(ロケール依存)みたいで日本語日付だとなかなか微妙な部分もありそうです。とはいえ、ここであきらめるのもしっくりこないので西暦年数、月、日の順番で日付を表示してみましょう。この場合は以下のようにします。

PS1="\D{%F} "

 ここで\D{〜}の〜には日付フォーマット文字列を指定します。これはstrftime(3)の文字列で検索すると色々出てきます。

manpages.org strftime(3) https://ja.manpages.org/strftime/3

 これらの文字列を設定すれば自由な日付フォーマットで表示できます。xxxx年xx月xx日の形式で表示したい場合は以下のようにします。これで一応期待通りというか見慣れた日本語の日付表示になりました。

PS1="\D{%Y年%m月%d日} "

プロンプトに時間を表示する

 それでは次にプロンプトに時刻を表示してみます。残念ながらリアルタイムで時刻が表示されるわけではありませんが、目安にはなるでしょう。(大昔はGUIではなく時計が常にリアルタイムに表示されている環境がなかった)
 リターンキーを押した時点での時刻を表示するには\tをPS1に設定します。以下のようにすると現在の時刻がプロンプトに表示されます。

PS1="\t "

24時間制でなく12時間制で表示するには\Tとします。

PS1="\T "

12時間制だと午前中か午後かわかりません。AM,PMも付加する場合は\@とします。

PS1="\@ "

 時間の表示もフォーマット文字列を使えば自由にできます。以下のようにするとXX時XX分XX秒の形式で表示します。

PS1="\D{%H時%M分%S秒} "

 時間だけでなく日付も同時に表示することもできます。上記の形式をくっつければできあがりです。

PS1="\D{%Y年%m月%d日 %H時%M分%S秒} "

プロンプトにディレクトリ名/パス名を表示する

 それでは次にプロンプトにディレクトリ名とパス名を表示してみます。実用度としては一番かもしれません。 まず、現在のディレクトリ(カレントディレクトリ)名を表示するには\Wとします。

PS1="\W "

現在のディレクトリ名でなくディレクトリパスも含めた方が、より実用度は高いでしょう。

PS1="\w "

パス名が表示されるのは便利ですが、長いパス名はそれはそれで画面を占有してしまうので困りものでもあります。パス名を途中で改行することはできませんが、パス名で一旦改行した後にプロンプト記号を表示することはできます。改行は\nなので、これを\wの後に書けばできあがりです。

PS1="\w\n$ "

 せっかくなので、ここまでの設定をまとめてみましょう。以下のようにすると日時とパス名等が表示されます。

PS1="\D{%Y年%m月%d日 %H時%M分%S秒} \w$ "

 今回はここまでです。zshなど他のシェルは気が向いたらやるかもしれません。

著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。