次のページ 前のページ 目次へ

2. BashとBashのプロンプト

2.1 Bashとは

Bourne Shell の流れをくむ Bash は、GNU で開発されており、 Bourne Again SHell から名付けられています。 多くの Linux では標準のコマンドライン・インターフェースになっています。 対話性や、コマンドラインの編集、補完、履歴といった機能に卓越しています。 プロンプトを設定変更できることは多くの人が知っていますが、 どこまでのことができるかはあまり知られていません。

2.2 Bash プロンプトをいじるとよいことがあるのですか?

多くの Linux のデフォルトのプロンプトは、1色(通常グレイ)で、ユーザー名、 マシン名、現在のディレクトリを示すものになっています。これは役に立つ 情報です。でもプロンプトはもっと多くのことを示せます。どんな情報でも 示すことができます。tty 番号、時間、日付、負荷状態、ユーザー数、接続時間等々。 プロンプトには ANSI の色が使え、見た目を面白くしたり、ある情報を際立たせたり できます。 このような情報を示すために、Xterm のタイトルバーを操作することもできます。

2.3 なぜ面倒なことをするの?

かっこよく見せるというだけでなく、システム情報が示されるのは役に立つこと が多いでしょう。 異なった機械では異なった色でプロンプトを出すというようなことに使う 人もいます。いくつもの Xterm をいくつもの機械で動かしていたり、どの機械を 動かしているのかを勘違いして、間違ったファイルを削除したりするような人は、 このような工夫をすることによって、どの機械を動かしているかを忘れる ことがなくなるでしょう。

2.4 第一段階

プロンプトの形状はシェル変数 PS1 によって決まります。 コマンドが2行以上になる時の2行目以降のプロンプトは、PS2 の文字列で 決まります。これは PS1 と全く同じ書き方ですので、この文書ではほとんど PS1 についてだけ述べます。(PS3 と PS4 という変数もあります。これらは 通常のユーザーが見ることはありません。もし興味があれば、Bash の man ページを見てください。)プロンプトを変えるには、PS1 を変えます。 実験してみるには、PS1 の文字列を直接プロンプトのところで変えてみて 下さい。結果がすぐに表れるでしょう。 (この変化は現在の環境を変えるだけで、ログアウトすれば なくなってしまいます。) もしプロンプトを永久に変えたければ、 /.bashrc に PS1 の新しい定義を 置いて下さい。もし、ルート権限を持っているなら、/etc/profile ファイルの 中の"PS1="の行を変えます。Linux のディストリビューションの種類に よっては(RedHat 5.1ではそうですが)/etc/bashrc が PS1 と PS2 の設定を 変えますので、注意してください。

はじめに注意しておきますが、PS1 の設定は他の環境変数と同様、環境に保存されて います。PS1 の設定をコマンドラインで変化させれば、プロンプトが変わります。 変更する前に現在のプロンプトを保存したければ、別の環境変数に保存しておいて ください。

[giles@nikola giles]$ SAVE=$PS1
[giles@nikola giles]$

もっとも簡単なプロンプトは1文字からなるものです。たとえば

[giles@nikola giles]$ PS1=$
$ls
bin   mail
$

簡単なプロンプトを実験するには、このようにコマンドラインで入れます。 ユーザーが入力する文字がプロンプトの直後に表れることに注意して下さい。 私は次のようにプロンプトを設定する方が好きです。

$PS1="$ "
$ ls
bin   mail
$ 

こうすることによって、プロンプトの次にスペースが置かれ、読みやすくなります。 もとのプロンプトに戻すには、保存しておいた変数を呼び出します。

$ PS1=$SAVE
[giles@nikola giles]$

2.5 Bashプロンプトのエスケープシーケンス

Bash には、プロンプトで使えるエスケープシーケンスが沢山あります。 Bash 2.02 の man ページをみると、

<!--
When executing interactively, bash  displays  the  primary
prompt  PS1  when  it  is ready to read a command, and the
secondary prompt PS2 when it needs more input to  complete
a  command.   Bash  allows these prompt strings to be cus-
tomized by inserting a number of backslash-escaped special
characters that are decoded as follows:
       \a     an ASCII bell character (07)
       \d     the  date  in  "Weekday  Month  Date" format
              (e.g., "Tue May 26")
       \e     an ASCII escape character (033)
       \h     the hostname up to the first `.'
       \H     the hostname
       \n     newline
       \r     carriage return
       \s     the name of the shell, the  basename  of  $0
              (the portion following the final slash)
       \t     the current time in 24-hour HH:MM:SS format
       \T     the current time in 12-hour HH:MM:SS format
       \@     the current time in 12-hour am/pm format
       \u     the username of the current user
       \v     the version of bash (e.g., 2.00)
       \V     the  release  of  bash, version + patchlevel
              (e.g., 2.00.0)
       \w     the current working directory
       \W     the basename of the current  working  direc-
              tory
       \!     the history number of this command
       \#     the command number of this command
       \$     if  the effective UID is 0, a #, otherwise a
              $
       \nnn   the character  corresponding  to  the  octal
              number nnn
       \\     a backslash
       \[     begin a sequence of non-printing characters,
              which could be used to embed a terminal con-
              trol sequence into the prompt
       \]     end a sequence of non-printing characters
-->
対話型で実行される時には、bash はコマンド待ちの状態で、一次
プロンプトの PS1 を表示し、コマンドを完成するのにさらに入力が
必要な時には二次プロンプトの PS2 を表示します。bash ではバック
スラッシュでエスケープした文字を挿入することにより、プロン
プトを修飾することができます。その意味は次のとおりです。
       \a     ASCII のベル文字 (07)
       \d     "曜日 月 日"のフォーマットによる日付け
              (例 "Tue May 26")
       \e     ASCII のエスケープ文字 (033)
       \h     最初の"."のところまでのホスト名
       \H     ホスト名
       \n     改行
       \r     復帰
       \s     シェル名、$0 のベース名
              (最後のスラッシュの後ろの部分)
       \t     24時間制の HH:MM:SS のフォーマットによる時間
       \T     12時間制の HH:MM:SS のフォーマットによる時間
       \@     am/pm をつけた12時間制のフォーマットによる時間
       \u     現ユーザーのユーザー名
       \v     bash のバージョン(例 2.00)
       \V     bash のリリース番号、バージョンとパッチレベル
              (例 2.00.0)
       \w     現在のディレクトリ
       \W     現在のディレクトリのベース名
       \!     現在のコマンドのヒストリー番号
       \#     現在のコマンドのコマンド番号
       \$     UIDが0なら#、そうでなければ$
       \nnn   8進数nnnに対応する文字
       \\     バックスラッシュ
       \[     表示されない文字列の開始。端末制御シーケンスを
              プロンプトに埋め込む。
       \]     表示されない文字列の終り。

それでは続きです。

[giles@nikola giles]$ PS1="\u@\h \W> "
giles@nikola giles> ls
bin   mail
giles@nikola giles>

これはデフォルトのプロンプトとほとんど変わりありません。そこで少し スタイルを変えてみましょう。

giles@nikola giles> PS1="[\t][\u@\h:\w]\$ "
[21:52:01][giles@nikola:~]$ ls
bin   mail
[21:52:15][giles@nikola:~]$ 

2.6 PS?文字列の設定を永続させる

多くの人、多くのディストリビューションが PS? 文字列を異なったところで 設定しています。一番多いのは、/etc/profile、/etc/bashrc、 /.bash_profile 及び /.bashrcです。Johan Kullstam ( johan19@idt.net)は書いています。

PS1 文字列は .bashrc で設定すべきです。非対話型 bash は PS1 の設定をクリアして
しまうからです。bash manページには、bashが対話型セッションにあるか、非
対話型(つまりスクリプト)セッションにあるかを知るよい方法がPS1が定義され
ているかどうかだと書いてあります。

これを私が理解したのはstartxがbashスクリプトで、startxはあなたのプロン
プトを消してしまいます。.profile(もしくは.bash_profile)でPS1を設定し、
コンソールでログインして、startxでXを起動すると、あなたのPS1は破壊され
てしまい、デフォルトのプロンプトに戻ります。

解決法の一つは、xtermやrxvtを-lsオプション付きで起動し、.profileファイ
ルを読み込むようにすることです。しかし、非対話型のシェルスクリプトによ
ってシェルが呼ばれる度にPS1が失われます。system(3)は sh -c を使いますが、
sh が bash なら PS1 が失われます。よりよい解決法は、PS1 の定義を .bashrc に
置くことです。これは bash が起動される度に読み込まれますので、PS1 のような
対話に必要なものを置くべき場所です。

したがって、「PS1=何たらかんたら」は、.profile ではなく、.bashrc に置か
れるべきです。

私は彼の説明を再現しようとして別の問題にぶちあたりました。私の PROMPT_COMMAND 変数(次に説明します)がなくなってしまうのです。この分野での私の知識は十分で ないので、Johan が言うようにしましょう。


次のページ 前のページ 目次へ