Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

何年も経ってもまだtcshが好きな理由

私は自分を幸せなBashユーザーだと思っています。しかし、Unixの世界に足を踏み入れた当初は、デフォルトでtcshが提供されるプロプライエタリなUnixシステムだったため、最初に触れたシェルはモダンなCシェル(csh)でした。この偶然は結果的に幸運でした。というのも、後年私が働いていた映画スタジオでも、選択するシェルはtcshだったからです。

今でも、論理的な関連性はないものの、いくつかのタスクはtcshと結びつけて考えることがあります。少なくとも1つのシステムでは今もtcshを使い続けており、感覚を維持するようにしています。また、自分が書いたtcshスクリプトとの互換性を保ち、必要なときにすぐ起動できるよう、すべてのシステムにインストールしています。

CシェルとBashの違い

tcshはcshの現代的な後継です。1978年にCシェルがリリースされた当時、ユーザーはそのC言語風の構文に熱狂しました。Cは当時新しいプログラミング言語であり、さらに重要なことに、Unix自体がCで書かれていたため、ほとんどのUnixユーザーにとっては任意のスクリプト言語よりもCの方が馴染み深かったのです。

たとえばBashでは、次のようなif文は、条件式(角括弧の部分)を評価するためにtestバイナリを「密かに」呼び出します。

v=1

if [ $v -gt 0 ]
  then
  echo "verbose"
fi

一方、cshやtcshでは同じ処理をこう書きます。条件式(括弧内のコード)にはcsh組み込みの評価機能が使われるため、外部のtestコマンドへの呼び出しが発生しません。

set v=1

if ($v > 1) then
  echo "verbose"
endif

この例からは、良い面と悪い面の両方が見えてきます。Cプログラマにとって条件式を括弧で囲むのは自然ですし、プログラマの観点からすれば、数値評価が実行ファイルに組み込まれているのは望ましいことです。その一方で、if構文は、波括弧を区切り文字として使うCよりも、むしろLuaに近い印象があります。

// これはcshでは動作しない
if ( v>1 ) {
        printf("verbose");
}

ある意味、これはcshの本質を見事に要約しています。クリーンで効率的、そして一部の人には馴染みやすい一方で、癖があり一貫性に欠けるのです。

では、なぜ使うのか?

精密さを求めてtcshを

私はCよりもC++やJavaを多く書くので、tcshへの興味は歴史的な名声とはあまり関係ありません。しかし私はLuaが好きで、tcshやその他のシェルを、LuaとPython、あるいはMarkdownとDocbookのように捉えています。どちらにも長所があり、より人気のある方を指摘するのは簡単ですが、もう片方には厳格な明快さがあります。実際、tcshには他の多くのシェルに欠けている「精密さ」があると感じています。

変数の扱い

シェルで型付き変数の恩恵を受けることはできませんが、tcshなら少なくともキーワードを使って変数を宣言できます。不思議なことに、そのために使えるキーワードは複数ありますが、私が落ち着いたのはsetです。

> set var=foo
> echo $var
foo

変数名(この例ではvar)を入力してCtrl+Xを押し、続けて$キーを押すと、変数を展開できます。上の例ではvarfooを設定しています。

他の多くのシェルと同様に、引数なしでsetを実行すると、設定済みのすべての変数を一覧表示できます。

> set
term   xterm
tty    pts/2
uid    1000
user   seth
var    foo
[...]

変数を解除するにはunsetコマンドを使います。

> unset var
> set | grep var
>

機能がないこと自体が機能になる

スクリプトの中で、こんな行を見たことはありませんか?

var=GitLab
${var,}

2行目は、varの内容を小文字に変換する組み込み関数です。

こうした追加関数は非常に便利なのですが、ときに難読化への誘いのように感じることがあります。シェルスクリプトは、プログラミングにおけるHTMLのような存在です。他人のコードを読むだけで独学できる数少ない真剣な言語の一つなのです。便利な関数を諦める正当な理由には必ずしもなりませんが、それでも私は各言語で流行りがちな暗号的な略記法を避けるようにしています。tcshで書く場合、そもそも略記法を多用する選択肢がないため、複雑な文字列操作は組み込みのショートカットではなく、基本的なUnixツールで実行することになります。その結果、読みやすいコードになると信じています。これは将来の貢献者にとって、そして忘れっぽい未来の自分自身にとって、大きな違いをもたらすのです。

組み込みの数学機能

tcshで気に入っている点の一つが、組み込みの@による数学ショートカットです。独学のUnixユーザーの多くと同じく、私はbcに出会ってしまい、以来ずっと後悔しています。bc自身に落ち度はないのですが、本来は計算言語としてこそ適しているのに、コマンドライン電卓として教えられがちなのです。回避策としては、純粋なBashで書かれた驚異の300行電卓や、Bashのletコマンド、そしてtcshの@コマンドがあります。

> @ n = ( 1 + 1 / 2 )
> echo $n
1

非常に複雑な計算が必要な場合は、bcや優れたPythonの数学ライブラリを学ぶ価値があるかもしれません。

必要なものはすべて揃っている

私にとってtcshは、徹底したシンプルさと必要不可欠な機能との完璧なバランスを実現したシェルです。すべてのユーザー向けでも、あらゆる用途向けでもありません。しかし、テキストベースの世界に対する見方をシンプルにしたいと考えているなら、tcshは興味深い選択肢になり得るでしょう。

  1. MacのWi-Fiが突然遅くなるのはなぜ?原因と14の解決策を徹底解説

    Wi-Fiは、iPhone、iPad、MacBookなど、あらゆるデバイスを使う上で最も重要なインフラの一つです。誰とも瞬時につながることができ、現代のアプリケーションのほとんどがインターネット接続を必要とします。だからこそ、すべてのデバイスで安定したWi-Fi接続を確保しておくことが大切です。しかし、Wi-Fiが正しく機能しないこともあり、その場合はMacBookでの日常業務に直接支障が出てしまいます。 本記事では、「なぜMacのインターネットが突然遅くなるのか」という疑問にお答えし、MacのWi-Fiを高速化するための具体的な方法を詳しく解説します。 Macのインターネットが突然遅くなる主

  2. WhatsApp誕生10周年記念:私たちがWhatsAppを愛し続ける理由とは?

    スマートフォンでメッセージのやり取りをするのが大好きな人は多いのではないでしょうか。移動中でも、人混みの中にいても、テキストメッセージはほとんどあらゆる場面で私たちを助けてくれる頼もしい存在です。そしてメッセージアプリといえば、多くの人が真っ先に思い浮かべるのがWhatsAppでしょう。WhatsAppは単なるテキスト送信にとどまらず、写真や動画の共有、現在地の共有など、できることがたくさんあります。世界中の何十億ものユーザーに愛され、今やスマートフォンに必須のコミュニケーションアプリとなっています。 そんな私たちのお気に入りアプリ・WhatsAppが、ついに10歳の誕生日を迎えました!ハッピ