web-dev-qa-db-ja.com

.bashrcの一部を非同期で実行する

(パスなどを取得するために)別のプログラムを実行する必要があるエクスポートやその他のものがあり、実行に重要な時間がかかります。つまり、bashの起動時間は5秒程度です。

.bashrcに基本的なキャッシュを追加する前に、実行中のシェルで変数をエクスポートできるようにする非同期で何かを実行する方法はありますか?

(つまり、これは実際には.bashrcに限定されませんが、一般的にはbashです。)

10
Daniel Huckstep

それらのプログラムをいつ実行する必要があるか、そしていつそれらの結果が必要かによって大きく異なります。それらがいつ実行されるかが重要でない場合(つまり、結果が時間とともに変化しない場合)、~/.profileからではなく、~/.bash_profileまたは~/.bashrc(つまり、ログインするとき)から実行する方がよい場合があります。 。

結果が必要であるが、実行にかかる5秒間待つことができない場合、シェルが起動してから最初の5秒間はどうしますか?結果がまだ利用できないため、これらのプログラムの出力に依存するコマンドを実行することはできません。

要件を正確に説明していただければ、より良い回答が得られるかもしれません。

そうは言っても、Dennis Williamsonが提案したように、プログラムをバックグラウンドで起動し、その結果をホームディレクトリ内のいくつかのファイルに書き込むことができます。次に、bash変数Prompt_COMMANDを設定して、これらのファイルをソースすることができます。これにより、bashはPS1が表示されるたびに実行されます。

たとえば、バックグラウンドプログラムが完了したときにexport ans=42をファイル~/answerに書き込むとします。 ~/.bashrcに、

Prompt_COMMAND=". ~/answer"

その後、シェルがPS1を表示するたびに、最初に~/answerをソースし、環境には最終的に(たとえば、開始後5秒で)値42の変数ansが含まれます。

もちろん、シェルを開始してから最初の5秒間は、~/answerにシェルを開始したときのlastの値が含まれるため、それが重要かどうか(およびそれをリセットする方法)を決定する必要があります。必要に応じてファイル)。

2
garyjohn

バックグラウンドで変数を設定できる方法を私は知りません。ただし、スクリプトをバックグラウンドで実行して、出力をキャッチしながら、順番にではなく並列に実行することができます。これにより、実行を高速化できます。この方法では、ファイル記述子3〜9を使用して、合計7つの並列プロセスを実行できます。

明確にするために、実行されるすべてのコマンドは、変数の設定でそれらの出力を使用するために、インタラクティブシェルを生成する前に終了する必要があります。

このソリューションでは、スクリプトの一部をスクリプトの残りの部分(この場合は.bashrc

function copget { read -u $1; echo "$REPLY"; }

coproc DATE { date; }
exec 3<&${DATE[0]}

coproc UNAME { uname; }
exec 4<&${UNAME[0]}

var1=$(copget 3)
exec 3>&-

var2=$(copget 4)
exec 4>&-
1
ewindisch

一度実行されるプロファイルと、(インタラクティブな)bashを開始するたびに実行されるbashrcファイルとの間でワークロードのバランスをとることを検討することをお勧めします。私はbashrcを最小限に抑えているので、起動が速くなります。私のプロファイルはそれほど悪くはありません-それは複雑ですが、それは確かに5秒かかりません。

1

アンパサンドを使用して、バックグラウンドでプロセスを実行できます。

some_program &

ただし、プログラムは、それを開始したシェルの環境に直接影響を与えることはできません。

スタートアップファイルに長時間実行プロセスを含めないでください。