我有一个在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实际创建的是什么时候?
答案 0 :(得分:5)
重定向由shell完成,globs也是如此。您的问题是,在管道的情况下,每个管道阶段都是一个单独的子流程;执行最终重定向的shell子进程是否在构建wc
的输入文件的整数之前运行将取决于调度程序和系统负载的细节,并且应该被认为是不确定的。
简而言之,您应该假设会发生这种情况并排除dir2/output.txt
(请查看ksh
扩展的glob模式;特别是dir2/!(output.txt)
的某些内容可能是有用的)或在其他地方创建输出,然后mv
将其创建到最终位置。