序章


Linuxサーバーを管理するときは、コマンドラインを使用するのにかなりの時間を費やします。 ほとんどの人にとって、これはBashシェルで多くの時間を費やすことを意味します。

ほとんどのディストリビューションでは、ユーザープロンプトとルートプロンプトのスタイルに適切なデフォルトが用意されていますが、プロンプトをカスタマイズして独自の設定を追加すると便利な場合があります。 高度な特権で操作しているときに、方向性を維持し、思い出させるのに役立つ多くの有用な情報を含めることができます。

実験にはUbuntu12.04VPSを使用しますが、ほとんどすべての最新のLinuxディストリビューションは同様の方法で動作するはずです。

シェルがBashであることを確認します


シェルを実際にカスタマイズする前に、現在のシェルが実際にBashであることを確認する必要があります。

これは大多数のシステムに当てはまるはずですが、ディストリビューションメンテナが別のシェルを選択したり、ユーザーが新しいシェルをテストしたりすることもあります。

/etc/passwdファイルを確認することで簡単に確認できます。 次のようなポケットベルでファイルを開きます。

less /etc/passwd

このファイルの各行には、異なるユーザーに関する情報が含まれています。 コロン(:)で区切って、最初の列でユーザーとrootユーザーを見つけます。 最後のフィールドには、そのユーザーのデフォルトのログインシェルが表示されます。

root:x:0:0:root:/root:/bin/bash
. . .
demouser:x:1000:1000:,,,:/home/demouser/bin/bash

最後のフィールドが/bin/bashの場合、これですべて設定されています。

最後のフィールドがnot /bin/bashで、デフォルトのシェルをBashに変更する場合は、root権限でこのファイルを編集し、ユーザーに関連付けられている最後のフィールドを変更できます。

sudo nano /etc/passwd

変更を加えたら、ログアウトしてから再度ログインして、Bashシェルを使用します。

現在の値を見る


開始するには、Bashプロンプトを定義するために、構成ファイルにすでに含まれているものを調べてみましょう。

Bashは、PS1およびPS2環境変数を使用してプロンプトを構成します。

PS1は、表示されるプライマリプロンプトを定義します。 ログインするたびにこれが表示されます。 デフォルトでは、Ubuntuシステムでは、これは次の形式をとる必要があります。

ユーザー名@ホスト名current_directory $

最後の$に注意してください。 これは、シェルが通常のユーザーシェルであることを意味します。 rootユーザーの場合、これは#に置き換えられ、昇格された特権で操作していることを区別して認識できるようになります。

PS2プロンプトは、複数行のコマンドに使用されます。 ターミナルに次のように入力すると、現在のPS2変数が何に設定されているかを確認できます。

echo \

バックスラッシュの直後にEnterキーを押すと、プロンプトが表示されます。 デフォルトでは、Ubuntuではこれは>です。

通常、これらの変数が保持するものを~/.bashrcファイルで定義します。このファイルは、対話型シェルの起動時に読み取られます。

Ubuntu 12.04のこのファイル内には、次のようなセクションがあります。

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
# force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
        # We have color support; assume it's compliant with Ecma-48
        # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
        # a case would tend to support setf rather than setaf.)
        color_prompt=yes
    else
        color_prompt=
    fi
fi

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\[email protected]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\[email protected]\h:\w\$ '
fi
unset color_prompt force_color_prompt

プロンプトがいつ色付けされるかを指示するロジックを見ることができます。 色付きのプロンプトが必要な場合は、force_color_prompt=yes行のコメントを解除する必要があります。 これを今すぐ実行して、後で行うカスタマイズを利用します。

force_color_prompt=yes

私たちが気にする部分は、プロンプトを設定する部分です。 これは、色を使用しているかどうかに基づいて異なるプロンプトを持つif-else構造にネストされています。

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\[email protected]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\[email protected]\h:\w\$ '
fi
unset color_prompt force_color_prompt

上部のセクションはカラーサポートを追加します。 最初にいくつかの基本を理解するために、色なしで2番目のセクションを見てみましょう。

PS1='${debian_chroot:+($debian_chroot)}\[email protected]\h:\w\$ '

これはかなり複雑に見え、通常のシェルの使用法で見られるものと一致しないように見える部分がいくつかあります。

debian_chrootを含む部分は、ルート変更環境で操作している場合、プロンプトが変更されて通知されることを示しています。 これは便利な機能であるため、プロンプトのこの部分はそのままにしておくことをお勧めします。

プロンプト定義の残りの部分は次のようになります。

\[email protected]\h:\w\$: 

これは、いくつかのエスケープシーケンスを使用して、これまでずっと表示されてきた主要なプロンプトについて説明しています。

Bashエスケープシーケンス


可能なエスケープシーケンスの全リストは、Bashのmanページにあります。

 \ a ASCIIベル文字(07)\ d「平日月日」形式の日付(例:「5月26日火曜日」)\ D {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時間am/pm形式の現在時刻\A現在時刻24時間HH:MM形式\u現在のユーザーのユーザー名\v bashのバージョン(例:2.00)\ V bashのリリース、バージョン+パッチレベル(例:2.00.0)\w現在の作業ディレクトリ、$ HOMEがtildeで省略されている(PROMPT_DIRTRIM変数の値を使用)\ W現在の作業ディレクトリのベース名、$ HOMEがtildeで省略されている!     このコマンドの履歴番号#このコマンドのコマンド番号有効なUIDが0の場合は$、それ以外の場合は#$\nnn8進数に対応する文字nnn\バックスラッシュ[非印刷文字のシーケンスを開始します。これは、端末制御シーケンスをプロンプトに埋め込むために使用できます]非印刷文字のシーケンスを終了します

ご覧のとおり、いくつかの基本的な情報と、おそらく必要のない情報(ASCIIベル文字、Bashのバージョンなど)があります。

現在、プロンプトには、ユーザー名(\ u)、@記号、ホスト名の最初の部分(\ h)、現在の作業ディレクトリ(\ w)、そして最後に通常のユーザーの場合は「$」、「# rootユーザーの場合は」。

~/.bashrcファイルを終了して、他のオプションのいくつかをテストできるようにします。

新しいBashプロンプトのテスト


最終的には~/.bashrcファイルを編集して選択内容を永続的にする必要がありますが、コマンドライン自体からプロンプトを変更してみる方がはるかに簡単です。

変更を開始する前に、PS1の現在の値を新しい変数に保存しましょう。 これにより、間違えた場合にログアウトして再度ログインしなくても、元のプロンプトに簡単に戻すことができます。

ORIG=$PS1

これで、ORIGという環境変数が作成され、デフォルトのプロンプトのコピーが保存されます。

元のプロンプトに戻す必要がある場合は、次のように入力できます。

PS1=$ORIG

ユーザー名と実際のプロンプト用の$を用意するだけで、簡単に始めましょう。

PS1="\u$"

次のようなものを取得する必要があります。

demouser$

見栄えを良くするために少しスペースを空けましょう。

PS1="\u $: "

demouser $:

ただし、「$」リテラル文字は使用したくないでしょう。 代わりに、\$エスケープシーケンスを使用する必要があります。 これにより、ルートであるかどうかに基づいてプロンプトが動的に変更され、PS1をルートとして正しく使用できるようになります。

PS1="\u \$: "

プロンプトに任意のリテラル文字列を追加できます。

PS1="Hello, my name is \u! \$: "

Hello, my name is demouser! $:

通常のシェル機能を使用して、任意のコマンドの結果を挿入することもできます。

ここでは、バッククォートを使用して/proc/loadavgにある負荷メトリックの最初の列をプルし、コマンドの結果を挿入することで、サーバーの現在の負荷をプロンプトに表示させることができます。

PS1="\u, load: `cat /proc/loadavg | awk '{ print $1; }'` \$: "

demouser, load: 0.01 $:

これは、システムに負担をかけているかどうかを知る良い方法です。

プロンプトに日付または時刻を含めることが重要な場合は、次のような方法を試すことができます。 また、データを整理するために、いくつかの角かっことかっこでデータを少し区分してみましょう。 また、\wを追加して、作業ディレクトリを追跡します。

PS1="[\[email protected]\h, load: `cat /proc/loadavg | awk '{ print $1; }'`] (\d - \t) \w \$ "

[[email protected], load: 0.01] (Thu Feb 20 - 13:15:20) ~ $

これは、特にディレクトリを長いパスを持つものに変更する場合、少し扱いにくくなり始めています。

cd /etc/systemd/system/multi-user.target.wants

[[email protected], load: 0.01] (Thu Feb 20 - 13:18:28) /etc/systemd/system/multi-user.target.wants $

この情報をすべて必要としているが、短くしたい場合、1つの戦略は、情報を\n改行文字で2行に分割することです。

PS1="[\[email protected]\h, load: `cat /proc/loadavg | awk '{ print $1; }'`] (\d - \t)\n\w \$ "

[[email protected], load: 0.00] (Thu Feb 20 - 13:20:00)
/etc/systemd/system/multi-user.target.wants $

複数行のプロンプトを嫌う人もいますが、これはプロンプトでより多くの情報を提供する1つの方法です。

プロンプトの色を変更する


プロンプトに影響を与えるさまざまな方法を十分に理解したので、色付けを試してみましょう。

Bashを使用すると、特別なコードを使用してプロンプトに色を導入できます。 選択されたコードはあまり説明的ではないため、これらはしばしば混乱の原因になります。

実際のカラーコードに到達する前に、実際にどのように実装するかについて話し合う必要があります。 Bash設定でカラーコードを定義する正しい方法と間違った方法があります。

まず、カラーコードの説明全体を\[および\]タグで囲む必要があります。 これらの括弧は、最初のシーケンスの後に最後のシーケンスまでに存在する文字を非印刷文字と見なす必要があることをbashで示します。

Bashはこれを知って、次の行に折り返す前に印刷できる文字数を見積もることができるようにする必要があります。 カラーコードを\[および\]タグで囲まないと、Bashはすべての文字をリテラル文字としてカウントし、行を折り返すのが早すぎます。

次に、ブラケットの非印刷シーケンス内で、\e[または\033[のいずれかを入力して、カラープロンプトの先頭を指定する必要があります。 これらは両方とも同じことを行い、エスケープシーケンスの開始を示します。 このガイドでは\e[を使用します。これは、もう少し明確だと思うからです。

\]の前に、カラーシーケンスを指定していることを示す「m」が必要です。

したがって、基本的に、色を変更するたびに、プロンプトに次のようなものを入力する必要があります。

[\ e [ color_information m]

ご覧のとおり、これはプロンプトを特に乱雑にする部分です。

カラーコードについては、前景テキストの色を変更するための基本的なコードは次のとおりです。

  • 30 :黒
  • 31 :赤
  • 32 :緑
  • 33 :黄色
  • 34 :青
  • 35 :パープル
  • 36 :シアン
  • 37 :白

これらの基本値を変更するには、基本値の前にセミコロン(;)で区切って「属性」を設定します。

使用している端末の種類に応じて、これらの動作はかなり異なります。 より一般的な属性のいくつかは次のとおりです。

  • 0 :通常のテキスト
  • 1 :端子に応じて太字または淡色
  • 4 :下線付きテキスト

したがって、下線付きの緑色のテキストが必要な場合は、次のようなシーケンスを使用します。

\[\e[4;32m\]

次に、必要なプロンプトを入力します。 その後、端末に入力するテキストの色がおかしくなることがないように、色を元の値にリセットする必要があります。

これを行うには、Bashがプロンプトの色をリセットする必要があることを示す別のカラーコードを使用します。 このコードは次のとおりです。

\[\e[0m\]

したがって、ユーザー名とホストを含む単純な色付きのプロンプトは、次のようになります。

PS1="\[\e[4;32m\]\[email protected]\h\[\e[0m\]$ "

さらに複雑にするために背景色を指定することもできます。 背景色は属性を取ることができません。 彼らです:

  • 40 :黒の背景
  • 41 :赤い背景
  • 42 :緑の背景
  • 43 :黄色の背景
  • 44 :青色の背景
  • 45 :紫色の背景
  • 46 :シアンの背景
  • 47 :白い背景

背景色、属性、テキストの色をすべて一度に指定できますが、次のようになります。

\[\e[42;1;36m\]

通常、背景情報を他の情報から分離すると、より適切に機能します。

\[\e[42m\]\[\e[1;36m\]

「通常の」テキスト属性(0)を使用しているだけの場合、一部の端末で色が文字化けすることがあります。 とにかくデフォルトであるため、0で通常の値を指定しないことでこれを回避できます。

迅速な変更を永続的にする


プロンプトをしばらく試してみたので、プロンプトをどのように表示するかについての良いアイデアが必要です。 色付きのプロンプトと色なしのプロンプトの両方を作成できるはずです。

この例では、次の色付きのプロンプトを使用します。

PS1="[\[\e[0;32m\]\[email protected]\h, load: `cat /proc/loadavg | awk '{ print $1; }'`\[\e[00m\]] (\[\e[00;35m\]\d - \t\[\e[00m\])\n\w \$ "

色付きのbashプロンプトを表示したくない場合は、色なしの同等のものも使用します。

PS1="[\[email protected]\h, load: `cat /proc/loadavg | awk '{ print $1; }'`] (\d - \t)\n\w \$ "

必要なプロンプトの両方のバージョンができたので、~/.bashrcファイルのPS1を編集できます。

nano ~/.bashrc

最初に説明したように、ファイルにあるプロンプトには、chroot環境にいるときにそれを明らかにする機能が含まれています。 その部分はに残しましょう。 今はこんな感じです:

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\[email protected]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\[email protected]\h:\w\$ '
fi
unset color_prompt force_color_prompt

現在のPS1割り当てをコメントアウトし、以下のdebian_chrootロジックをコピーして、次のようにします。

 if [“ $ color_prompt” = yes]; 次に#PS1 ='$ {debian_chroot:+($ debian_chroot)} [\ 033 [01; 32m] \ u @ \ h [\ 033 [00m]:[\ 033 [01; 34m] \ w [\ 033 [00m ] $' PS1 ='$ {debian_chroot:+($ debian_chroot)}' else#PS1 ='$ {debian_chroot:+($ debian_chroot)} \ u @ \ h:\ w $' PS1 ='$ {debian_chroot:+ ($ debian_chroot)}' fi unset color_prompt force_color_prompt

プロンプトの最後、最後の見積もりが終了する直前に、実装するプロンプトを追加できます。 実際、プロンプトは一重引用符を使用しているため、現在のプロンプトの引用符タイプを変更して二重引用符を使用します。

最初のPS1割り当てでは、色付きバージョンのプロンプトを使用します。 2つ目は、色のないものを使用します。

 if [“ $ color_prompt” = yes]; 次に#PS1 ='$ {debian_chroot:+($ debian_chroot)} [\ 033 [01; 32m] \ u @ \ h [\ 033 [00m]:[\ 033 [01; 34m] \ w [\ 033 [00m ] $'PS1 = " $ {debian_chroot:+($ debian_chroot)} [[\ e [0; 32m] \ u @ \ h、ロード:cat /proc/loadavg | awk '{ print $1; }'  [\ e [00m]]([\ e [00; 35m] \ d-\ t [\ e [00m])\ n \ w $ " else#PS1 ='$ {debian_chroot:+($ debian_chroot)} \ u @ \ h:\ w $'PS1 = " $ {debian_chroot:+($ debian_chroot)} [\ u @ \ h、ロード:cat /proc/loadavg | awk '{ print $1; }'  ](\ d-\ t)\ n \ w $ " fi unset color_prompt force_color_prompt

終了したら、ファイルを閉じて保存できます。

これで、ログアウトして再度ログインすると、プロンプトが設定した値に変わります。

結論


構成をパーソナライズする方法はたくさんあります。 特定のアイテムに色を付けると、それらを目立たせることができ、端末の履歴をスクロールするときに最後のプロンプトを見つけるのに役立ちます。

もう1つの一般的なアイデアは、rootユーザーに特別なプロンプトを提供して、コントラストが特権を思い出させるようにすることです。 創造力を発揮して、役立つ情報と雑然とした情報のバランスをとってみてください。

ジャスティン・エリングウッド