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