• Ready Program 1

8 bit CPUを搭載していた昔の「パソコン」は、起動するとBASICインタプリタが起動し、「Ok」や「Ready」といったプロンプトを表示した。これがプログラムの入力や実行が可能な「合図」だった。

そもそもプロンプトは、端末でコンピュータを使う場合に、ホスト側が入力を受け付け可能になったときに表示する文字列だ。いまでも、コンソールでシェルがプロンプトを表示している。BASICのプロンプトは変更ができなかったが、Linux/UnixのシェルやMS-DOSのCommand.comなどは、プロンプトをカスタマイズできた。

イスの高さを身長や机の高さに応じて調整するように、プロンプトは、基本的にはユーザーが好みに応じて書き換えて使うもので、デフォルトのまま使う必要はないし、デフォルトが使いやすいという保証もない。

Windowsのcmd.exeのプロンプト設定は、MS-DOSの頃から変わっていない。promptコマンドがあるが、環境変数PROMPTでも設定ができる。コマンドがあるのは、環境変数を書き換えることができないバッチファイル内で設定を行うためだ。Windows 10/11では、プロンプトでカレントディレクトリを表示するようになっているが、パスが長くなると、かなり煩わしく感じる。筆者は、思い切ってMS-DOS時代と同じくドライブ文字と“>”だけにしてみた(写真01)。カレントディレクトリは、cdコマンドを引数なしで実行すればいつでも表示できる。

  • 写真01: 環境変数PROMPTにプロンプト用文字列を設定することでcmd.exeではプロンプトをカスタマイズできる。promptコマンドを使っても結果は同じ。詳細は、prompt /?でオンラインヘルプを参照のこと

プロンプト設定方法は、“prompt /?”で表示できる。エスケープシーケンスを利用できるようにEscコードを生成できるようになっているが、これは、MS-DOS時代にコンソールがエスケープシーケンスをサポートしていた頃の名残。プロンプトのカスタマイズは、自動実行のレジストリなどを使う方法もあるが、設定→システム→詳細情報→システムの詳細設定→環境変数でPROMPT環境変数を使って定義しておくのが簡単だ。

PowerShellでは、“prompt()”という関数を定義し、その中でプロンプトを表示する。プログラムなのでやりたい放題である。色を付けたいなら、関数中でwrite-hostコマンドなどを使う。ただし、ユーザー定義のprompt関数は戻り値がないと、デフォルト設定のプロンプトが表示されてしまう。その対策として関数の最後にスペースだけを戻すreturn文を入れる。このユーザー定義のprompt関数は、起動時に読み込まれるユーザープロファイル入れておく。

Unixからの長い歴史を引き継ぐだけあり、bashのプロンプト定義は細かく制御できる。通常状態ではシェル変数PS1に定義された「プライマリプロンプト」を表示する。ディストリビューションにもよるが、通常は.bashrcなどでPS1を定義している。プロンプト文字列の設定方法などはbashのmanページに記述がある。

Ubuntuなどのデフォルトは、“ユーザー名@ホスト名:カレントディレクトリ$ ”という形式だが、WSLにはちょっと向いていない。筆者は、Ubuntuの複数のディトリビューションを併用するので、ユーザー名とホスト名部分をディストリビューション名に書き換えた。.bashrcのPS1を定義している行にある“\u@\h”がユーザー名とホスト名に変換される部分だ。bashのプロンプト文字列では、いくつか注意することがある。文字として幅を取らないエスケープシーケンスなどは、“[”と“]”で囲んでおく必要がある。そうしないとヒストリ表示や行編集で行頭位置がずれることがある。

なお、カレントディレクトリのパスを表示する“\w”は、シェル変数“PROMPT_DIRTRIM”で表示する長さを制御できる。このシェル変数を0以外の値にすると、そのレベルまでしかディレクトリ階層を表示しなくなる(写真02)。たとえば、1を設定すると、カレントディレクトリ名のみ、2では、カレントディレクトリとその親ディレクトリまでを表示し、それ以上階層が深い場合には、先頭部分には省略記号をつける。

  • 写真02: bashでは、シェル変数PS1にプロンプト文字列を設定する。カレントディレクトリを表示する“\w”は、シェル変数PROMPT_DIRTRIMでパス階層を制限できる。また、プロンプト文字列は、解釈されたあと、シェルの変数置換やコマンド置換などを実行するため、コマンドなどを埋め込むことも可能。“\#”はヒストリ番号を表示するもの

このPS1は、プロンプト用文字列として評価されたあと、bashのコマンド置換や算術式展開などが適用されるためコマンドなどを途中に入れることも可能だ。たとえば、“!”はヒストリ番号に変換されるが、それをprintfコマンドで書式指定することもできる。


HistoryPrompt="\[\e[92m\]$(printf "%04d" \!):\w:$\[\e[0m\]"

上記のようにシェル変数にプロンプト文字列を記憶させておくと、コマンドラインで“PS1=$HistoryPrompt”を実行するだけで、いつでもプロンプトを切り替えることができる(変数名には補完機能が有効)。プロンプトになんでも表示させておくのもいいが、使い方に合わせて切り替えてもいい。また、自分好みのプロンプトを探すときにいろいろ試行錯誤するときにも使える。

今回のタイトル、ネタの1つは、映画にもなったErnest Christy Clineの小説“Ready Player One”だ。邦訳は「ゲームウォーズ」となんともなタイトルと地味な表紙だった(Kindle版は映画のポスターになってる)。

もう1つは、昔使っていたカシオのFP-200という8 bitマシンのBASICのプロンプト。それが「Ready P0」だった。最後のP0は、プログラム領域0の意味で、FP-200はメモリがバッテリバックアップされていて、0~9のプログラム格納領域があり、それをPROG命令で切り替えることで、複数のプログラムを同時にメモリに格納しておくことができた。大学生のときに実験のデータ処理などで便利に使っていたが、いまでは行方不明。お母さん、ボクのFP-200どこ行ったんでしょうね。