【问题标题】:When is a file created when using output redirection?使用输出重定向时何时创建文件?
【发布时间】:2012-05-05 14:46:30
【问题描述】:

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

【问题讨论】:

    标签: filesystems ksh aix wc


    【解决方案1】:

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

    简而言之,您应该假设这会发生并排除dir2/output.txt(查看ksh 扩展的全局模式;特别是类似于dir2/!(output.txt) 的内容可能有用)或创建输出在其他地方,然后mv 将其移至最终位置。

    【讨论】:

    • 我一直认为如果一个子进程在等待输入,它就无法创建任何输出。我认为这一次性解决了我的许多错误假设。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多