質問: posix必須ユーティリティがシェルに組み込まれていないのはなぜですか? この質問の目的は、特定のコンピューティング問題を解決することではなく、好奇心に答えることです。問題は、なぜシェル実装にposix必須ユーティリティが一般的に組み込まれていないのかということです。たとえば、基本的にいくつかの小さなテキストファイルを読み取り、それらが適切にフォーマットされていることを確認するスクリプトがありますが、私のマシンでは、大量の文字列操作のため、実行に27秒かかります。この文字列操作は、さまざまなユーティリティを呼び出すことによって何千もの新しいプロセスを作成するため、速度が低下します。いくつかのユーティリティ、つまりgrep、sed、cut、tr、およびexprが組み込まれていれば、かなり自信があります。 、その後、スクリプトは1秒以内に実行されます(cでの私の経験に基づく)。これらのユーティリティをビルドすると、シェルスクリプトのソリューションが許容できるパフォーマンスを備えているかどうかに違いが生じる多くの状況があるようです。明らかに、これらのユーティリティを組み込まないように選択された理由があります。たぶん、システムレベルで1つのバージョンのユーティリティを使用することで、さまざまなシェルがそのユーティリティの異なるバージョンを複数使用することを回避できます。非常に多くの新しいプロセスを作成するオーバーヘッドを維持する他の多くの理由は本当に考えられません。posixは、それぞれがposixである限り、さまざまな実装を持つことはそれほど問題に見えないユーティリティについて十分に定義しています。準拠。少なくとも、それほど多くのプロセスを持つことの非効率性ほど大きな問題ではありません。
回答: これは歴史的な事故だと思います。unixが1960年代後半から1970年代初頭に作成されたとき、コンピュータには現在のメモリと同じくらいのメモリがありませんでした。当時は、これらの機能をすべてshellビルトインとして実装することが可能でしたが、メモリの制限により、実装できる機能の量を制限するか、メモリ不足のリスクやゴミ箱の交換を行う必要がありました。問題。一方、特定の機能を個別のプログラムとして実装し、新しいプロセスを開始するために必要な2つのシステムコールをできる限り軽くすることで、これらの問題がなく、依然として適切に実行されるスクリプト環境を作成できます。速度。もちろん、それらが別々のプロセスとして実装されると、人々はそれらをnotシェルであるプログラムから起動し、その後、そのようにしておく必要があります。ただし、一部の機能を2回実装できないと言っているわけではありません。実際、一部のシェルは、shellビルトインとして外部プログラムであるはずの機能を実装しています。たとえば、bashはechoコマンドを組み込みとして実装していますが、/usr/bin/echoもあります。