Я изо всех сил пытаюсь понять, что происходит в тесте, который я запускаю. Test - это два сценария оболочки, запущенные на одном компьютере.
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;
B
#!/bin/bash
while(true);do
cat $1/target;
done
Итак, я запускаю A / ext3_dir, а затем запускаю B / ext3_dir> out (поэтому в std out выходят только ошибки).
Это все работает нормально и, как и ожидалось, согласно спецификации POSIX для 'rename':
Если ссылка, названная новым аргументом, существует, она должна быть удалена, а старая переименована в новую. В этом случае ссылка с именем new должна оставаться видимой для других процессов на протяжении операции переименования и указывать либо на файл, на который ссылается new, либо на старый до начала операции.
Однако, если я добавлю жесткую ссылку на временный файл перед выполнением перемещения:
#!/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.
Может ли кто-нибудь пролить свет на это поведение? Тест действителен? Я не могу понять, почему создание дополнительной ссылки на файл, который я перемещаю, должно влиять на способность читать из места назначения перемещения.