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 是在什么时候实际创建的?

4

1 回答 1

5

重定向由 shell 完成,glob 也是如此。您的问题是,对于管道,每个管道阶段都是一个单独的子流程;执行最终重定向的 shell 子进程是否在为其构建输入文件的 glob 之前运行wc将取决于调度程序和系统负载的详细信息等,并且应该被视为不确定的。

简而言之,您应该假设这会发生并且要么排除dir2/output.txt(看看ksh扩展的 glob 模式;特别是类似的东西dir2/!(output.txt)可能有用),要么在其他地方创建输出,mv然后将其放到最终位置。

于 2012-04-24T22:27:41.963 回答