2

我正在努力理解我正在运行的测试中发生了什么。测试是在同一台机器上运行的两个 shell 脚本。

A:

    #!/bin/bash
    touch target;
    for ((i=0; i < 1000; i=i+1)); do
        echo "snafu$i" > $1/file$i;
        mv -f $1/file$i $1/target; 
    done; 

乙:

    #!/bin/bash
    while(true);do 
        cat $1/target; 
    done

所以我运行 A /ext3_dir,然后运行 ​​B /ext3_dir > out (所以只有错误进入标准输出)。

根据“重命名”的 POSIX 规范,这一切都可以正常工作并且符合预期:

如果新参数命名的链接存在,则应将其删除并将旧的重命名为新的。在这种情况下,一个名为 new 的链接将在整个重命名操作期间对其他进程保持可见,并且在操作开始之前引用 new 或 old 引用的文件。

但是,如果我在移动之前添加到临时文件的硬链接:

    #!/bin/bash
    touch target;
    for ((i=0; i < 1000; i=i+1)); do
        echo "snafu$i" > $1/file$i;
        ln $1/file$i $1/link$i
        mv -f $1/file$i $1/target; 
    done; 

我在阅读方面收到“没有这样的文件或目录”错误 - 似乎违反了 POSIX 规范。

任何人都可以阐明这种行为吗?测试有效吗?我无法弄清楚为什么创建指向我正在移动的文件的额外链接会影响从移动目标读取的能力。

4

2 回答 2

2

事实证明,这是某些 redhat 版本的已知问题:

https://bugzilla.redhat.com/show_bug.cgi?id=438076

于 2012-03-07T14:57:23.973 回答
0

我已经在 Debian 上运行它,它在 EXT3 文件系统上运行良好。我在这里看不到任何不应该工作的东西。我重写了 SH shell 的循环,用最小的脚本对其进行测试。

#!/bin/sh
    touch target
    for i in $(seq 1 999) do
            echo "snafu$i" > $1/file$i;
            ln $1/file$i $1/link$i
            mv -f $1/file$i $1/target
    done

无论如何,这touch target不应该touch $1/target吗?

于 2012-03-04T22:24:04.750 回答