csh and tcsh work

C-シェルと Tcsh を使ったり教えるのはやめよう

シュロミ・フィッシュ(Shlomi Fish)

(shlomifshlomifish.org, or other ways)

Shlomi Fish, “Stop Using (and Teaching) C-Shell and Tcsh,” at Shlomi Fish’s Homepage, last update on October 1st, 2007, accessed on 2020-02-20; https://www.shlomifish.org/open-source/anti/csh/.

Translated at csh.tcsh.work: 2020-02-20 10:23:08.

Modified at csh.tcsh.work: -----.

Last modified at csh.tcsh.work: -----.

Note from the translator

本文中で “[...]” となっている表記は訳者の注です。更に、“[Barnett, 2001]” のような訳注は典拠表記であり、「Bibliography(当サイトの共通典拠一覧と資料のページ)」で掲載している書誌情報を参照できるようになっています。

C-シェルと、その拡張である Tcsh の実装を使ったり、学んだり、教えてはいけない。なぜなら、それらのシェルは恐ろしいほど不整合な文法を備えていて、ユーザビリティを欠いており、そして利用者に悪い習慣を植え付けるからだ。詳しく理由を列挙すると、次のようになる。

  1. (Perl の世界では有名な)トム・クリスチャンセンは、かつて「Cshは有害だ(Csh Considered Harmful)」[Christiansen, 1992] という文書を書いて、csh がシェル・スクリプトに適していないという多くの議論を挙げて見せた。ブルース・バーネットは「Cシェルを使わない理由トップ10(Top Ten Reasons not to use the C shell)」[Barnett, 2001] という文書で、更に説得力のある議論を展開して、csh がどれほど酷いものであるかを説明した。
  2. Bash は本物の関数(そしてエイリアス)を実装しており、それらは簡単に壊れてしまうような代物ではなく、つまりは辛うじてエイリアスとして動いているだけの代物ではない。
  3. Bash は適正なクォート(quoting)をもつ。csh での空白文字の扱いは危険である。かつてわたしが見た事例では、Technion [the Israel Institute of Technology] の二人の学生が宿題の答えを書いている最中に行き詰まり、その理由というのは、彼らが C-シェルのスクリプトで空白文字を正しく扱おうとしていたからなのであった。後で同じことを bash でやってみると、これは何の苦も無くできるようなことにすぎなかったが。
    1. Bash は Linux のログイン・シェルであり、ディフォールトのシェル・スクリプトを提供している。
    2. ksh - コーン・シェルという、ボーン・シェル [Bourne-shell] から派生したシェルは、非 GNU である UNIX System V 系列の OS で、ディフォールトのログイン・シェルかつスクリプト用のシェルとなっている。
    3. 最近の Mac OS X のバージョンでは、bash がディフォールトのスクリプト及びログイン・シェルである。
    4. macOS Catalina では、ディフォールトのシェルは zsh になりました。

    5. オープン・ソースの BSD 系列の OS でのみ、ash(ボーン・シェルを少し強化した実装)がスクリプト用のシェルとなっており、tcsh がディフォールトのログイン・シェルとなっている。
    6. cygwin ではディフォールトのシェルは bash である。zsh は cygwin でも cygwin でない 32 ビット環境の Windows でも使える。

    これら全ての事例で、C-シェルはスクリプト用のシェルとして全く使われておらず、せいぜい対話式にコマンドを打つときに使われているていどである。そして Bash/ksh/zsh は、いまやそれぞれが C-シェルよりもよく使われている。

  4. Bash では小さなプログラムを記述して、テストし、デバッグするという一連の処理全体が一行でできる。csh では、個々の異なる行に記述していくループを要求されるため、このようなことは不可能である。[要するに、csh/tcsh ではワンライナーが書けないということ。]
  5. サブ・シェル、あるいはサブ・シェルで実行した結果の取得という処理 ($(...)) がボーン・シェルでは本当に動く。そして Bash では、バック・クォート(back-ticks)を使った処理よりも遥かに安全な、サブ・シェルの実行結果を取得する方法をもつ。
  6. 学生は、C-シェルを「UNIX のシェル」だと考える傾向がある。したがって、C-シェルがまともに使えないという経験から、UNIX のシェルは何であれロクでもないと信じてしまう。しかし、これは素晴らしい機能を備えていて使うのが楽しい Bash と他のシェルには当てはまらない。
  7. 古臭い誤解というものがあり、それは多くの組織においてシェルを選ぶときに、次のような比較をしたというものだ。それは、ボーン・シェルは健全な文法と強力なプログラミング機能を備えているが、対話式では使い辛い。他方で tcsh は貧弱なプログラミング機能しかないが、対話式には使いやすい。[しかし、この比較は間違いである。]

今の世代のユーザにとっては、もう選択の余地などない。bash か zsh か、あるいはそれらの両方を使って、優れたプログラミング機能と対話式の利用方法を使うことだけだ。tcsh を使い続ける理由などない。

他の案

他には、次のようなシェルを使ったり、学んだり、教えるべきだろう。

  1. GNU Bash - the Bourne-Again-Shell。これは、ボーン・シェルと互換性を維持して拡張された、ユーザビリティに優れたシェルだ。対話式でもスクリプトでも、素晴らしいシェルである。多くのシステムではディフォールトのシェルになっている。
  2. Zsh - Z-シェル。これは、シェルの Emacs と呼ばれており、あらゆるもの、それこそ台所の流し台まで揃えている。これもボーン・シェルから派生したシェルである。

また、さきごろオープン・ソースになったコーン・シェルもあるが、わたしはコーン・シェルを実際には使ってみたことがない。それでも、[少なくとも csh/tcsh よりは] まともなシェルなのだろう。

大学で教えるとき、わたしはこれらのシェルが共通に備えていることを教えるよう、教師に勧めている。たぶん bash の話をその後に続けることになるのだとは思うが。

リンク

Licence

Creative Commons License

This document is Copyright by Shlomi Fish, 2007, and is available under the terms of the Creative Commons Attribution License 3.0 Unported (or at your option any later version of that licence).

For securing additional rights, please contact Shlomi Fish and see the explicit requirements that are being spelt from abiding by that licence.

To the top of this page