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

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

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

前回の記事では、Linuxの環境変数であるPS[1-4]とPROMPT_COMMANDについて解説しました。PS1を効果的に活用すれば、コマンドプロンプト上に直接、有用な情報を表示させることができます。

映画『トゥームレイダー』のアンジェリーナ・ジョリーは、謎をスタイリッシュに解き明かすために、あらゆるガジェットや武器を自由に操ります。彼女の装備やスタイルに完全に匹敵するのは難しいとしても、せめて普段使いのLinuxプロンプトくらいは、この記事で紹介する10の実例を使って、高機能かつおしゃれにカスタマイズしてみてはいかがでしょうか。

1. ユーザー名・ホスト名・現在の作業ディレクトリを表示する

この例では、プロンプトに以下の3つの情報を表示します。

  • \u – ユーザー名
  • \h – ホスト名
  • \w – 現在の作業ディレクトリのフルパス
-bash-3.2$ export PS1="\u@\h \w> "

ramesh@dev-db ~> cd /etc/mail
ramesh@dev-db /etc/mail>

2. 現在時刻を表示する

PS1環境変数では、$(linux_command) の形式で記述することにより、任意のLinuxコマンドを直接実行できます。次の例では $(date) コマンドを実行し、プロンプト内に現在時刻を表示しています。

ramesh@dev-db ~> export PS1="\u@\h [\$(date +%k:%M:%S)]> "

ramesh@dev-db [11:09:56]>

また、\t を使えば「時:分:秒」形式で現在時刻を表示することもできます。

ramesh@dev-db ~> export PS1="\u@\h [\t]> "
ramesh@dev-db [12:42:55]>

さらに、\@ を使えば午前/午後付きの12時間形式で表示できます。

ramesh@dev-db ~> export PS1="[\@] \u@\h> "
[04:12 PM] ramesh@dev-db>

3. 任意のLinuxコマンドの出力結果を表示する

任意のLinuxコマンドの出力をプロンプトに表示できます。次の例では、パイプ(|)で区切った3つの項目をコマンドプロンプトに表示しています。

  • \!: コマンドの履歴番号
  • \h: ホスト名
  • $kernel_version: uname -r コマンドの結果を格納した変数の出力
  • \$?: 直前のコマンドの終了ステータス
ramesh@dev-db ~> kernel_version=$(uname -r)
ramesh@dev-db ~> export PS1="\!|\h|$kernel_version|\$?> "
473|dev-db|2.6.25-14.fc9.i686|0>

4. プロンプトの文字色(前景色)を変更する

ユーザー名・ホスト名・現在のディレクトリ情報とともに、プロンプトを青色で表示します。

$ export PS1="\e[0;34m\u@\h \w> \e[m"
[Note: 水色(ライトブルー)のプロンプトになります]

$ export PS1="\e[1;34m\u@\h \w> \e[m"
[Note: 濃い青(ダークブルー)のプロンプトになります]
  • \e[ – カラー指定の開始を示します
  • x;ym – カラーコードを指定します。後述のカラーコード表を参照してください
  • \e[m – カラー指定の終了を示します

カラーコード一覧:

Black 0;30
Blue 0;34
Green 0;32
Cyan 0;36
Red 0;31
Purple 0;35
Brown 0;33
[Note: 濃い色にしたい場合は 0 を 1 に置き換えてください]

設定を恒久化するには、以下の行を .bash_profile または .bashrc に追加します。

STARTCOLOR='\e[0;34m';
ENDCOLOR="\e[0m"
export PS1="$STARTCOLOR\u@\h \w> $ENDCOLOR"

5. プロンプトの背景色を変更する

PS1の中で \e[{code}m を指定することで、背景色を変更できます。

$ export PS1="\e[47m\u@\h \w> \e[m"
[Note: 明るいグレーの背景になります]

背景色と文字色の組み合わせ:

export PS1="\e[0;34m\e[47m\u@\h \w> \e[m"
[Note: 水色の文字+明るいグレーの背景になります]

上記の背景色・文字色の設定を恒久化するには、.bash_profile または .bashrc に以下を追加します。

STARTFGCOLOR='\e[0;34m';
STARTBGCOLOR="\e[47m"
ENDCOLOR="\e[0m"
export PS1="$STARTFGCOLOR$STARTBGCOLOR\u@\h \w> $ENDCOLOR"

以下の背景色コードをいろいろ試して、お好みのものを見つけてください。

  • \e[40m
  • \e[41m
  • \e[42m
  • \e[43m
  • \e[44m
  • \e[45m
  • \e[46m
  • \e[47m

6. プロンプトに複数の色を使う

同じプロンプト内で複数の色を表示することも可能です。以下の関数を .bash_profile に追加してください。

function prompt {
  local BLUE="\[\033[0;34m\]"
  local DARK_BLUE="\[\033[1;34m\]"
  local RED="\[\033[0;31m\]"
  local DARK_RED="\[\033[1;31m\]"
  local NO_COLOR="\[\033[0m\]"
  case $TERM in
    xterm*|rxvt*)
      TITLEBAR='\[\033]0;\u@\h:\w\007\]'
      ;;
    *)
      TITLEBAR=""
      ;;
  esac
  PS1="\u@\h [\t]> "
  PS1="${TITLEBAR}\
  $BLUE\u@\h $RED[\t]>$NO_COLOR "
  PS2='continue-> '
  PS4='$0.$LINENO+ '
}

再ログインすれば変更が反映されます。あるいは、以下のように .bash_profile を読み込んでから関数を実行します。

$. ./.bash_profile
$ prompt
ramesh@dev-db [13:02:13]>

7. tputコマンドでプロンプトの色を変更する

tputコマンドを使っても、PS1プロンプトの色を変更できます。

$ export PS1="\[$(tput bold)$(tput setb 4)$(tput setaf 7)\]\u@\h:\w $ \[$(tput sgr0)\]"

tputのカラー機能:

  • tput setab [1-7] – ANSIエスケープシーケンスで背景色を設定
  • tput setb [1-7] – 背景色を設定
  • tput setaf [1-7] – ANSIエスケープシーケンスで文字色を設定
  • tput setf [1-7] – 文字色を設定

tputのテキストモード機能:

  • tput bold – 太字モードに設定
  • tput dim – 半輝度(ハーフブライト)モードを有効化
  • tput smul – 下線モードを開始
  • tput rmul – 下線モードを終了
  • tput rev – 反転モードを有効化
  • tput smso – スタンドアウトモードに移行(rxvtでは太字)
  • tput rmso – スタンドアウトモードを終了
  • tput sgr0 – すべての属性をオフにする

tput用のカラーコード:

  • 0 – 黒(Black)
  • 1 – 赤(Red)
  • 2 – 緑(Green)
  • 3 – 黄(Yellow)
  • 4 – 青(Blue)
  • 5 – マゼンタ(Magenta)
  • 6 – シアン(Cyan)
  • 7 – 白(White)

8. 利用可能なコードを組み合わせてオリジナルのプロンプトを作る

以下のコードを組み合わせれば、機能的で自分好みのPS1 Linuxプロンプトを作成できます。日常的にどのコードが役立ちそうですか? あなたが実際に使っているPS1のコードを、ぜひコメント欄で教えてください。

  • \a ASCIIベル文字(07)
  • \d 「曜日 月 日」形式の日付(例:「Tue May 26」)
  • \D{format} – formatがstrftime(3)に渡され、その結果がプロンプト文字列に挿入されます。空のフォーマットを指定するとロケール固有の時刻表現になります。波括弧は必須です
  • \e ASCIIエスケープ文字(033)
  • \h ホスト名(最初のドットまで)
  • \H 完全なホスト名
  • \j シェルが現在管理しているジョブの数
  • \l シェルの端末デバイス名のベース名
  • \n 改行
  • \r キャリッジリターン
  • \s シェルの名前($0のベース名、最後のスラッシュ以降の部分)
  • \t 24時間制の「HH:MM:SS」形式の現在時刻
  • \T 12時間制の「HH:MM:SS」形式の現在時刻
  • \@ 午前/午後付き12時間形式の現在時刻
  • \A 24時間制の「HH:MM」形式の現在時刻
  • \u 現在のユーザー名
  • \v bashのバージョン(例:2.00)
  • \V bashのバージョン+パッチレベル(例:2.00.0)
  • \w 現在の作業ディレクトリ($HOMEはチルダで省略表示)
  • \W 現在の作業ディレクトリのベース名($HOMEはチルダで省略表示)
  • \! このコマンドの履歴番号
  • \# このコマンドのコマンド番号
  • \$ 実効UIDが0なら #、それ以外なら $
  • \nnn 8進数nnnに対応する文字
  • \\ バックスラッシュ
  • \[ 非表示文字シーケンスの開始(端末制御シーケンスをプロンプトに埋め込む際に使用)
  • \] 非表示文字シーケンスの終了

9. PS1変数内でBashシェル関数を使う

PS1の中でBashシェル関数を呼び出すこともできます。

ramesh@dev-db ~> function httpdcount {
>  ps aux | grep httpd | grep -v grep | wc -l
> }

ramesh@dev-db ~> export PS1="\u@\h [`httpdcount`]> "
ramesh@dev-db [12]>
[Note: 実行中のhttpdプロセスの総数が表示されます]

この設定を恒久化するには、以下の行を .bash_profile または .bashrc に追加します。

function httpdcount {
  ps aux | grep httpd | grep -v grep | wc -l
}
export PS1='\u@\h [`httpdcount`]> '

10. PS1変数内でシェルスクリプトを使う

PS1変数の中でシェルスクリプトを呼び出すことも可能です。次の例では、現在のディレクトリ内の合計ファイルサイズを計算する ~/bin/totalfilesize.sh を、PS1変数内で呼び出しています。

ramesh@dev-db ~> cat ~/bin/totalfilesize.sh

for filesize in $(ls -l . | grep "^-" | awk '{print $5}')
do
  let totalsize=$totalsize+$filesize
done
echo -n "$totalsize"

ramesh@dev-db ~> export PATH=$PATH:~/bin
ramesh@dev-db ~> export PS1="\u@\h [\$(totalfilesize.sh) bytes]> "
ramesh@dev-db [534 bytes]> cd /etc/mail
ramesh@dev-db [167997 bytes]>
[Note: totalfilesize.shが実行され、現在のディレクトリの
       合計ファイルサイズがPS1プロンプトに表示されます]

あなたのPS1はどれだけカスタマイズしていますか? そのPS1はアンジェリーナ・ジョリーに勝てますか? ぜひコメントであなたのPS1の値を共有してください。

おすすめの書籍

『Bash Cookbook』(Carl Albing、JP Vossen、Cameron Newham 著)。Bashは非常に強力なシェルです。この本を読めば、Bashシェルをマスターし、生産性を大幅に向上させることができます。システム管理者、DBA、開発者を問わず、誰もがどこかのタイミングでシェルスクリプトを書くことになります。賢いシステム管理者は、シェルスクリプトのテクニックを習得すれば、単純作業をシェルスクリプトに任せてサーバーを自動運転モードにできることを知っています。その自動運転モードに到達するためには、このクックブックに収録された実例を確実にマスターする必要があります。Bash関連の書籍は少なくありませんが、詳細なサンプルを多数掲載している点で、本書は群を抜いています。

その他のLinux書籍のおすすめについては、「12 Amazing and Essential Linux Books To Enrich Your Brain and Library」も参考にしてください。

この記事が役に立ったと思ったら、del.icio.usへのブックマークやStumbleでの共有をお願いします。

  1. Windows 10にBash(Linuxシェル)をインストールして使う方法【WSL完全ガイド】

    Windows上でLinuxシェルをセットアップして使う方法を、Windows Subsystem for Linux(WSL)を使って解説します。 このチュートリアルは、2020年以降にリリースされた最新版のWindows 10を対象としています。古いバージョンのWindows 10でのWSLの使い方や、Windows 8/7/XP向けの別の方法については扱いません。サポートが終了したソフトウェアの使用は避けるべきだからです。どうしてもWindowsを使わなければならない場合は、必ずセキュリティ更新プログラムが提供されているバージョンを使用してください。 WSLは非常に優れたツールで、まるで

  2. Bashシェル関数入門:実用的な6つのサンプル例で学ぶチュートリアル

    Bashシェル関数とは、複数のUNIX/Linuxコマンドをひとつの名前でグループ化し、後からまとめて実行できるようにする仕組みです。Bashシェル関数は通常のUnixコマンドと同じように呼び出すことができ、現在のシェルコンテキスト内で実行されるため、解釈用の新しいプロセスを生成する必要がありません。bashのエイリアス(alias)と関数はどちらも、長いコマンドや複雑なコマンドに対するショートカットを定義するのに役立ちます。しかし、エイリアスでは制御フローや引数の扱いなど、関数ならではの高度な処理を行うことはできません。本記事では、その違いも含めて詳しく解説していきます。この記事は、進行中の