シェルスクリプトで外部バイナリをキャッシュすることは可能ですか?

シェルスクリプトで外部バイナリをキャッシュすることは可能ですか?

私の質問は少し奇妙に聞こえるかもしれませんが、今朝私は次の質問を読んだ。
「エコ」が「タッチ」よりはるかに速いのはなぜですか?
組み込み関数の概念を完全に理解していますが、同じ例を示しているかどうかはわかりません。

#!/bin/bash (or any other shell if it's possible in another)
for file in `find . -name "*.xml"`;
do 
   touch $file; 
done

touchプリロードして使用するたびにフォークする必要がなく、早くすることはできませんか?

ベストアンサー1

実際、カーネルは実行可能ファイルと必要なすべてのファイル(ライブラリなど)をRAMにキャッシュします。

シェルが何もできる方法はありません。外部プログラムの場合は実行が必要です。 Unices(CygwinなどのUNIXエミュレーション層を除く)はプログラムのロードを非常に効率的にする傾向がありますが、組み込みコマンドを実行するのと同じくらい高速ではありません。

通話をグループ化して時間を節約できますtouch。まず、出力にコマンド置換を使用しないでくださいfind。これには利点は全くないが、いくつかの欠点がある。

  • ファイル名にスペースまたはワイルドカードが含まれていると、操作は中断されます。
  • findディレクトリツリーのナビゲーションを最初に完了してから処理を開始できるため、遅くなります。
  • 保存にはより多くのメモリを使用してくださいfind

findmake は結果を繰り返すのではなくコマンドを実行します。findこの目的のために設計されています。

find . -name "*.xml" -exec touch {} \;

これでtouch一度に複数のファイルを処理できるので、\;に置き換えるだけ+です。touchバッチ呼び出しにはできるだけ多くのファイルが含まれます。

find . -name "*.xml" -exec touch {} +

シェルスクリプトのパフォーマンスが必要な場合は、大量のデータを操作しない限り、組み込みコマンドは常に外部コマンドよりも優れています。たとえば、sed1行のテキストがある場合、シェルの文字列処理構成を使用する方が呼び出しよりもはるかに高速です(引用の問題によるエラーの可能性も低い)。一方sed、処理する行が数百万個ある場合は、他の特別な外部ツールを使用してください。

新しいファイルを作成する場合は使用しtouch -- "$file"ます: >"$file"。既存のファイルの日付を現在の時刻に変更するショートカットはありません。

シェルには外部コマンドとして実装できるいくつかの組み込みコマンドがありますが、パフォーマンス上の理由から、これらのコマンドは内部コマンドです。echo良い例です。外部コマンドが破損したり、プロセステーブルがいっぱいになったりするなど、回復状況に使用できる追加の組み込みコマンドを含むシェルもあります。たとえば、zsh は次のように提供されます。zsh/files基準寸法mkdirなどのコマンドが含まれていますが、含まれてmvいませんtouchウエストバンド-touch組み込みのものがあります。

おすすめ記事