何时使用输出重定向创建文件?

Ste*_*hen 2 filesystems aix ksh wc

我有一个在AIX ksh中运行的脚本,如下所示:

wc dir1/* dir2/* | {awk command to rearrange output} | {grep command to filter more} > dir2/output.txt
Run Code Online (Sandbox Code Playgroud)

这条线的前提条件是dir2/output.txt不存在.

问题是dir2/output.txt已经包含在输出中(它发生了数百次,没有问题).dir1和dir2是NFS安装的.

它与实现有关wc- 如果第一个参数需要很长时间怎么办?我想不是,因为我尝试了以下内容:

wc `sleep 5` *.txt > out.txt
Run Code Online (Sandbox Code Playgroud)

即使在这种情况下,out.txt也不会列出自己.

最后一点,在这个例子中使用了通配符,它​​们在实际脚本中使用.因此,如果首先发生扩展,为什么会出现这个问题呢?

dir2/output.txt实际创建的是什么时候?

gee*_*aur 5

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

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