我正在努力理解我正在运行的测试中发生了什么。测试是在同一台机器上运行的两个 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 规范。
任何人都可以阐明这种行为吗?测试有效吗?我无法弄清楚为什么创建指向我正在移动的文件的额外链接会影响从移动目标读取的能力。