POSIX適用ユーティリティがシェルに組み込まれていないのはなぜですか?

POSIX適用ユーティリティがシェルに組み込まれていないのはなぜですか?

この質問の目的は、特定の計算問題を解決するのではなく、好奇心を満たすことです。問題は、POSIX 適用ユーティリティが通常シェル実装に組み込まれない理由です。

たとえば、デフォルトではいくつかの小さなテキストファイルを読み取ってフォーマットが正しいことを確認するスクリプトがありますが、多くの文字列操作のために私のコンピュータで実行するのに27秒かかります。これらの文字列操作は、さまざまなユーティリティを呼び出して何千もの新しいプロセスを生成するため、遅くなります。grep、、、、などのユーティリティが組み込まれている場合、スクリプトはsed1秒以内に実行cutされると確信しています(Cの使用経験によると)。trexpr

多くの場合、これらのユーティリティを構築すると、シェルスクリプトのソリューションが許容可能なパフォーマンスを発揮するかどうかに影響を与えるようです。

明らかに、これらのユーティリティを組み込まないように選択する理由はあります。システム レベルで 1 つのバージョンのユーティリティを使用すると、さまざまなバージョンのユーティリティを使用するさまざまなシェルを回避できます。私はそれほど多くの新しいプロセスを生成するオーバーヘッドを維持しなければならない他の多くの理由を実際に考えることはできません。少なくとも過度のプロセスを持つことによる非効率性ほど大きな問題ではない。

ベストアンサー1

POSIX適用ユーティリティがシェルに組み込まれていないのはなぜですか?

POSIX規格に準拠するには、システムが次のようになります。必須1ほとんどのユーティリティをスタンドアロンコマンドとして提供します。

内蔵されているということは、ケースの内側とケースの外側の2つの異なる場所に存在する必要があることを意味します。もちろん、組み込みのシェルスクリプトラッパーを使用して外部バージョンを実装することは可能ですが、これはユーティリティを呼び出すシェルではなくアプリケーションに有害である可能性があります。

気づく忙しい箱提案されたパスは、内部的に多くのコマンドを実装し、独自の接続を使用して独立したバリエーションを提供することによってとられました。 1つの問題は、命令セットが非常に大きくなる可能性がありますが、実装はしばしば標準のサブセットであるため、互換性がないことです。

また、少なくともksh93bashまた、zsh実行中のシェルが共有ライブラリから組み込み関数を動的にロードするためのカスタマイズ方法も提供します。技術的にすべてのPOSIXユーティリティが組み込まれて実装され提供されるのを防ぐ方法はありません。

最後に、最新のオペレーティングシステムでは、新しいプロセスを作成する作業が大幅に高速化されました。パフォーマンスの問題がある場合は、スクリプトをすばやく実行するためにいくつかの改善を適用できます。

1 POSIX.1-2008

しかし、すべての標準ユーティリティ、表の一般的な組み込み機能を含みますが、特殊な組み込みユーティリティで説明されている特殊な組み込み機能は含まれません。exec関数系列を介してアクセスできるように、何らかの方法で実装する必要があります。POSIX.1-2008のシステムインタフェースボリュームで定義されているようにそれを要求する標準ユーティリティ(env、find、nice、nohup、time、xargs)から直接呼び出すことができます。

おすすめ記事