bash Install

sh では、チト使いにくいので、shell を bash に変更する。
4.0-RELEASE からは、tcsh がデフォルトでインストールされているが、3.0系列では sh と csh しかインストールされていない。4.0からは tcsh のドキュメントが日本語化されてるのかなぁ。かなり羨ましいかも。

package や ports でインストールすると、/usr/local/bin/bash として共有ライブ ラリを使うバイナリが作成されるので、tcsh に負けないため(?)にも /bin に共有ライブ ラリを使わない※1 shell としてインストールしてみる。

bash インストール

ports を make configure まで実行して、パッチあてなどをしてもらい、後は手作業で make, install する。

# cd /usr/ports/shell/bash2
# make configure
# cd work/bash-2.03
# make STATIC_LD="-static"
# install -c -s -m 0555 -o root -g wheel bash /bin/bash

/etc/shells の編集

FTPログイン等ではねられないように、/etc/shells に /bin/bash を書き加えておく。

# vi
 /bin/sh
 /bin/csh
 /bin/bash

/usr/share/skel/dot.bash_profile の作成

ユーザー用の雛形を /usr/share/skel※2 に作っておく。

~/.bash_profile は、ログインシェル※3の時だけ読み込まれる。
/usr/share/skel/dot.bash_profile はログイン時行いたい処理のみを書いておき、一般的な設定は ~/.bashrc を読み込んで実行する。

if [ "$PS1" ]; then
	PS1="\h\$ "
	IGNOREEOF=3
fi
[ -f ~/.bashrc ] && . ~/.bashrc

/usr/share/skel/dot.bashrc の作成

.bashrc は他シェルからから起動された場合に読み込まれるファイルだが、上記の .bash_profile からも読み込まれようにしたので、bash を使う場合必ず読み込まれることになる。

また、ここから、エイリアス設定用の .bash_aliases を更に読み込むようにしておく。

export PATH=:$HOME/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/bin:/usr/X11R6/bin
export MANPATH=/usr/share/man:/usr/X11R6/man:/usr/local/man
export LD_LIBRARY_PATH=/usr/X11R6/lib:/usr/local/lib

export BLOCKSIZE=K
export EDITOR=jvim3
export PAGER=jless
export TZ=JST-09:00
export TMPDIR=/tmp
umask 002

#LANG
if [ $TERM = cons25 ]; then
  export LANG=C
  export LC_ALL=C
else
  export LANG=ja_JP.EUC
  export LC_ALL=ja_JP.EUC
fi


## Editor
if [ $LANG = ja_JP.EUC ] && [ -x "`which `" ]; then
  export EDITOR=jee
else
  export EDITOR=ee
fi

## Pager
if [ -x "`which jless`" ]; then
  export PAGER=jless
elif [ -x "`which less`" ]; then
  export PAGER=less
else
  export PAGER=more
fi





## Perl5 の locale failed メッセージの抑制
export PERL_BADLANG=""

## no core dumps
ulimit -c 0



auto_resume=
notify=
history_control=ignoredups
command_oriented_history=

if [ "$PS1" ]; then
    ## An interactive shell
    FIGNORE="~:.o"
    HOSTFILE=/etc/hosts
    MAILPASS=/var/mail/$LOGNAME
    export PS1="\h:\u.\w\$ "
    PS2='> '
    PS4='+ '
    shopt -s mailwarn
    stty erase ^H

    ## Fix PWD.
    cd
    if [ "$OLDPWD" = "`pwd -P`" ]; then
        cd; export PWD
    else
        cd $OLDPWD
    fi

    if [ -f ~/.bash_aliases ]; then
        . ~/.bash_aliases
    fi
fi

この設定はあくまでも一例である。
環境変数等は自分の環境にあわせるように。

/usr/share/skel/dot.bash_aliases の作成

エイリアス定義用のファイルとして、/usr/share/skel/dot.bash_aliases を作成する。
この例では alias の他に、csh/tcsh 互換の setenv を関数として作っている。

alias   la="ls -a"
alias   ll="ls -al"
alias   ls="ls -F"
alias   po=popd
alias   pu=pushd
alias   which="type -path"

function setenv () {
    export $1="$2";
}

## ls or jls
if [ -x "`which jls`" ]; then
  alias ls='jls -F'
else
  alias ls='ls -GF'
fi

## jee
if [ $LANG = ja_JP.EUC ] && [ -x "`which jee`" ]; then
  alias ee='jee'
fi

## jless
if [ -x "`which jless`" ]; then
  alias less='jless'
fi

## jgrep
if [ -x "`which jgrep`" ]; then
  alias grep='jgrep'
fi

## ncftp3 or ncftp2
if [ -x "`which ncftp3`" ]; then
  alias ncftp='ncftp3'
elif [ -x "`which ncftp2`" ]; then
  alias ncftp='ncftp2'
fi

/usr/share/skel/dot.inputrc の作成

日本語入力のため .inputrc に 8bit char-code を通すように設定する

この設定を行うと、command line 編集で Meta-key が使えなくなることに注意。
その場合には、Meta-key は ESC にて代用すること。

#delete this 3 lines if you use Meta key in bash command line
set convert-meta off
set meta-flag on
set output-meta on

ここまでの作業は root で行うこと。dotファイルは 644 としておけばいいでしょ。

これで、システムへのインストールは終了したので、ユーザーとしての設定に入る。
ここからは、各ユーザーのアカウントで作業を行うこと。

個人用の環境設定

設定ファイルをコピーする

既にアカウントがあるなら、先に作った雛形をコピーしてくる。
これから作るユーザーには、自動的に雛形がコピーされるのでこの作業は必要ない。

$ cp /usr/share/skel/dot.bash_profile ~/.bash_profile
$ cp /usr/share/skel/dot.bashrc ~/.bashrc
$ cp /usr/share/skel/dot.bash_aliases ~/.bash_aliases
$ cp /usr/share/skel/dot.inputrc ~/.inputrc

個人用設定の追加

ここで個人用の設定を追加する。

これは備忘録であるから、筆者が行っている設定を書いておく。
ここでの変更は、ユーザーの環境・趣味・好みでいかように書き換えても構わない

~/.bashrc

kterm のタイトルバーを bash のプロンプト内容を反映させる
if [ "$TERM" = "kterm" ]; then
    PS1="\[\033]0;\u@\h:\w\007\]\h:\u.\w\$ "
else
    export PS1="\h:\u.\w\$ "
fi
バックグラウンドプロセスの終了を知らせる
set -o notify

~/.inputrc

ベル(^G) をビジブルベルに変更
set bell-style visible
C-p を入力済み文字列のヒストリー検索に変更
Control-p: history-search-backward
補完候補がある場合に即時表示
set show-all-if-ambiguous on

shellの変更

chsh コマンドで shell の変更をする。

$ chsh 
#Changing user database information for masaya.
Shell: /bin/bash
Full Name: Your Name
Office Location:
Office Phone:
Home Phone:
Other information:

編集が終わったら、再ログインし shell の変更を確認する。
環境変数 SHELL が /bin/bash になっていれば、shell の変更は完了。

$ echo $SHELL
/bin/sh
$ logout
FreeBSD/i386 (hostname) (tty??)
login: your account
Password: your password
$ echo $SHELL
/bin/bash

使い方

bash について一冊の本になるくらいだから、基本的なことのみ書いておく。
詳しく知りたい場合には、末尾の参考文献等を参考にするように。

キーバインドは、emacs と vi モードがあるが、emacs モードを常用しているので、vi モードについては記載しない。

コマンドライン編集

bash には、sh に比べて非常に強力なコマンドライン編集機能が備わっている。

コマンドライン編集
キー操作   機能
C-f forward-char カーソルを右に一文字分移動する
C-b backward-char カーソルを左に一文字分移動する
M-f forward-word カーソルを右に一単語分移動する
M-b backward-word カーソルを左に一単語分移動する
C-a beginning-of-line カーソルを先頭に移動する
C-e end-of-line カーソルを末尾に移動する
C-d delete-char カーソル位置の文字を消去する
C-k kill-line カーソルの右にある文字列を消去してバッファに入れる
C-u unix-line-discard カーソルの左にある文字列を消去してバッファに入れる
C-w unix-word-rubout カーソルの左にある単語を消去してバッファに入れる
C-y yank バッファに入れた文字列をヤンク
C-l clear-screen 画面をクリアする
C-z   ジョブを一時停止

コマンドヒストリー機能

また、強力なコマンドヒストリー機能も備わっている。

筆者の設定例では、history-search-backward を C-p にバインドして、入力文字列が無い状態からは一つ前の履歴に戻るように、入力文字列がある場合にはそれにマッチする履歴を後方検索するようにしている。

コマンドヒストリー機能
キー操作   機能
C-p previous-history 履歴を一つ戻る
C-n next-history 履歴を一つ進む
M-< beginning-of-history 履歴の先頭に移動
M-> end-of-history 履歴の最後に移動
C-r reverse-search-history 履歴の後方検索をする
C-s forward-search-history 履歴の前方検索をする
  history-search-backward 入力済文字列にマッチする履歴を後方検索
!!   最後のコマンドを実行する
!n   履歴n番のコマンドを実行する
!-n   現在のコマンドからn番前のコマンドを実行する
!string   文字列で始まる最後のコマンドを実行する
^string1^string2^   最後のコマンドの string1 を string2 に変 更したものを実行する

ファイル、コマンド名の補完機能

bash には打ち込まれた文字列から完全なファイル名やコマンド名に補完する機能が ある。

ファイル名やコマンド名の最初の数文字を入力し [Tab] を押すと、完全なファイル名 に補完する。 複数の候補がある場合にはエラーとして beep がなるが、もう一度 [Tab] を押すと、 候補の一覧を表示する。

この機能は他にも、シェル変数、ユーザー名、ホスト名なども補完する。

補完機能
キー操作   機能
TAB complete コマンド、ファイルの補完を行う
M-? possible-completions 補完候補のリストを一覧する
M-/ complete-filename ファイル名として補完を行なう
M-!   コマンドとして補完を行なう
M-Tab   Esc Tab 以前に実行したコマンドの補完を試みる

ジョブ制御

これは bash に限った機能ではないが、ついでに書いておく。

ジョブ制御コマンド
コマンド 機能
C-z フォアグラウンドのジョブをサスペンド
C-c フォアグラウンドのジョブを強制終了
jobs ジョブの一覧表示
bg サスペンド中のジョブをバックグラウンドで実行
fg サスペンド中のジョブをフォアグラウンドに
kill 強制終了

シェルの組み込みコマンド

ls や less 等の独立したコマンドとは別に、cd, echo 等のシェルに組み込まれている。

組み込みコマンドの一覧を表示
$ help
組み込みコマンドのヘルプ表示
$ help [command name]

参考文献

  1. bash man page, bash info
  2. GNU BASH
  3. Linux JF (Japanese FAQ) Project.
    Configuration HOWTO 日本語訳 4.1 bash(1)
  4. FreeBSD QandA
    QandA 359 kterm の中で日本語を入力すると化けてしまいます。
  5. Bash Prompt HOWTO

注釈

※1 共有ライブラリを使わない
共有ライブラリを使わないようにすれば、メモリの使用量は増えることになるが / パーティションだけマウントしてあればプログラムを実行することが出来る。
つまり、シングルユーザーモードでも bash を使うことが出来るようになる。
※2 /usr/share/skel
新規ユーザーのホームディレクトリの雛形をdot[filename]という名前で置いておく場所。
adduser でユーザーを追加したときに、ファイル名先頭の dot を消して、新規ユーザー のホームディレクトリにコピーされる。
だから、あまり極まった設定を書くのは避けて、新規ユーザーの雛形として一般的な初 期設定をするのにとどめる。
※3 ログインシェル
ログインシェルとは、「PCにログインした時に起動されるシェル」「シェル起動時 にオプションなどでログインシェルと指定されたシェル」のこと。
Window Manager 等から起動される xterm/kterm/eterm 等で動いている shell は、特にオプション指定が無い限りログインシェルではない。