我认为这与iCloud Drive有关,但我还没有进行调查。
我正在尝试追踪使用苹果文件系统(APFS)的macOS上Perl的rename问题。我已经能够用至少5.12.3版本的perl复制此问题,但所有这些都是使用Apple LLVM版本9.1.0(clang-902.0.39.1)编译的。那些相同版本的perl在FAT或HFS+文件系统中没有这个问题。我没有在其他地方注意到这个问题。
第一次运行它。 我最终得到了一个Changes和一个Changes.bak文件。 这正是我预期的。
再次运行它。 你会得到一个Changes和一个Changes 3文件。 没有Changes.bak文件。 这很奇怪。
再次运行它。 我得到一个Changes文件,一个Changes.bak文件和一个Changes 3文件。
再次运行它。 我得到一个Changes文件,一个Changes 3文件和一个Changes 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;
rename
(3pl) 简单地调用rename
(2)。Win32 和 VMS 会覆盖此功能(可参见此处),但据我所知,MacOS 没有这样做。请查看rename
(2)的手册页面? - ikegamiunlink($bak)
。 - Bernhard M.