2

次のようなAIXkshで実行されるスクリプトがあります。

wc dir1/* dir2/* | {awk command to rearrange output} | {grep command to filter more} > dir2/output.txt

この行の前提条件は、dir2/output.txtが存在しないことです。

問題は、dir2 / output.txtが出力に含まれていることです(数百回のうち数回は問題なく発生しています)。dir1とdir2はNFSマウントされています。

それはの実装に関連してwcいますか?最初のパラメータに長い時間がかかる場合はどうなりますか?私は次のことを試したので、そうではないと思います:

wc `sleep 5` *.txt > out.txt

この場合でも、out.txtはそれ自体をリストしません。

最後の注意として、この例ではワイルドカードが使用されており、実際のスクリプトで使用されています。では、拡張が最初に発生した場合、なぜこの問題が発生するのでしょうか。

dir2 / output.txtは実際にどの時点で作成されますか?

4

1 に答える 1

5

リダイレクトは、グロブと同様にシェルによって行われます。問題は、パイプラインの場合、各パイプラインステージが個別のサブプロセスであるということです。最終的なリダイレクトを実行するシェルサブプロセスが、入力ファイルのグロブを構築するシェルサブプロセスの前に実行されるかどうかはwc、スケジューラーとシステム負荷の詳細などに依存するため、不確定と見なす必要があります。

要するに、これが起こると想定し、除外するかdir2/output.txt(拡張グロブパターンを見てくださいksh。特に、の線に沿ったものdir2/!(output.txt)が役立つ場合があります)、別の場所に出力を作成し、mv後で最終的な場所に出力する必要があります。

于 2012-04-24T22:27:41.963 に答える