意外と忘れがちな、「.bash_profile」と「.bashrc」
「.bash_profile」と「.bashrc」の使い分けや設定について解説します。合わせて「カスタムプロンプト」と「エイリアスの設定」についてもまとめました。
シェルとコマンドの関係については過去の投稿「Bashについて」をご覧ください。
目次
コマンドが保存されているディレクトリについて
bashの環境設定ファイルについて
「.bash_profile」「.bashrc」の内容を確認
カスタムプロンプトについて
カスタムプロンプトのカラー設定
エイリアスの設定
コマンドが保存されているディレクトリについて
普段何気なく使っているコマンドですが、実はさまざまなディレクトリに保存されています。
環境変数を理解するにあたってまずはコマンドが保存されているディレクトリを把握しておいてください。
/bin | 汎用(基本)コマンド |
---|---|
/sbin | 管理者用コマンド |
/usr/bin | アプリケーションで利用する汎用(基本)コマンド |
/usr/sbin | アプリケーションで利用する管理者用コマンド |
/usr/local/bin | 追加したソフトやパッケージ用のコマンド |
bashの環境設定ファイルについて
普段パスを指定すること無くコマンドを利用できるのは、ログイン時にコマンドへのパスが記述された設定ファイルを読み込んでいるからです。
以下の順序で設定ファイルを読み込んでいます。
ログイン時
1.「/etc/profile」の読み込み
このファイルはログイン時に読み込む全ユーザー共通の設定です。ここで基本的なコマンドにパスを通しています。
2.「.bash_profile」の読み込み
続いてユーザーのhomeディレクトリにある「.bash_profile」を読み込みます。
それがない場合は「.bash_login」。
それもない場合は「.profile」。
という順序でユーザー個別の設定を読み込みます。
なぜか3つも用意されていますが、ディストリビューションによって優先順位や有効なファイルが違うため、使い分ける必要があります。CentOSの場合は「.bash_profile」が存在する場合は、他の2つの設定ファイルを無視します。
これらのファイルはログイン時に一度だけ読み込まれます。
3.「.bashrc」の読み込み
続いて「.bashrc」を読み込みます。このファイルはbashが読み込まれる度に更新されます。「bash」とコマンドを打てば設定ファイルへの変更が反映されます。
4.「/etc/bashrc」の読み込み
このファイルにはシステム全体の関数とエイリアスに関する設定が記述されています。ここでデフォルトのプロンプトを決める「PS1」の設定などをしています。
ここまでで設定は終了です。
ログアウト時
「.bash_logout」の読み込み
最後、ログアウト時にhomeディレクトリにある「.bash_logout」が読み込まれます。通常画面をクリアする「/usr/bin/clear」が記述されています。
パスの確認
現在のユーザーのパスは以下のコマンドで確認できます。
echo $PATH
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/www/bin
この表示は「:(コロン)」区切りで以下のディレクトリにパスが通っていることを表しています。
- /usr/kerberos/bin
- /usr/local/bin
- /bin
- /usr/bin
- /home/www/bin
環境変数をリセットする際の注意
ユーザーを変更する際に「su」コマンドを使うと思いますが、「su」のあとに「-(ハイフン)」を付けることで、環境変数やホームディレクトリがリセットされます。
一般ユーザーの環境変数を保ったままrootユーザーにログインする
# su
一般ユーザーからrootユーザーの環境変数でログインする
# su -
一般ユーザーの環境変数でログインする
# su - hoge
特に一般ユーザーからrootユーザーに変更する際に「-(ハイフン)」を付けるのを忘れないようにしてください。
「.(ドット)」で始まるファイルの表示
「.(ドット)」で始まるファイルは隠しファイルなのでlsコマンドだけだと表示されません。「-a」オプションを付けると表示されます。
$ ls -a
. .bash_history .bashrc
.. .bash_profile .lesshst Maildir
「.bash_profile」「.bashrc」の内容を確認
基本的に「/etc/profile」と「/etc/bashrc」は全ユーザー共通で利用する設定ファイルで書き換えるのは推奨されていません。各ユーザーごとに異なる設定にする場合は各ユーザーのhomeディレクトリにある「.bash_profile(バッシュプロファイル)」もしくは「.bashrc(バッシュアールシー)」を編集します。
「.bash_profile」はログイン時に1度だけ読み込まれ、「.bashrc」はbashを起動するたびに読み込まれます。新しい環境変数を設定する場合、特に理由が無ければ「.bash_profile」にまとめて記述するのがお勧めです。
「.bash_profile」の内容
# .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin export PATH unset USERNAME
4~6行目の条件分岐はhomeディレクトリに「.bashrc」があったら読み込む。
10行目はhomeディレクトリに「bin」ディレクトリがあったら読み込む。
12行目はパスに関する記述を書き出す(有効にする)設定。
13行目はユーザーネーム変数の開放。(詳しくはわかりませんが「.bash_profile」等を取得するにはroot権限が必要で、そのあたりを個別のユーザーネームへ戻す設定だと思われます。ご存知のかたはコメントください。)
「.bashrc」の内容
# .bashrc # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi # User specific aliases and functions
4~6行目で「/etc/bashrc」が存在する場合に「/etc/bashrc」を読み込む。
という指定だけです。
カスタムプロンプトについて
プロンプトの表示が急に「-bash-3.2$」という表示になって困ったことはありませんか?そんな時はhomeディレクトリにある「.bash_profile」の設定を確認します。
よくあるコマンドプロンプトは以下のものです。
[root@example ~]#
「.bash_profile」に「PS1」と追記することでオリジナルのプロンプトを表示することができます。現在の設定がどのようになっているかは以下のコマンドで確認できます。
# echo $PS1
[¥u@¥h ¥W]¥$
ちなみに「PS1」というのはプライマリプロンプトを表しています。
「PS1」だけでなく「PS2」もあります。これは対話的なコマンドで継続して入力する際(telnetなど)に画面に現れる「>」の表記を変更することができます。PS3はselect文のプロンプト。PS4はbashのデバックモードのプロンプトです。
「.bash_profile」に追記する際は以下のように記述します。
例えば「.bash_profile」に以下のように追記すると日時が表示されます。
PS1="[¥d ¥t ¥u@¥h:¥w ] $ "
それぞれ解説すると
「\u」がユーザ名
「\h」がホスト名
「\W」が現在のディレクトリ
「\$」が一般ユーザー時に「$」、ルートユーザー時に「#」
という指定になっています。
編集を終えてプロンプト画面に移行しても、すぐには反映されません。以下のコマンドで設定を有効にする必要があります。(.bashrcに追記した場合はsource .bashrcとします)
# source .bash_profile
表示には以下のオプションが用意されています。
オプション一覧
\a | ベル(ビープ音)をならします(ASCII のベル文字 07) |
---|---|
\d | 曜日 月 日の形式の日付 |
\h | ホスト名(最初の . までの名前) |
\H | ホスト名 |
\n | 改行 |
\r | 復帰 |
\s | シェル名(標準だと -bash が表示) |
\t | 時刻 HH:MM:SS 形式(24時間) H = Hour = 時、M = Minutes = 分、S = Seconds = 秒 |
\T | 時刻 HH:MM:SS 形式(12時間) |
\@ | 時刻 am/pm をつけたもの。Lang=Jaの場合 HH:MM (午前|午後)となる。 |
\u | 現在のユーザー名 |
\v | bash のバージョン |
\V | bash のバージョン・リリース番号など詳細 |
\w | 現在のディレクトリ(フルパス) |
\W | 現在のディレクトリ名 |
\! | コマンドのヒストリー番号 |
\# | コマンドのコマンド番号(ログイン後何回実行したか) |
\$ | UID が 0 であれば『 # 』、それ以外は『 $ 』 |
\\ | バックスラッシュ |
\[ | 表示されない文字列(エスケープシーケンス/端末制御シーケンス)を埋め込む |
\] | 表示されない文字列の終わり |
日付を追加したカスタムプロンプト
特定の時間にコマンドを打つ場合に便利です。
ホームディレクトリにて
# vi .bash_profile
以下を追記します。
PS1="[¥d ¥t ¥u@¥h:¥w ] $ " # 表示例) [金 12月 28 17:45:03 hoge@example:~ ] $
実務者向けカスタムプロンプト
コマンドのヒストリー番号、ホスト名、カーネルのバージョン、コマンドの終了ステータスを表示します。環境の異なる複数のプロンプトを開いて使いこなしている場合に便利です。
kernel_version=$(uname -r) PS1="¥!|¥h|$kernel_version|¥$?> " # 表示例) 5|example.com|2.6.18-371.6.1.el5|0>
先頭の5はヒストリー番号。ホームディレクトリの「.bash_history」で参照できる。
末尾の0は終了ステータス。正常終了の時は0、異常終了の時は0以外の数字となる。コマンドによって異常時の終了ステータスは異なるので注意。
カスタムプロンプトのカラー設定
プロンプトのカラーはANSIエスケープシーケンスという形式で表記します。かなり特殊な形式で、構造が複雑になると可読性が悪く、厄介な形式です。
1度しっかりと定義について把握しておきましょう。
書式)赤い文字を表示する場合
¥e[0;30m
それぞれの要素は以下の様な意味を持ちます。
「\e[」制御シーケンス。いわゆるエスケープ文字。他にも「\033」とすることもできます。
「0」引数。(文字装飾を指定)
「;」区切り文字
「31」引数。(文字色)
「m」終了文字。
背景色を指定するには区切り文字をと引数を1つ増やします。
書式)青い背景に赤い文字を表示する場合
¥e[0;30;44m
カラー表示を終了するエスケープシーケンスという記述方法もあります。この記述移行、カラーは初期化されデフォルトの表示になります。
書式)エスケープシーケンス
¥e[0m
Linuxではあらかじめ以下のようにカラーが定義されています。
文字装飾
番号 | 表示例 | 説明 |
---|---|---|
0 | hoge | All attributes off(装飾なし) |
1 | hoge | Bold on(太字) |
4 | hoge | Underscore (on monochrome display adapter only)(下線) |
5 | hoge |
Blink on(点滅。仮想コンソールの多くは実際には点滅しません) |
7 | hoge | Reverse video on(反転文字。いわゆる選択状態) |
8 | hoge | Concealed on(背景色で塗りつぶす) |
文字色
番号 | 表示例 | 説明 |
---|---|---|
30 | hoge | Black |
31 | hoge | Red |
32 | hoge | Green |
33 | hoge |
Yellow |
34 | hoge | Blue |
35 | hoge | Magenta |
36 | hoge | Cyan |
37 | hoge | White |
背景色
番号 | 表示例 | 説明 |
---|---|---|
40 | hoge | Black |
41 | hoge | Red |
42 | hoge | Green |
43 | hoge |
Yellow |
44 | hoge | Blue |
45 | hoge | Magenta |
46 | hoge | Cyan |
47 | hoge | White |
それでは実際にプロンプトを3色にしてみましょう。
ホームディレクトリにある「.bash_profile」に追記します。
PS1="¥e[0;31m[¥e[0;34m¥u@¥e[0;32m¥h ¥W¥e[0;31m]¥$¥e[0m "
どうでしょうか。
はっきり言って分かりにくいですね。そんなときは「Arch Linuxのwiki」にあるカラーの定義を使わせてもらいましょう。
これも「.bash_profile」に追記して利用します。
Arch Linuxのwikiによるカラーとスタイルの定義
txtblk='¥e[0;30m' # Black - Regular txtred='¥e[0;31m' # Red txtgrn='¥e[0;32m' # Green txtylw='¥e[0;33m' # Yellow txtblu='¥e[0;34m' # Blue txtpur='¥e[0;35m' # Purple txtcyn='¥e[0;36m' # Cyan txtwht='¥e[0;37m' # White bldblk='¥e[1;30m' # Black - Bold bldred='¥e[1;31m' # Red bldgrn='¥e[1;32m' # Green bldylw='¥e[1;33m' # Yellow bldblu='¥e[1;34m' # Blue bldpur='¥e[1;35m' # Purple bldcyn='¥e[1;36m' # Cyan bldwht='¥e[1;37m' # White unkblk='¥e[4;30m' # Black - Underline undred='¥e[4;31m' # Red undgrn='¥e[4;32m' # Green undylw='¥e[4;33m' # Yellow undblu='¥e[4;34m' # Blue undpur='¥e[4;35m' # Purple undcyn='¥e[4;36m' # Cyan undwht='¥e[4;37m' # White bakblk='¥e[40m' # Black - Background bakred='¥e[41m' # Red bakgrn='¥e[42m' # Green bakylw='¥e[43m' # Yellow bakblu='¥e[44m' # Blue bakpur='¥e[45m' # Purple bakcyn='¥e[46m' # Cyan bakwht='¥e[47m' # White txtrst='¥e[0m' # Text Reset
上記定義を利用した例
PS1="$txtred[$txtblu¥u@$txtgrn¥h ¥W$txtred]¥$ $txtrst"
いくぶんわかりやすいですね。
よくあるわかりやすいプロンプト
ルートユーザーと一般ユーザーで色を分けるとひと目で分かるため便利です。(上記の定義を利用しています。)
一般ユーザー(みどり)
PS1="$bldgrn[¥u@¥h ¥W]¥$ $txtrst"
ルートユーザー(あか)
PS1="$bldred[¥u@¥h ¥W]¥$ $txtrst"
Linux Desktop Hacksで紹介されているカスタムプロンプト
現在のディレクトリを右上に表示してくれるスクリプトです。
あまりここまでカスタマイズすることも無い気がしますが、やればここまで出来るという例として掲載します。
function prompt_command { # Save current cursor position tput sc # backwash is where to set cursor (upper right side) # to write CWD [col=screen width - (CWD +2) for brackets] let backwash=$(tput cols)-$(echo $(pwd) | wc -m)-2 #position cursor at Y=0, X=calculated columr (see above) tput cup 0 ${backwash} #set foreground color and bold tput setaf 1; #Wrap path in brackets echo -n "[" # show path echo -n "$(pwd)" #show closing bracket echo -n "]" #return cursor to saved position tput rc } # Set prompt via function above PROMPT_COMMAND=prompt_command PURPLE="\[$(tput setaf 1 ;)\]" BLACK="\[$(tput setaf 0 ;)\]" NO_COLUR="\[$tput sgr0)\]" case "$TERM" in xterm*|rxvt*) TITLEBAR='\[\033]0;\u@\h \007\]' ;; *) TITLEBAR="" ;; esac PS1="$PURPLE\u \ $BLACK\$$NO_COLOUR " PS2='>' PS4='+'
エイリアスの設定
他にも「.bash_profile」にエイリアスの設定を書いておくと、よく使うコマンドを省略できるので便利です。
alias name=command
とすると有効になります。
よく定義されているのが
alias ls='ls -F --color=auto'
というリスト表示をカラフルに表示する設定です。
エイリアスの確認
設定したエイリアスを確認するには以下のコマンドを打ちます。
# alias
エイリアスを無効にする
エイリアスを無効にするには「\」を付けてコマンドを打ちます。
# ¥ls
設定を有効にする
設定を有効にするには再度ログインし直すか、以下のコマンドで有効になります。
$ source .bash_profile