2012-04-24 10 views
2

私はこのようになりますAIXのkshの中で実行するスクリプトを持っている:出力リダイレクトを使用すると、ファイルはいつ作成されますか?

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ですか?

答えて

5

リダイレクトは、シェルによって実行されます。問題は、パイプラインの場合は、各パイプラインステージが別のサブプロセスであることです。最後のリダイレクションを行うシェルのサブプロセスが、wcの入力ファイルのグロブを構築する前に実行されるかどうかは、特にスケジューラとシステム負荷の詳細に依存するため、不確定とみなされます。 (;特に、dir2/!(output.txt)の線に沿って何かが有用である可能性がksh拡張globパターンを見てみましょう)か、それをどこかに出力を作成し、mv要するに

、あなたはこれが起こると、どちらかdir2/output.txtを除外することを想定する必要がありその後、最終的な場所に移動します。

+0

私はいつも、サブプロセスが入力を待っていると、出力を作成できないと考えていました。 これは私が持っていた間違った前提をたくさん消してしまったと思います。 – Stephen

関連する問題