2012-04-24 21 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

重定向是由shell完成的,就像globs一樣。你的問題是,就管道而言,每個管道階段是一個單獨的子進程;執行最終重定向的shell子進程是否在生成wc的輸入文件的glob之前運行,這取決於調度程序和系統負載的細節等等,並且應該被視爲不確定的。

總之,你應該假設會出現這種情況,要麼排除dir2/output.txt(看看ksh擴展glob模式;特別是,沿着dir2/!(output.txt)線的東西可能是有用的),或者在其他地方創造的產值和mv它之後到達其最終位置。

+0

我一直認爲,如果一個子進程在等待輸入,它將無法創建任何輸出。 我認爲這清除了我有很多不正確的假設,都在一個鏡頭。 – Stephen 2012-04-25 13:43:50