関数型シェルスクリプト

関数型シェルスクリプト

シェル スクリプトや高度なコマンドを作成したい場合、コマンドの名前とスイッチを覚えておくのがいつも大変だということがわかりました。

例えば

tr -d '\n' < file | wc -c

プログラミング言語では次のように書けますが

len(replace(str(file), "\n", ""))

より記憶に残りやすく、マニュアルページを検索する可能性が低くなり、他の人にとって理解しやすくなります。

では、なぜシェル スクリプトは長年この不可解な形式のままなのでしょうか? 大量のマニュアル ページを読まなくてもコードの動作が明確になるように構文を変更する取り組みがあるのでしょうか? この形式には利点があるのでしょうか? シェル スクリプトを最大限に活用するには、欠点にどう対処すればよいのでしょうか?

答え1

ファイルを読み取り用に開き、そのファイルの内容を使用するライブラリ関数を呼び出し、その関数の出力を別の関数にストリームし、2 番目の関数の出力をユーザーに返し、終了ステータスを返し、その後すべてをクリーンアップするという一連の処理をすべて 1 行で実行できるプログラミング言語をいくつご存知ですか。

あなたが挙げた例では、ほとんどの言語に必要なサポート機能の多くが省略されています。

任意の数の入力を受け入れ、さまざまなモードで動作し、シンプルなインターフェースを持つライブラリ関数を備えたプログラミング言語はいくつありますか?

printfおそらくそうでしょうが、ほとんどのライブラリには、さまざまな名前とさまざまなパラメータを持つさまざまな関数が含まれており、それらを学習する必要があります。違いはわかりません。

また、ほとんどの言語では関数を順番に呼び出します。シェル スクリプトは関数を並列に実行し、大量のメモリを消費することなく、パイプラインを通じて任意の量のデータをストリームできます。また、(データ ソースがキーボード、ネットワーク ソケットなどである場合) データが到着すると、すべて遅延評価で実行されます。あなたのお気に入りの言語では、このような処理が行われますか?

より速く、より効率的に作業を実行したり、より正確に数値を計算できる言語は数多くありますが、シェル スクリプトの威力を過小評価しないでください。

構文についてはどうでしょうか? まあ、動作します。見た目はどうであれ、学ぶ必要があります。それ以上に何が欲しいですか?

答え2

試すpbs-- コマンドライン ツールと Python を組み合わせる -- たとえば次のようになります。

# sort this directory by biggest file
print sort(du(glob("*"), "-sb"), "-rn")

# print the number of folders and files in /etc
print wc(ls("/etc", "-1"), "-l")

関連情報