3

次のようなスクリプトがある場合:

#!/bin/bash
echo `script2.sh` > temp.txt &
(wait for long enough time)
a=`cat temp.txt`
echo $a

a の値は script2.sh によって正常に変更されます。ただし、これを行うと:

#!/bin/bash
a=`script2.sh` &
(wait for long enough time)
echo $a

a の値は script2.sh によって変更されません。私がこれをしたい理由は次のとおりです:(1)script2.shによってメインプロセスがブロックされたくない(待機中、私は何か他のことをすることができる) (2)私のメインプログラムは多くのことをしますそのため、多くのファイル IO を実行すると大きなオーバーヘッドが発生するため、値をメモリ内の変数に直接割り当てることをお勧めします。bash スクリプトのファイル IO が非常に遅いことがわかりました。私のプログラムでは、このような IO を 400 回実行すると、約 10 秒かかります (ただし、コンピューターがビジー状態の場合)。なにか提案を?

4

1 に答える 1

2

まだ存在しない値にシェル変数を割り当てることはできないため、このアプローチは単に不可能です。一時ファイル以外に現実的なオプションはありませんが、そのオプションをかなり高速化できます。遅いのはファイル I/O ではなくecho、スクリプトのファイルへの出力に対するサブシェルと、ファイルcatを読み取るプロセスを作成していることだと確信しています。プロセスの作成は遅いため、スピードを最小限に抑えることが重要です。echoシェルの出力をファイルに直接リダイレクトすることでサブプロセスの作成を回避し、プロセスをシェルで直接ファイルを読み取るcatbash の$(<file)イディオムに置き換えることができます。これが私が思いついたものです:

#!/bin/bash
script2.sh >temp.txt &
# (wait for long enough time)
a=$(<temp.txt)
echo "$a"
于 2013-08-18T01:32:56.490 に答える