« テレビ番組等感想 その 140 | トップページ | テレビ番組等感想 その 141 »

2008年10月 5日 (日)

Yash 2 その 65: echo コマンド

echo コマンドを付けた。

シェルの仕事はプログラムを実行すること、すなわち fork と exec を行うことであるが、一般的に fork と exec はどちらもシステムコールとしてはかなり重い部類に入る。実際、fork と exec を一回づつ行っている間に read や write を数十回あるいは数百回くらい呼び出せる。read や write もシステムコールであって、それ自身重い処理であるが、fork と exec はそれよりもさらに何倍も重いのだ。従って、シェルの動作を速くする手っ取り早い方法は fork と exec をしないようにするという、シェルの存在意義に真っ向から対立する結論を得る。

多くの既存のシェルが採用している妥協策は、幾つかの簡単なコマンドをシェル自身に組み込んでしまうというものである。コマンドをシェルに組み込めば、fork と exec をせずにコマンドを実行できるので、動作速度が大きく向上できる。全てのコマンドを組み込むことは当然不可能だが、ほんの僅かな種類のコマンドだけでも、それがよく使われるものならば、大きな効果が望める。Bash や zsh では、true、echo、printf、test などが組み込みになっている。Ksh では更に cat や sleep なども組み込める。

Yash では既に true や false が組み込み済み。今日 echo の組み込みができたので、次は printf と test に取り掛かる。

echo は非常に有名でよく使われるコマンドであるにもかかわらず、コマンドライン引数の解釈法は完全には統一されていない。具体的な問題点は以下の二つ。

  • 最初の引数が -n のとき、それは最後の改行を出力しないようにする特殊なオプションなのか、それともそのまま -n を出力するのか。
  • 引数内にあるバックスラッシュエスケープを処理するかどうか。一切処理しないのか、常に処理するのか、-e と -E オプションを使って処理の有無を指示できるようにするのか。

これらは全く統一されていないので、混乱を招く。BSD の外部コマンドでは、-n はオプションとして扱われ、バックスラッシュエスケープは一切働かない。System V の外部コマンドでは -n はオプションではなく、バックスラッシュエスケープは常に働く。GNU core utilities の外部コマンドおよび bash の内部コマンドでは -n、-e、-E オプションがどれも使えて、エスケープは働かないのがデフォルト。Dash の内部コマンドでは -n オプションが使えてエスケープは常に働く。Zsh や tcsh の内部コマンドではシェルオプションや変数で動作をいくつかの種類から選べる。事程左様に echo の動作の仕方が多種多様なので、POSIX では混乱を避けるために echo ではなく printf を使うように推奨している。

Yash では $ECHO_STYLE 変数で動作を六種類の中から指定できるようにした。

なお、-e および -E オプションを受け付ける echo は厳密には POSIX 規格に反している。

|

« テレビ番組等感想 その 140 | トップページ | テレビ番組等感想 その 141 »

コメント

コメントを書く



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




トラックバック


この記事へのトラックバック一覧です: Yash 2 その 65: echo コマンド:

« テレビ番組等感想 その 140 | トップページ | テレビ番組等感想 その 141 »