sh では、チト使いにくいので、shell を bash
に変更する。
4.0-RELEASE からは、tcsh がデフォルトでインストールされているが、3.0系列では sh と csh しかインストールされていない。4.0からは
tcsh のドキュメントが日本語化されてるのかなぁ。かなり羨ましいかも。
package や ports でインストールすると、/usr/local/bin/bash として共有ライブ ラリを使うバイナリが作成されるので、tcsh に負けないため(?)にも /bin に共有ライブ ラリを使わない※1 shell としてインストールしてみる。
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
FTPログイン等ではねられないように、/etc/shells に /bin/bash を書き加えておく。
# vi /bin/sh /bin/csh /bin/bash
ユーザー用の雛形を /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
.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 を作成する。
この例では 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
日本語入力のため .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
ここで個人用の設定を追加する。
これは備忘録であるから、筆者が行っている設定を書いておく。
ここでの変更は、ユーザーの環境・趣味・好みでいかように書き換えても構わない
if [ "$TERM" = "kterm" ]; then PS1="\[\033]0;\u@\h:\w\007\]\h:\u.\w\$ " else export PS1="\h:\u.\w\$ " fi
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 等のシェルに組み込まれている。