出于某种奇怪的原因,OS X 突然向我展示了:
Can't locate strict.pm: Permission denied at /usr/bin/shasum5.18 line 100.
BEGIN failed--compilation aborted at /usr/bin/shasum5.18 line 100.
玩 Homebrew 时(brew doctor
例如)
我很确定它与 Apple 而不是 Homebrew 有关。与往常一样,我从不理解 Apple 在处理权限与其他 *nix 时的逻辑!
之前,我可以以普通用户身份运行以下命令:
% perl -V
现在,我必须以 root 身份运行它,这非常烦人。在我不知情的情况下发生了一些事情。
如果我以普通用户身份运行命令,我有:
% /usr/bin/perl -V
Can't locate Config.pm: Permission denied.
BEGIN failed--compilation aborted.
如果有人可以帮助我以普通用户身份运行此命令,我会很高兴。
谢谢你的帮助。
谢谢@thrig 教授,Arkadiusz Drabczyk!
这就是我所做的:
% /usr/bin/perl -le 'print for @INC' | while read d; do ls -ld -- "$d"; done
drwxr-xr-x 6 root wheel 204 1 fév 10:59 /Library/Perl/5.18/darwin-thread-multi-2level
drwxr-xr-x 4 root wheel 136 17 sep 2015 /Library/Perl/5.18
ls: /Network/Library/Perl/5.18/darwin-thread-multi-2level: No such file or directory
ls: /Network/Library/Perl/5.18: No such file or directory
ls: /Library/Perl/Updates/5.18.2: Permission denied
drwxr-xr-x 56 root wheel 1904 25 mai 15:03 /System/Library/Perl/5.18/darwin-thread-multi-2level
drwxr-xr-x 130 root wheel 4420 23 aoû 2015 /System/Library/Perl/5.18
drwxr-xr-x 66 root wheel 2244 17 sep 2015 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level
drwxr-xr-x 109 root wheel 3706 23 aoû 2015 /System/Library/Perl/Extras/5.18
drwx------+ 37 Nathalie staff 1258 8 jui 22:26 .
好主!输出/Library/Perl/Updates/5.18.2
是罪魁祸首!我简直不敢相信!
幸运的是,我设法将相关权限与使用完整 Perl 从我的其他系统获得的权限进行了比较……
然后,我安装了新权限:
sudo chmod 775 /Library/Perl/Updates
我现在可以perl -V
作为普通用户开始玩了。
这可能是由于 Apple 问题、自制程序错误地更改
@INC
以使供应商提供/usr/bin/perl
的更改正在接受这些更改或某些用户错误。@INC
是一个perl
查找模块的路径列表,所以PATH
哎呀,这是我第一个使用的 MacPorts 版本前两条路径是
local::lib
其他设置可能具有或不具有的路径。无论如何,对于这些目录中的每一个,我们都需要查找权限问题,因为这是错误消息。如果东西已经损坏,这可能会有问题,因此您无法运行perl
以查看@INC
包含的内容。好吧,是时候打破我的系统了。不加载模块的旧形式(例如
feature.pm
)可能会有所帮助,或者运行perl -V
,或者perl
在未损坏的安装上运行,然后在损坏的系统上检查这些路径。在这里,我们可以使用旧形式的代码来获取路径列表:这个错误相当明显。在其他系统上,您可能需要检查路径中每个目录的权限,因为有人可能配置错误
/
或/Users
(等等),或者可能存在一个微妙的问题,即存在不正确的组权限(例如辅助组未应用)或涉及一些花哨的文件系统 ACL。同样,这些可以在路径的任何目录上。好吧,让我们以另一种方式打破它。这次我将破坏 MacPorts 安装,因为 Apple 区域可能对其有安全限制,以防止随机更改(无论好坏)。
解决方案是相同的,查看所有目录路径
@INC
以及perl
尝试加载的模块名称(此处为strict.pm
)并更正任何权限问题。可能有多个错误。您可能需要使用系统跟踪工具( Linux 上的dtrace
或strace
)来帮助查找perl
正在查看的文件系统路径。如果
strict.pm
不存在,这是一个不同的问题,并且可能表明关键文件已被删除或安装以某种方式拙劣或硬盘驱动器出现故障,或者您使用的是奇怪的操作系统(例如 RedHat Linuxperl
)被供应商分割成各种包装。