ヒント: プロンプトの魔術

システム・プロンプトに手を加える

シェル・プロンプトに少し手を加えるだけで、カラフルで情報満載となるのに、どうして退屈な標準のもので我慢しているのですか? Daniel Robbins は、今回のヒントで、X 端末のタイトル・バーを動的に更新する方法はもとより、自分の好みに合うシェル・プロンプトに手を入れる方法を教えてくれます。

Daniel Robbins (drobbins@gentoo.org), President/CEO, Gentoo Technologies, Inc. (Courtesy Intel Corporation)

ニューメキシコ州のアルバカーキーに住む Daniel Robbins は、Gentoo プロジェクトのチーフ・アーキテクトであり、かつ Gentoo Technologies, Inc. の CEO であり、かつ Linux Advanced Multimedia Project (LAMP) のよき助言者です。彼は、マクミラン・ブックCaldera OpenLinux Unleashed、SuSE Linux Unleashed、およびSamba Unleashed の著者です。Daniel は、小学校 2 年生のころから曲がりなりにもコンピューターにのめり込み、当時彼は、危険性を潜めたパック・マンのほか、Logo プログラム言語にも初めて出会いました。これで、彼がなぜ、それ以来 SONY Electronic Publishing/Psygnosis のリード・グラフィック・アーティストを務めているかが分かるでしょう。Daniel は、奥さんの Mary(今度の春に出産の予定です)と一緒に時間を過ごすのが楽しいそうです。彼の電子メール・アドレスはdrobbins@gentoo.org です。



2000年 9月 01日

Linux/UNIX を使っている人は、多くの時間、シェルを使って作業していますが、多くの場合、これを見直してみる価値がありそうです。

bash-2.04$

あなたが root になることができれば、この素晴らしいプロンプトの "プレステージ" バージョンを手にすることができます。

bash-2.04#

これらのプロンプトは、手放しで素晴らしいといえるものではありません。Linux ディストリビューションの幾つかは、デフォルト・プロンプトをアップグレードしてカラーを追加したり、ブート用の情報を追加しているのも無理がありません。しかし、カラフルなすばらしいプロンプトを備えた最新版の配布物を入手しても、それだけでは不十分です。いくつかのカラーを追加または変更したくなるでしょうし、プロンプト自体に情報を追加 (または除去) したくもなるでしょう。あなた独自のカラーを付け、装いを凝らしたプロンプトを最初から設計することは、難しいことではありません。

プロンプトの基本

bash のもとでは、次のようにして、PS1 環境変数の値を変更してプロンプトを設定することができます。

$ export PS1="> "
>

変更結果は即時に有効になり、"エクスポート" 定義を ~/.bashrc ファイルに組み込むことで、変更結果を永続的にすることができます。PS1 には、次のように、好きなだけいくつでもプレーン・テキストを含めることができます。

$ export PS1="This is my super prompt > "
This is my super prompt >

これは楽しい作業ですが、プロンプトに静的テキストを多く含めてもあまり役に立ちません。ほとんどのカスタム・プロンプトには、現行ユーザー名、作業ディレクトリー、ホスト名などの情報が含まれています。これらの情報は、シェルの世界をナビゲートする際に役立ちます。たとえば、次のプロンプトはユーザー名とホスト名を表示します。

$ export PS1="\u@\H > "
drobbins@freebox >

このプロンプトは、多数のマシンに、数多くの名前の異なるアカウントで、ログインする人にとっては、特に便利です。なぜならば、このプロンプトは、自分がいま実際にどのマシンを動かしているか、自分がいまどの特権を持っているかを教えてくれるからです。

上の例では、特殊なバックスラッシュ・エスケープ文字シーケンスを使用して、ユーザー名とホスト名をプロンプトに挿入するよう bash に指示しました。そのバックスラッシュ・エスケープ文字シーケンスは、特定の値が PS1 変数に現れると、bash によってその値に置き換わります。文字シーケンス "\u" (ユーザー名用) と "\H" (ホスト名の最初の部分用) を使用しました。以下に、bash が認識している特殊シーケンスをすべてリストします (このリストは、「プロンプト操作」セクションの bash man ページにも示されています)。

シーケンス説明
\aASCII ベル文字 (\007 と入力することも可)
\d"Wed Sep 06" フォーマットの日付
\eASCII エスケープ文字 (\033 と入力することも可)
\hホスト名の最初の部分 (たとえば、"mybox")
\H省略なしのホスト名 (たとえば、"mybox.mydomain.com")
\j^Z を入力してこのシェルで中断したプロセスの数
\lシェルの端末装置の名前 ("ttyp4"など)
\n改行
\r復帰
\sシェル実行可能ファイルの名前 ("bash"など)
\t24 時間形式の時刻 ("23:01:01"など)
\T12 時間形式の時刻 ("11:01:01"など)
\@am/pm による 12 時間形式の時刻
\uユーザー名
\vbash のバージョン (2.04など)
\Vbash バージョン (パッチ・レベルを含む)
\w現行作業ディレクトリー ("/home/drobbins"など)
\W現行作業ディレクトリーの "ベース名" ("drobbins"など)
\!ヒストリー・バッファー内の現行コマンドの位置
\#コマンド番号 (ユーザーがデータを入力する間、各プロンプトでカウントされる)
\$ユーザーが root でなければ、"$" を挿入し、root であれば、"#" を入手します
\xxx3 桁の数字 xxx に基づく ASCII 文字を挿入します (未使用桁をゼロで置き換えます。たとえば、"\007")
\\バックスラッシュ
\[このシーケンスは、カーソルを移動しない文字シーケンス (たとえば、カラー・エスケープ・シーケンス) の前に来なければなりません。これにより、bash はワード・ラッピングを正しく計算することができます。
\]このシーケンスは、非印刷文字シーケンスの後に来なければなりません。

これで、bash の特殊バックスラッシュ・エスケープ・シーケンスの情報が、すべて入手できました。これらのシーケンスを少し使ってみて、その働き方について感触をつかんでください。少しテストしたら、カラーを追加する作業に入ります。


カラーの追加

カラーの追加は非常に簡単です。最初のステップは、カラーなしのプロンプトを設計することです。次に行う仕事は、端末 (bash ではなく) が認識する特殊エスケープ・シーケンスを追加し、テキストの特定部分をカラーで表示させることだけです。標準 Linux 端末と X 端末を使用すれば、フォアグラウンド (テキスト) カラーとバックグラウンド・カラーを設定でき、必要であれば、"太字" 文字も設定できます。8 カラーの中から選ぶことができます。

カラーを選ぶには、特殊シーケンスを PS1 に追加します。基本的には、"\e[" (エスケープ左ブラケット) と "m" の間に数値を挿入します。複数の数字コードを指定する場合は、各数字コードをセミコロンで分離します。次に、カラー・コードの例を示します。

"\e[0m"

数字コードとしてゼロを指定すると、端末は、フォアグラウンド、バックグラウンド、および太字の設定をそれぞれのデフォルト値に設定し直します。このコードをプロンプトの末尾で使用すれば、ユーザーが入力したテキストはカラーになりません。ここで、カラー・コードを見てみましょう。以下のスクリーン・ショットを見てください。

カラー図表

この図表を使用する場合は、使用したいカラーを探し、対応するフォアグラウンド (30-37) 数字とバックグラウンド (40-47) 数字を見つけてください。たとえば、普通の黒のバックグラウンドに緑を表示したい場合は、数値は 32 と 40 になります。以下のプロンプト定義に該当するカラー・コードを追加します。

export PS1="\w> "

は、次のようになります。

export PS1="\e[32;40m\w> "

ここまでは、うまくいきましたが、まだ完全ではありません。bash が作業ディレクトリーを印刷したら、"\e[0m" シーケンスを使用してカラーを通常に戻す必要があります。

export PS1="\e[32;40m\w> \e[0m"

この定義ですばらしい緑のプロンプトを設定できますが、さらにいくつかの仕上げを追加する必要があります。バックグラウンド・カラー設定値 40 を組み込む必要はありません。それは、この設定値により、バックグラウンドがデフォルト・カラーの黒に設定されるからです。また、緑も非常に暗い色です。これを修正するには、カラー・コード "1" を追加します。これで、より明るい太字のテキストが表示されます。この変更に加え、すべての非印刷文字も特殊 bash エスケープ・シーケンス "\[" と "\]" で囲む必要があります。これらのシーケンスは、囲まれた文字が行上でスペースを取らないことを bash に指示します。したがって、ワード・ラッピングは引き続き正しく行われます。これらのシーケンスがなければ、コマンドを打ち込んでいきながら、端末の右端まで来たときに、せっかく見栄えのいいプロンプトが画面をめちゃくちゃにしてしまいます。最終的なプロンプトは、次のようになります。

export PS1="\[\e[32;1m\]\w> \[\e[0m\]"

同一プロンプトに複数のカラーを使用するのを恐れないでください。たとえば、次のとおりです。

export PS1="\[\e[36;1m\]\u@\[\e[32;1m\]\H> \[\e[0m\]"

Xterm ファン

情報やカラーをプロンプトに追加する方法について説明してきましたが、さらに手を加えることができます。特殊なコードをプロンプトに追加して、X 端末 (たとえば、rxvt または aterm) のタイトル・バーを動的に更新することができます。必要な作業は、次のシーケンスを PS1 プロンプトに追加することだけです。

"\e]2;titlebar\a"

xterm のタイトル・バーに表示したいテキストをサブストリング "titlebar" で置き換えるだけで、すべてが完了します。静的テキストを使用する必要はありません。bash エスケープ・シーケンスをタイトル・バーに挿入することもできます。この例をよく見てください。ユーザー名、ホスト名、および現行作業ディレクトリーをタイトル・バーに入れ、明るい緑色の簡単なプロンプトを定義しています。

export PS1="\[\e]2;\u@\H \w\a\e[32;1m\]>\[\e[0m\] "

これは、わたしが上のカラー・テーブル・スクリーン・ショットで使用しているプロンプトです。わたしはこのプロンプトが気に入っています。それというのも、このプロンプトは、すべての情報を端末 (1 行に収容できる文字数に制限がある) ではなく、タイトル・バーに入れるからです。ここで、タイトル・バーのシーケンスを "\[" と "\]" で囲むのを忘れないでください。端末に関する限り、このシーケンスは印刷されないからです。多くの情報をタイトル・バーに入れる場合の問題は、非グラフィカル端末 (たとえば、システム・コンソール) を使用すると、それが見えないということです。この問題を修正するには、次のようなシーケンスを .bashrc に追加します。

if [ "$TERM" = "linux" ]
then
	#we're on the system console or maybe telnetting in
	export PS1="\[\e[32;1m\]\u@\H > \[\e[0m\]"
else
	#we're not on the console, assume an xterm
	export PS1="\[\e]2;\u@\H \w\a\e[32;1m\]>\[\e[0m\] " 
fi

この bash 条件ステートメントは、現行の端末設定に基づいてプロンプトを動的に設定します。一貫性を保つために、始動時に ~/.bash_profile が ~/.bashrc を提供するように構成することができます。次の行が ~/.bash_profile に含まれていることを確認してください。

source ~/.bashrc

ログイン・シェルを開始するか、非ログイン・シェルを開始するかに関係なく、このような方法で、同一のプロンプト設定を行うことができます。

これで、できあがりました。では、早速、カラー付きのすばらしいプロンプトをいくつか作って楽しみましょう。

参考文献

  • rxvt は、優れた xterm で、"doc" ディレクトリーに入っているエスケープ・シーケンスに関連する 多くのドキュメンテーションがソース tarball に組み入れられています。
  • aterm は、もう 1 つの端末プログラムで、rxvt に基づいて作成されています。透過性やカラー付けといった、いくつかのすばらしいビジュアル機能をサポートします。
  • bashish は、すべての各種端末で使用できるテーマ・エンジンです。実行中の bashish のいくつかの 優れたスクリーン・ショット を研究してください。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=231471
ArticleTitle=ヒント: プロンプトの魔術
publish-date=09012000