C Shell
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/02/21 13:44 UTC 版)
批判
いくつもの革新的機能により対話型利用では人気となったが、csh はスクリプト言語としては人気を獲得することはなかった。当初から1980年代末まで、cshはあらゆるUnixシステムに実装されていたわけではなく、shならばあらゆるUnixシステムに存在することが確実だった。したがって、様々なシステムで動作する可能性のあるスクリプトはshで書くのが賢明だった。1990年代中ごろにはcshも広く利用可能となったが、POSIXの委員会からcshをスクリプト言語として使用することに対して批判の声が挙がった[13]。すなわち、対話用とスクリプト用の推奨シェルは1つであるべきだとし、POSIXとしては KornShell を推奨するとしたのである。C shell は他にも、文法上の欠陥、機能不足、実装のまずさといった点で批判された[14][15]。
- 文法上の欠陥
- 言語定義上、不必要な矛盾が生じている。例えば、
set
、setenv
、alias
というコマンドは、ある名前と文字列または単語の並びを結びつけるという基本的に同じ機能を有している。しかし、それらには全く不必要な若干の差異がある。set
では等号を必要とするが、setenv
やalias
では等号は使わない。set
では単語の並びを括弧で囲む必要があるが、setenv
とalias
ではそうではない。同様に、if
の最後はendif
、switch
の最後はendsw
、ループ系構文では最後がend
というように意味も無く一貫性がない文法になっている。 - 機能不足
- よく言われるのは、標準入力ファイルハンドルの操作機能と関数サポートの欠如である。Bourne shell は局所変数は使えないが関数は定義できるのに対し、csh で関数に相当する機能はエイリアスしかなく、1行のコードしか定義できず、しかも制御構文の多くは途中に改行を必要とする。結果としてスタイルは似ていてもC言語のプログラムの機能をそのまま C shell で実装するのは困難である。そのため、大きなプロジェクトほどC言語や Bourne shell のスクリプトを使う傾向がある。
- 実装のまずさ
- 構文解析は場当たり的であり、多くの批判を浴びている。1970年代初めにはコンパイラ技術はそれなりに成熟しており[16]、多くの言語はトップダウンまたはボトムアップ構文解析器を使って完全に再帰的な文法を認識できるように実装されていた。C shell で場当たり的な設計となった理由は不明である。ジョイは2009年のインタビューで「Unixに関して作業を始めたとき、私は優秀なプログラマではなかった」と述べており、単にそれが答えかもしれない[17]。しかし、場当たり的な設計を選択したせいで C shell は完全再帰的ではなくなった。したがって、実現できる処理の複雑さには限度がある。
対話的にコマンドを入力して実行するぶんには快適だが、複雑なコマンドを実行させようとスクリプトを書いてみると時間がかかり、しかもよく失敗し、暗号のようなエラーメッセージを表示するか、好ましくない結果を生じることになる。例えば、C shell では制御構造間のパイプは不可能である。例えば foreach
の出力をパイプで grep
コマンドに送り込もうとしても単に機能しない。ワークアラウンドとしては、foreach
を使った部分を別のスクリプトにして構文解析の問題を回避するという手段がある。こうすれば、そのスクリプトは別のcshのプロセスとして動作するのでパイプで接続することも自由である。
別の好ましくない動作の例としてコード断片を示す。下記のスクリプトはどちらも「'myfile' が存在しないなら、'mytext' をそこに書き込む形で生成せよ」という意味である。しかし、右側の例では常に空ファイルが生成される。何故なら C shell の評価順序はコマンド行単位であり、まず入出力リダイレクトを評価することになっているためで、myfile がその際に作られてしまい、ファイルの存在を調べたときには既に存在しているためである。
# Works as expected
if ( ! -e myfile ) then
echo mytext > myfile
endif
|
# Always creates an empty file
if ( ! -e myfile ) echo mytext > myfile
|
また、エラーメッセージが貧弱だという点もよく批判されている。例えば "0 event not found" というメッセージからは何が問題なのかもわからない。
- ^ Zoulas, Christos (Jan 14 2012), tcsh-6.18 is now available 2012年1月16日閲覧。
- ^ Harley Hahn, Harley Hahn's Guide to Unix and Linux.
- ^ Berkeley Engineering Lab Notes, Volume 1, Issue 2, October 2001.
- ^ An Introduction to the C shell by Bill Joy.
- ^ https://packages.debian.org/buster/csh
- ^ https://packages.ubuntu.com/focal/csh
- ^ https://packages.debian.org/buster/tcsh
- ^ https://packages.ubuntu.com/focal/tcsh
- ^ Ken Greer (3 October 1983). "C shell with command and filename recognition/completion". Newsgroup: net.sources. 2010年12月29日閲覧。
- ^ tcsh(1) man page
- ^ Fixes file in tcsh-6.17.00.
- ^ Re: Late Bloomers Revisited USENET post to comp.lang.misc by Piercarlo "Peter" Grandi, Dept of CS, UCW Aberystwyth, UK, Dec 17, 1989.
- ^ IEEE Standard for Information Technology, Portable Operating System Interface (POSIX), Part 2: Shell and Utilities, Volume 2. IEEE Std 1003.2-1992, pp. 766-767. ISBN 1-55937-255-9.
- ^ Csh Programming Considered Harmful by Tom Christiansen
- ^ Top Ten Reasons not to use the C shell by Bruce Barnett
- ^ David Gries (1971). Compiler Construction for Digital Computers. John Wiley & Sons. ISBN 0-471-32776-X.
- ^ Bill Joy in Conversation with Brent Schlender, Churchill Club, Santa Clara, CA, Feb 11, 2009.
- ^ Holub, Allen (1986, 1987). On Command: Writing a Unix-Like Shell for MS-DOS (Second ed.). M&T Books, Redwood City, CA. ISBN 0-934375-29-1
- ^ Hamilton, Douglas. “Hamilton C shell Announcement”. IBM Personal Systems Developer (Summer 1989): 119–121 2010年11月22日閲覧。.
- ^ Hamilton C shell for Windows Release Notes 4.0, retrieved June 19, 2010.
- ^ Oliver, Robert (2009年9月19日). “Hamilton C Shell 2009 – The Missing Shell for Windows”. 2010年2月10日時点のオリジナルよりアーカイブ。2010年6月24日閲覧。
- ^ Hamilton C shell Quick Reference. Hamilton Laboratories, Wayland, MA. (1988 - 1990 (Revised July 10, 1990)) 2010年11月22日閲覧。
- ^ htk
- C Shellのページへのリンク