C shell作者ビル・ジョイ
初版1978年
最新版tcsh 6.18.00 / 2012年1月14日 (12年前) (2012-01-14)[1]
リポジトリ
github.com/freebsd/freebsd-src/tree/main/bin/csh
C shell(シーシェル、csh)は、カリフォルニア大学バークレー校の大学院生だったビル・ジョイが1970年代後半に開発したUnixシェルである。1978年にジョイが配布を始めた 2BSD という BSD UNIX のリリースで広く配布されることになった[2][3]。他にアイデアやコードに貢献した者としては、マイケル・ウベル、エリック・オールマン、マイク・オブライエン、ジム・カルプがいる[4]。UNIX V6 の /bin/sh を元に作られたもので、Bourne shell (UNIX V7) と共通の先祖を持つ。
通常テキストウィンドウ内で動作するコマンドラインインタプリタであり、ユーザーがコマンドを入力するとそれに応じた処理が実行される。またシェルスクリプトと呼ばれるファイルからコマンド群を読み込むこともできる。他のUnixシェルと同様、ファイル名のワイルドカード、パイプ、ヒアドキュメント、コマンド置換(英語版)、変数、条件分岐やループなどの制御構造をサポートしている。cshが1980年代の他のシェルと異なっていた点は、対話向けの機能と全体的なスタイルである。新機能によって他のシェルよりも容易に素早く使うことができた。言語としての全体的スタイルはC言語によく似ており、Unixユーザーにとっては読みやすかった。
macOS や Red Hat Linux など多くのシステムのcshは実際には改良版のtcshである。tcshの実行ファイルは "csh" と "tcsh" の両方にハードリンクされていて、どちらの名前でも同じ改良版のtcshが呼び出される。
DebianやUbuntuではcshとtcshの2種類のパッケージを用意しており、前者はオリジナルのBSD版csh[5][6]、後者は改良版のtcsh[7][8]となっている。両方をインストールした場合、cshとしてどちらを使用するかupdate-alternativesコマンドで選択できる。
tcshには、ファイル名やコマンドの補完機能、Tenexシステムに由来するコマンド行編集があり、名称の先頭の t は Tenex に因んでいる[9]。tcshは機能を追加しただけでオリジナルのcshを修正したわけではないので、後方互換を保っていた[10]。当初はジョイが作ったオリジナルのソースツリーからの脇枝だったが、今ではtcshが主な枝となっていて、開発が継続されている。tcshは非常に安定しているが、主に細かいバグ修正のため、およそ1年に1回の頻度で新たなリリースがなされている[11]。 C shell の主たる設計目標は、C言語に似せることと、対話型利用での改良であった。 Unixシステムはほとんど全体がCで書かれているため、C shell の第一の目標はスタイル上システム全体と一貫性のあるコマンド言語とすることだった。キーワード、括弧の利用、組み込みの式の文法、配列サポートなどは全てCの影響を強く受けている。 今ではC言語によく似た文法のスクリプト言語がいくつもあり、それらに比べればcshはそれほどC言語に似ているとは言えない。しかし80年代から90年代にかけて、特にAT&Tでスティーブン・ボーンが開発したshと比べたときの違いは著しいと見られていた。次の例は、C shell の演算子や構文のわかりやすさを示したものである。 Bourne shellC shell
設計目標と機能
C言語風のスタイル
#!/bin/shif [ $days -gt 365 ]then echo This is over a year.fi#!/bin/cshif ( $days > 365 ) then echo This is over a year.endif
対照的にcshは自前で式を評価でき、高速である。可読性もよいと言われている。演算子や構文の多くはC言語のものをそのまま使っている。キーワードを逆に綴ることもなく、全体としてよりC言語に近いスタイルである。
次の例は、2の1乗から10乗までを計算するスクリプトを比較したものである。
Bourne shellC shell
#!/bin/shi=2j=1while [ $j -le 10 ]do echo '2 **' $j = $i i=`expr $i '*' 2` j=`expr $j + 1`done#!/bin/cshset i = 2set j = 1while ( $j <= 10 ) echo '2 **' $j = $i @ i *= 2 @ j++end
やはりshには式の文法が存在しないため、shのスクリプトはコマンド置換(英語版)とexprコマンドを使っている。C shell の @ 文(コマンド)は一種の駄洒落であり、"at-sign-ment" すなわち代入文を意味している。
最後の例は、switch文のスタイルの違いを示したものである。