« テレビ番組等感想 その 216 | トップページ | Yash 2 その 124 »

2009年7月28日 (火)

Yash 2 その 123: $COMMAND_NOT_FOUND_HANDLER

実行しようとしたコマンドが見つからなかったときに $COMMAND_NOT_FOUND_HANDLER 変数の中身が実行されるようにした。

コマンドが見つからなかったときにこの名前の変数 (または配列) があると、その値がコマンドとして解釈されて実行される。このハンドラの実行時には新しい変数環境ができるので、ハンドラ内でローカル変数を作成することもできる。また位置パラメータは実行しようとして見つからなかったコマンド名とその引数になっているので、コマンド名を見て処理を振り分けることもできる。ハンドラの環境には位置パラメータの他に $HANDLED というローカル変数が定義されている。最初この変数は空文字列になっていて、ハンドラ終了後も空文字列のままならばいつも通り no such command のメッセージが出て終了ステータスは 127 になる。ハンドラ内で $HANDLED に非空文字列を代入すると、メッセージは出ずにハンドラの終了ステータスが見つからなかったコマンドの終了ステータスとして返る。

この新しい機能を使って、この前廃止した autocd オプションと同様の効果を得るには、例えば以下のようにする

COMMAND_NOT_FOUND_HANDLER='[ -d "$1" ] && HANDLED=1 && cd "$@"'

ちなみに bash 4 にも似たような機能があって、コマンドが見つからなかったときは command_not_found_handle という関数が実行される。また zsh にも似たような機能があって、コマンドが見つからなかったときは command_not_found_handler という関数が実行される。コマンドが見つからなかったときに何か代わりのコマンドを実行するという点では bash や zsh のように関数を実行するようにしてもよいのだが、yash では変数の値を解釈して実行するようにした (作業ディレクトリ変更後に実行する $YASH_AFTER_CD 変数と同様)。

|

« テレビ番組等感想 その 216 | トップページ | Yash 2 その 124 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: Yash 2 その 123: $COMMAND_NOT_FOUND_HANDLER:

« テレビ番組等感想 その 216 | トップページ | Yash 2 その 124 »