Reactionary Software / 必要 - by fschmidt

より良いシェル

Bash は私がお勧めするシェルです。しかし、理想的とは程遠いです。古くて使いにくく、シェルスクリプトを書くには難解です。しかし、現代文化が何か良いものを作ることができないので、Bashを使い続けるべきです。しかし、この投稿では実装されない私の理想のシェルについて説明します。

Bashが正しく行っていることの一つは概念的なシンプルさです。そしてその重要な部分は完全に型なしであることです。ブール値、数値、マップ、リストなどの型は必要ありません。バイトストリームと文字列だけです。Tclも型なしのシンプルさを持つ別の言語です。しかし、Tclの実装は最初にすべてを文字列として実装し、その後に隠された内部型システムを持つように進化しました。理想的なシェルはこの例に従うべきです。

2つの型があるべきです:データと関数。データはBashのように概念的にはバイトストリームまたは文字列です。関数はElvishの関数のようであるべきです。

出力キャプチャはElvishのように構文的に(echo hi)のようにすべきで、Bashのように$(echo hi)のようにすべきではありません。ifwhileなどのステートメントは、条件引数と関数引数を取る組み込みコマンドとして実装されるべきで、Elvishのようにです。条件引数は文字列"true"または"false"に評価されるべきです。他の値はエラーです。数値式は他のすべてと同じコマンド/プレフィックス構文を使用すべきで、Elvishのようにです。

Bashの厄介な癖の一つは、whatever $(echo hello world)では、whateverが2つの引数"hello"と"world"を受け取ることです。1つの引数の場合、whatever "$(echo hello world)"を行う必要があります。Elvishはこれを正しく行い、引用符を必要としません。私のシェルも同様で、whatever (echo hello world)は1つの引数"hello world"を渡します。

Bashの<>、または&は必要ありません。whatever <fileの代わりにcat file | whateverを行います。whatever >fileの代わりにwhatever | to fileを行います。whatever &の代わりにbackground {whatever}を行います。これは概念的にシンプルです。

変数もシェル言語で特別な扱いを受けるべきではありません。NAME=Bob; echo $NAMEの代わりにset NAME Bob; echo (get NAME)を行います。これが冗長すぎると言わないでください。シェル言語は大きなプログラムを書くためのものではありません。そして私の方法は概念的にシンプルです。また、次のように配列やマップをシミュレートすることができるため、より柔軟です:

set i 1 set a[(get i)] first echo (get a[(get i)])

はい、これは冗長です。Alan Kayが言ったように「シンプルなものはシンプルであるべきで、複雑なものは可能であるべきです」。この例はシェルにとって複雑なものです。

まだまだ続けられますが、あなたはアイデアを理解しているでしょう。このページを現代文化のメンバーに見せて、彼らがどれだけ嫌うかを見てください。それがこれが良いアイデアである証拠となるでしょう。もし私のアイデアよりもさらに嫌われるアイデアがあるなら、それはより良いアイデアでしょう。とにかく、これを実装する人はいません。しかし、このアイデアは少なくとも反動的なデザインの例です。