C Shell
出典: フリー百科事典『ウィキペディア(Wikipedia)』
C shell(シーシェル、csh)は、BSD UNIXシステム上でビル・ジョイによって開発されたシェルである。UNIX V6 の /bin/sh を元に作られたもので、Bourne shell(UNIX V7)と共通の先祖を持つ。その文法はC言語をモデルとしている。とはいうものの、C言語のように関数が作れるわけではなく、代わりにエイリアスが使えるが貧弱であり、C Shell スクリプトでまともに構造化プログラミングを行うことはできない(Bourne shell やその互換シェルである Korn Shell、Bourne Again Shell、Z Shell 等では、C言語のように関数をつくり、構造化プログラミングを行うことができる)。Bourne shell に比較して、エイリアスやコマンド履歴などの便利な機能が豊富であった。今日では C shell はほとんど使われておらず、tcsh、Korn Shell(ksh)、Bourne Again Shell(bash)などに取って代わられた。
[編集] 機能
C shell は典型的なUNIXのシェル構造に従い、入力の各行(スクリプトの各行)をコマンドとして解釈して実行し、必要ならバックスラッシュで改行を「エスケープ」して複数行をひとつのコマンドとして実行する。
以下の機能は C shell で初めて導入されたもので、今日ではUNIX系のシェルの多くがサポートしている。
- ジョブコントロール
- 対話型ジョブを一旦停止させ、後で再開させたり、バックグランドに移行させたりする。
- ヒストリ置換
!
-置換により、以前に実行したコマンドを再実行したり、その内容を編集できる。- 配列
- 複数の要素を格納できる変数であり、要素を数値でインデックス付けする。
~
拡張- ホームディレクトリ参照。
- エイリアス
- コマンドやコマンド列の別名を設定できる。
- 算術演算
- Bourne shell では外部プログラムを使わないとできなかった計算を組み込みで可能にした。
[編集] スクリプト言語としての C Shell
C shell は対話モードでは様々な発明的機能を導入したが、スクリプト言語としての機能には批判が多い。いずれにしても、UNIX系システムには必ず Bourne shell が存在するので、スクリプトを書く場合には csh ではなく sh を使うことが推奨される(ksh や bash も Bourne shell とほぼ同じ文法である)。
cshスクリプトの歓迎できない挙動の例として、以下のようなものがある:
if ( ! -e foo ) echo bar > foo
これは、「ファイルfooが存在していないなら、barの内容によってそれを作成せよ」ということを意味している。しかしこの行が構文解析されたとき、ファイルの存在がチェックされる前に出力のリダイレクトが設定されるため、実のところ空のファイルが作成されるだろう。
しかし csh の文法では算術演算が可能であり、sh では外部プログラムを呼ばないとそれができない。
スクリプトを csh で書くなら、-f フラグを付けて使う方がよいだろう(つまり、スクリプトの先頭に #!/bin/csh -f という行を入れる)。こうすると、スクリプトの実行時にユーザーのセットアップファイルを実行しないので、ユーザーによってスクリプトの動作が変わってくるようなことが起きない。