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 <filecat file | whateverに、whatever >filewhatever | to fileに、whatever &background {whatever}に置き換えます。これは概念的に単純です。

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

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

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

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