Переименовывает ли perl что-то странное в APFS?
Я пытаюсь отследить проблему с переименованием Perl в macOS с помощью файловой системы Apple (APFS). Я смог повторить это с помощью perls, по крайней мере, до 5.12.3, но все мои скомпилированы с Apple LLVM версии 9.1.0 (clang-902.0.39.1). Те же самые perls не имеют этой проблемы с файловыми системами FAT или HFS+. Я не заметил эту проблему где-либо еще.
Запустите его в первый раз. Я в конечном итоге с изменениями и Changes.bak. Это именно то, что я ожидал.
Запустите это снова. В итоге вы получите файл Changes and Changes 3. Changes.bak нет. Это странно
Запустите это снова. Я получаю файл Changes, Changes.bak и Changes 3.
Запустите это снова. Я получаю файл Изменений, Изменения 3 и Изменения 4. Опять же, нет изменений.
Если я удалю
print
линия я не могу представить это ("Доктор, мне больно, когда я так двигаю рукой").Я переупорядочил дескриптор файла, который открывается и закрывается, но это, похоже, ничего не исправило.
Я полагаю, что что-то происходит на уровне файловой системы. Поэтому у меня действительно есть два вопроса:
Это ошибка и на каком уровне? Это
rename
не гарантировано закончить все, что нужно сделать, прежде чем я начну возиться с дескрипторами файлов?Я хочу прочитать старый файл и создать новый, который вставляет некоторые данные в середине. Скопируйте заголовок, вставьте новые строки, выведите все старые строки в новый файл. Я мог бы записать во временный файл и переместить это позже, но я делаю что-нибудь еще глупо?
Если вы можете воспроизвести это поведение, но не знаете, оставьте комментарий. Может быть, есть что-то еще странное в моей системе.
my $changes = "Changes";
my $bak = $changes . ".bak";
rename $changes, $bak or die "Could not backup $changes. $!\n";
open my $in, '<', $bak or die "Could not read old $changes file! $!\n";
open my $out, ">", $changes;
# comment this print line and there's no problem
print {$out} 'Hello';
close $out;
close $in;
1 ответ
Я знаю, что это старый вопрос, но это может быть связано с ошибкой обработки файловой системы Apple около года назад. Мы столкнулись с некоторыми проблемами, когда метаданные файла (mtime?) не устанавливались правильно в определенных ситуациях.
Когда вы сталкиваетесь с подобными проблемами с perl, python, node и т. д., попробуйте выполнить ту же операцию на другом языке, чтобы увидеть, будет ли такое же поведение. Если это так, то это, вероятно, ошибка ОС (большинство этих языков сценариев в любом случае часто являются тонкими оболочками вокруг библиотек c).
Ваше здоровье.