私はBashを書くのが好きでも嫌いでもあります。ファイルの操作とプロセスの操作がso合理化されているのが大好きです( この人気のある質問 に同意します)この点では、Python、Rubyなどよりも)ですが、特に条件文、ループなどの構文は嫌いです。
(これは主観的ですが、混乱と煩わしさの両方があります。たとえば、読み取り時には$var
、書き込み時にはvar
、=
の前後にスペースがあると、書き込みはサイレントに失敗します。二重括弧。正規表現を使用する場合のifs;ダブルセミコロンの場合とシングルセミコロンの場合など)
JSにコンパイルされるCoffeeScriptの大ファンとして、私は疑問に思っていました:Python/Ruby/CoffeeScriptのような言語の美的/構文を持っているが、他のランタイムの1つではなくBashとしてコンパイルおよび実行される言語はありますか? ?
例えば。私はほとんど書くことができるようになりたいです-少し簡単な構文でBash:
$AGGREGATE_FILENAME = 'allfiles.txt'
if not exists $AGGREGATE_FILENAME
touch $AGGREGATE_FILENAME
for $file in files/*
cat $file >> $AGGREGATE_FILENAME
switch $1
case 'test'
run-tests
echo 'Tests finished!'
case 'deploy'
echo 'Packaging...'
mv foo bar/
deploy-bar
これは非常に工夫された例であり、構文はストローマンです(主に、CoffeeScriptからインスピレーションを得ていますが、変数から分離されたファーストクラスのコマンドの基本的なBashの概念を維持し、型を緩めています)。
とにかく、ただの質問と思考の糧。私はloveで、Bashよりも優れたスクリプトを記述できるようにしたいと思います。 =)ありがとう!
私が最初にこの質問をしたので、この問題を攻撃し、かなり良い仕事をする2つのプロジェクトがリリースされました。どちらも、プログラミングに適したランタイムで多くの/ほとんどのUnixツールを再実装します。
PlumbumはPythonで実装されており、かなり堅実に見えます:
http://plumbum.readthedocs.org/en/latest/index.html
ShellJSはNode.jsに実装されており、見た目もかなり良いです。
https://github.com/arturadib/shelljs
エキサイティングな開発!ぜひお試しください。すでにお持ちの場合は、コメントであなたの経験を聞くのは素晴らしいことです。ありがとう!
ビッシュは別のオプションです:
https://github.com/tdenniston/bish
モダンな雰囲気のシェルスクリプト。
Bishは、シェルスクリプトを21世紀に持ち込むために作成された軽量言語です。プログラマーに最新の構文の快適さを提供しますが、Bashにコンパイルされるため、(Bashが移植可能である限り)優れた移植性が得られます。
問題は、Bashの文字列ベースのセマンティクス全体がひどく壊れているため、CoffeeScript forBashのようなことを行うのはかなり難しいということです。
Bashで記述された関数を呼び出すために関数レベルの相互運用性はおそらく必要ないので、まったく異なるものを使用する方がよいでしょう。 Perlは、厄介でショートカットや奇妙な構文でいっぱいであるという点でBashに近いですが、そのセマンティクスはほとんど健全です。 Pythonは、プロセスの起動などにはあまり快適ではありませんが、一般的なシステムプログラミングにははるかに優れており、クリーンでメンテナンスが簡単です。Pythonには、優れたライブラリとモジュールがあります。すべて; Perlはさらに優れています。
ZShを試してみることをお勧めします。シェルスクリプトを読みやすくするために、多くの改善が加えられています。
私は最近、 BashClass という言語を開発しました。これはオブジェクト指向であり、型チェックそして多次元配列を許可します。言語構文は、さまざまなプログラミング言語に触発されています。
List
クラスの実装方法の例を次に示します(完全な例 ここ ):
class List extends Object {
var Object[] data = new Object[];
var int size = 0;
constructor List(){
super_constructor();
}
function void add(var Object object) {
data[size] = object;
size = size + 1;
}
function void pop() {
if(size == 0) {
exception("Cannot remove element from an empty list");
}
size = size - 1;
data[size] = null;
}
function int size() {
return size;
}
function Object get(var int index) {
if(index < 0 || index >= size) {
exception("Cannot access element out of bound");
}
return data[index];
}
}
BashClassのクラスと多次元配列は、Bash4.4連想配列に変換されます。この言語は最初のリリースであり、 Github のオープンソースです。自由に構成して機能を提案してください。
nscript を調べてみてください。ここでは、javascriptを使用してシェルスクリプトを記述できます。終了コード、パイプ、ストリームリダイレクト、引数の展開、グロブ、プロンプトなど、すべての一般的なbash構造がそこにあります。