Perl是否重命名在APFS上做了一些奇怪的事情?

bri*_*foy 6 macos perl apfs

我正在尝试使用Apple文件系统(APFS)跟踪Perl 在macOS 上重命名的问题.我已经能够使用perls将其复制到至少5.12.3,但我的所有内容都是使用Apple LLVM版本9.1.0(clang-902.0.39.1)编译的.这些相同的perls在FAT或HFS +文件系统中没有这个问题.其他地方我没有注意到这个问题.

  • 第一次运行它.我最终得到了一个Changes和一个Changes.bak.这正是我的预期.

  • 再次运行它.您最终获得了更改更改3文件.没有Changes.bak.这很奇怪.

  • 再次运行它.我最终得到了一个Changes文件,Changes.bakChanges 3.

  • 再次运行它.我最终得到了一个Changes文件,Changes 3Changes 4.再一次,没有Changes.bak.

  • 如果我删除了这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;
Run Code Online (Sandbox Code Playgroud)

jjo*_*ohn 1

我知道这是一个老问题,但这可能与苹果文件系统处理大约一年前的一个错误有关。我们遇到了文件元数据(mtime?)在某些情况下未正确设置的问题。

当您使用 perl、python、node 等遇到此类问题时,请尝试用不同的语言执行相同的操作,看看是否会获得相同的行为。如果是这样,这可能是操作系统错误(无论如何,大多数脚本语言通常都是 C 库的薄包装器)。

干杯。