在perl的backticks中使用chmod后,是什么导致了权限的异步更改

在perl的backticks中使用chmod后,是什么导致了权限的异步更改,perl,asynchronous,chmod,Perl,Asynchronous,Chmod,TL;DR-转到更新以获取玩具示例。以下是我的原始问题,在我能够在一个小例子中重现这个问题之前,为了清晰起见进行了编辑 我不明白这里发生了什么。我在绞尽脑汁想弄明白为什么我用perl编写的测试总是失败 我正在测试一个函数,该函数在打开输出日志文件失败时关闭日志记录,这样就不会抑制对STDERR的输出。为了测试它是否有效,我动态创建了一个文件,并将其chmod为不可写。代码的结果运行应该将一个打开的错误和所有其他STDERR一起打印到STDERR输出。在运行测试之前,我正在用backticks进行

TL;DR-转到更新以获取玩具示例。以下是我的原始问题,在我能够在一个小例子中重现这个问题之前,为了清晰起见进行了编辑

我不明白这里发生了什么。我在绞尽脑汁想弄明白为什么我用perl编写的测试总是失败

我正在测试一个函数,该函数在打开输出日志文件失败时关闭日志记录,这样就不会抑制对STDERR的输出。为了测试它是否有效,我动态创建了一个文件,并将其chmod为不可写。代码的结果运行应该将一个打开的错误和所有其他STDERR一起打印到STDERR输出。在运行测试之前,我正在用backticks进行chmod

然而,发生的事情是日志文件一直被写入而没有出错——因此测试失败了。我开始通过在不同的地方打印ls-halF的输出来进行合理性检查,以查看权限更改发生的位置。最初的chmod似乎正在工作:

`echo > file.log;chmod 444 file.log;ls -halF file.log`
在其他一些安装程序确认了预期的权限之后,后续的ls-halF file.log会出现,但在我运行的实际测试代码中,有一行非常早的代码表示所有者有写权限

我最终找到了解决问题的方法——在backticks中使用perl-chmod方法而不是chmod,这让我觉得有一些异步的东西在发生——这对我来说毫无意义

我最终尝试了这一点,因为在我众多的测试中,我偶尔会看到一个测试随机成功。所以我写了一个快速循环,一遍又一遍地执行相同的测试,发现它随机成功的概率可能是30%!这就是为什么我认为这个问题可能存在某种异步性,我无法解释这一点,因为我认为backticks本质上是等待进程完成,因为它返回了输出-那么这里发生了什么?我不明白

为了完整性-实际的测试命令也是在backticks中完成的-它运行一个独立的脚本

在我下面的更新中,我展示了一个不同的案例,但它展示了权限状态的随机性

使现代化 嗯。这是一个小型的自包含示例,演示了该问题。注意每种情况下第二行的不同输出

deleteme1.pl deleteme2.pl 现在观察这个重复循环的输出:

tcsh> foreach f ( `seq 1 30` )
perl deleteme1.pl
perl deleteme2.pl
end
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -rw-r--r--@ 1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -rw-r--r--@ 1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--@ 1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--@ 1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -rw-r--r--@ 1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--@ 1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--@ 1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--@ 1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
1: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
2: -r--r--r--  1 robleach  staff  1 May 31 21:01 deleteme.log
请注意,所有者权限差异始终来自deleteme1.pl。我认为@表示macOS上的扩展属性。这可能与此有关,但在某些情况下,xattr存在,但没有许可差异

我还怀疑问题可能与此有关:

>ls -1 t | wc -l
   46391
所以有些事情是异步发生的-到底是什么?!这可能与SIP或csrutil有关吗

更新2 这里有一个更符合我具体情况的例子

deleteme3.pl 这一个代表了我的解决方案:

#!/usr/bin/perl
open(TLG,">deleteme.log");
print TLG '';
close(TLG);
chmod 0444, "deleteme.log";
if(open(TEST,">deleteme.log"))
  {print "3 opened\n"}
else
  {print "3 unable to open\n"}
chmod 0777, "deleteme.log";
unlink("deleteme.log");
deleteme4.pl 这个演示了原始问题

#!/usr/bin/perl
`echo '' > deleteme.log;chmod 444 deleteme.log`;
if(open(TEST,">deleteme.log"))
  {print "4 opened\n"}
else
  {print "4 unable to open\n"}
chmod 0777, "deleteme.log";
unlink("deleteme.log");
我循环了这2个,如上所述:

tcsh>foreach f ( `seq 1 1000` )
perl deleteme3.pl
perl deleteme4.pl
end
在1000次尝试中,deleteme3.pl始终输出3无法打开。deleteme4.pl输出4打开4次,其余4无法打开

显然,这并不能说明我看到的频率,在大多数情况下,我的权限显示所有者是可写的,但我猜我遇到了某种甜蜜点,我的文件权限受到了干扰


我很想看看是否有人可以在任何平台上复制这些结果,但我在macOS Sierra 10.12.6上运行perl 5.18.2版系统。

我找到了异步权限更改的罪魁祸首。我的问题中遗漏了一条关键信息:我工作的目录在Dropbox!中!。我不知道dropbox曾经修改过文件的权限,但显然它确实修改了

在Dropbox应用程序运行时:

tcsh>foreach f ( `seq 1 50` )
foreach? perl deleteme1.pl
foreach? perl deleteme2.pl
foreach? end
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -rw-r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -rw-r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -rw-r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
退出Dropbox后,Dropbox仍在Dropbox目录中:

>foreach f ( `seq 1 50` )
foreach? perl deleteme1.pl
foreach? perl deleteme2.pl
foreach? end
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
我发现这一点是因为我怀疑SIP是罪魁祸首。我在恢复模式下重新启动,并使用csrutil disable禁用SIP。重新启动后,我运行了测试循环,看到了随机更改权限的相同行为,但在运行过程中,我从dropbox获得了一个对话框,说dropbox需要更改文件夹/Users/robleach/dropbox的权限。我单击OK并重新运行循环,随机权限问题并不明显

我在恢复中重新启动以重新启用SIP,并在SIP处于活动状态时再次重新启动,以确认SIP未涉及。我重新运行了循环,再次看到了随机权限问题。然后我退出dropbox并重新运行循环。结果如上

我公开承认,我缺乏知识,甚至没有意识到这个问题的dropbox方面对回答这个问题至关重要 在Dropbox中,我的开发项目是出于懒惰,所以我不必记得在两台不同的计算机上执行工作时提交/拉取未完成的更改。但是我在dropbox中已经有这个特定的项目很多年了,直到现在测试757,也就是说,756个测试按照预期执行,我从来没有遇到过任何问题。所以我甚至没有想到Dropbox会成为这个问题的一个因素。我不知道同步对源设备(即创建文件的位置)上的文件进行了活动更改


^交叉引用:

我找出了异步权限更改的罪魁祸首。我的问题中遗漏了一条关键信息:我工作的目录在Dropbox!中!。我不知道dropbox曾经修改过文件的权限,但显然它确实修改了

在Dropbox应用程序运行时:

tcsh>foreach f ( `seq 1 50` )
foreach? perl deleteme1.pl
foreach? perl deleteme2.pl
foreach? end
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -rw-r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -rw-r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -rw-r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -rw-r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
1: -r--r--r--@ 1 robleach  staff  1 Jun  2 12:09 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:09 deleteme.log
退出Dropbox后,Dropbox仍在Dropbox目录中:

>foreach f ( `seq 1 50` )
foreach? perl deleteme1.pl
foreach? perl deleteme2.pl
foreach? end
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
1: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
2: -r--r--r--  1 robleach  staff  1 Jun  2 12:11 deleteme.log
我发现这一点是因为我怀疑SIP是罪魁祸首。我在恢复模式下重新启动,并使用csrutil disable禁用SIP。重新启动后,我运行了测试循环,看到了随机更改权限的相同行为,但在运行过程中,我从dropbox获得了一个对话框,说dropbox需要更改文件夹/Users/robleach/dropbox的权限。我单击OK并重新运行循环,随机权限问题并不明显

我在恢复中重新启动以重新启用SIP,并在SIP处于活动状态时再次重新启动,以确认SIP未涉及。我重新运行了循环,再次看到了随机权限问题。然后我退出dropbox并重新运行循环。结果如上

我公开承认,我缺乏知识,以至于我意识到这个问题的dropbox方面对于回答这个问题至关重要。^我承认我的开发项目是出于懒惰而在dropbox中进行的-因此我不必记得在两个不同的平台上执行工作之间提交/拉取未完成的更改电脑。但是我在dropbox中已经有这个特定的项目很多年了,直到现在测试757,也就是说,756个测试按照预期执行,我从来没有遇到过任何问题。所以我甚至没有想到Dropbox会成为这个问题的一个因素。我不知道同步对源设备(即创建文件的位置)上的文件进行了活动更改


^交叉引用:

没有研究工作?我花了几个小时在这上面,并且已经使用perl 20年了。谁在没有评论的情况下否决了投票?backtick应该等待命令完成:执行一个命令,并且在命令完成后继续执行perl脚本。我认为backticks本质上是等待进程完成的,因为它返回了输出,确实如此。上面使用参数/bin/sh、-c和echo>file.log执行/bin/sh;chmod 444 file.log;ls-halF file.log。它等待sh返回,然后继续。正如您所说,它必须收集子对象的输出。这回答了你的问题吗?如果不是,我不知道它是什么。因为你只展示了你认为重要的部分,但实际上可能不是重要的部分,或者不是所有重要的部分,所以不可能说出为什么测试失败。请看。我猜您看到的异步可能是macOS GUI,但您只是顺便提到了Mac。所有失败的案例似乎都添加了扩展属性,因此当文件的版本碰巧存在时,Mac Spotlight等的某些内容可能碰巧访问过。但是你为什么要为这些东西付出代价呢?如果你在shell脚本中也这么做会发生什么?如果你想主动拒绝帮助,为什么你要问问题?没有研究努力?我花了几个小时在这上面,并且已经使用perl 20年了。谁在没有评论的情况下否决了投票?backtick应该等待命令完成:执行一个命令,并且在命令完成后继续执行perl脚本。我认为backticks本质上是等待进程完成的,因为它返回了输出,确实如此。上面使用参数/bin/sh、-c和echo>file.log执行/bin/sh;chmod 444 file.log;ls-halF file.log。它等待sh返回,然后继续。正如您所说,它必须收集子对象的输出。这回答了你的问题吗?如果不是,我不知道它是什么。因为你只展示了你认为重要的部分,但实际上可能不是重要的部分,或者不是所有重要的部分,所以不可能说出为什么测试失败。请看。我猜您看到的异步可能是macOS GUI,但您只是顺便提到了Mac。所有失败的案例似乎都添加了扩展属性,因此当文件的版本碰巧存在时,Mac Spotlight等的某些内容可能碰巧访问过。但是你为什么要为这些东西付出代价呢?如果你在shell脚本中也这么做会怎么样?如果你想主动拒绝帮助,为什么要问问题?是的,
我怀疑是这样的。Dropbox喜欢在同步时更改文件的图标,因此您最终拥有可写权限和扩展属性。但是,这就是为什么我们要问清楚的问题。而且,比人们想象的要少得多。您将无法在受SIP保护的目录中创建文件。没什么大不了的,但我注意到,在我自己的帮助搜索中,各种各样的人很快跳到禁用SIP,就像你尝试过一次又一次地关闭它一样。这是图标更改的一个好观点。我最近才发现。这是一个问题的原因,我在一个添加了隔离标志的应用程序中遇到了一个bug。事实上,我忘了我一直想回答那个问题。我已经开始这么做了,但是我发现关于这个bug的文档的两个参考资料需要更多的审查。然后我心烦意乱,把它忘了。当我的Mac Mini遇到冻结时,我尝试禁用它,并且有一个名为SandboxedServiceRunner的无响应进程,但是尽管禁用了,冻结仍在继续,所以我怀疑你基本上是对的。是的,我怀疑是这样的。Dropbox喜欢在同步时更改文件的图标,因此您最终拥有可写权限和扩展属性。但是,这就是为什么我们要问清楚的问题。而且,比人们想象的要少得多。您将无法在受SIP保护的目录中创建文件。没什么大不了的,但我注意到,在我自己的帮助搜索中,各种各样的人很快跳到禁用SIP,就像你尝试过一次又一次地关闭它一样。这是图标更改的一个好观点。我最近才发现。这是一个问题的原因,我在一个添加了隔离标志的应用程序中遇到了一个bug。事实上,我忘了我一直想回答那个问题。我已经开始这么做了,但是我发现关于这个bug的文档的两个参考资料需要更多的审查。然后我心烦意乱,把它忘了。当我的Mac Mini遇到冻结,并且有一个名为SandboxedServiceRunner的无响应进程时,我尝试禁用它,但是尽管禁用了,冻结仍在继续,所以我怀疑你大体上是对的。