ksh でも便利に生活できるか

ここでは、(もちろん vi モードで) ksh で生活しようと試みる場合の小技を紹介する。

vi モードの使用

zsh には及ばないものの、vi モードはある。vi モードにしておけば、 vi チックなコマンドライン編集ができる。vi モードにするには、

% set -o vi

これだけでよい。 あとは ESC を打って k なり j なりすれば、なんとなく使い方がわかるだろう。

zsh の vi モードはカーソルが行末に出るが、 ksh では行頭に出るので違和感がある。これは慣れるしかない。

history の使用

デフォルトで history 機能が有効になっている。

% history       直近の 16 個を表示する
% history -n    直近の n 個を表示する
% r             直前のコマンドを再実行する
% r n           ヒストリの中の n 番を再実行する
% r ls          ヒストリの中の直近の ls で始まるコマンドを再実行する

知ってると知らないでは大違いである。

ちなみに history コマンドは 実は fc -l の alias である。 ちなみにちなみに r コマンドは 実は fc -e - の alias である。

コマンド行編集の使用

ksh では fc というコマンドで、直前のコマンドの編集ができる。 長い長いコマンドでも、エディタで編集できるので便利である。

% FCEDIT=/usr/bin/vi       エディタの指定(デフォルトは ed)
% export FCEDIT
% fc                       直前コマンドの編集と実行
% fc n                     ヒストリの中の n 番の編集と実行

エディタに vi を使用する場合、 :q! などで中断したつもりでも バッファに書かれた内容は実行されてしまう。 これは直感的でないので、注意が必要だ。 全行を消して :wq! するとか、行頭に : を入れるとか、 回避方法を指に覚えさせておくとよい。

また、「fc」自体はヒストリに登録されない。 「fc -l」のように引数を与えると、ヒストリに登録される。

補完の使用

zsh や tcsh では TAB キーで補完ができるが、ksh の補完は若干ややこしい。 まず、コマンド名の補完はできない。ファイル名の補完しかできない。 ファイル名の補完については、以下のように動作する。

% ls /usr/local/b[ESC][\]
  ↓
% ls /usr/local/bin/

こんな感じで、ESC と バックスラ を叩く必要がある。 2打必要なので、あまり便利とは感じない。 cd 先が log だったか logs だったか記憶に定かでない…といったケースでは有用か。 ちなみに emacs モードの場合は、ESC を2回たたく。

ファイル名の補完ができる…と言っても、候補が特定できない場合は、そこまでしか 補完されない。

% ls /usr/ja[ESC][\]
  ↓
% ls /usr/java

ここで、ESC と = を叩くと、リストが出る。

% ls /usr/java[ESC][=]
1) java5/
2) java5_64/
3) java6/
% ls /usr/java

こんな感じだ。ESC-\ と ESC-= を組み合わせで覚えておけば、 かなり便利になるはずだ。

ちなみに HHK では = と \ は隣同士。 マニュアルを読まない我輩が ESC-= のキーバインドを発見したのは、偶然である。

エイリアス

alias の登録は直感的である。

% alias                    alias の一覧
% alias ls='ls -AF'        alias の登録
% ls                       alias を実行
% \ls                      alias をバイパスして実行
% unalias ls               alias の解除

zsh 同様、function も登録することができる。 こちらは スクリプトに書いておいて . で読み込ませるのが現実的だろう。

% cat /tmp/a
loggingecho() {
  echo "[`date '+%Y-%m-%d %H:%M:%S'`] $*"
}
% . /tmp/a
% typeset -f 
function loggingecho
{
  echo "[`date '+%Y-%m-%d %H:%M:%S'`] $*"
}
% loggingecho hogehoge
[2009-04-30 17:42:31] hogehoge
% alias echo=loggingecho
% echo hogehoge
[2009-04-30 17:42:47] hogehoge

こんな具合である。

プロンプト

sh 系ということで、PS1 に設定してあげればプロンプトを変更できる。

% PS1=`hostname`' % '
garnet %
% PS1=`hostname`':$PWD [!]: '
garnet:/usr/local/bin [768]:

色々なことができそうだが、あまり凝ったことはしない方がよいだろう。

参考

[$Revision: 1.2 $ $Date: 2013.03.29 02:21:54 $]
[EOF]