由于某种奇怪的原因,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。一如既往,我从来不理解苹果处理权限与其他 *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
作为普通用户开始玩了。
答案1
这可能是由于 Apple 问题、自制程序错误地改变了@INC
供应商所提供的/usr/bin/perl
这些更改,或者是某些用户错误。是一个查找模块的@INC
路径列表,所以perl
% perl -E 'say for @INC'
/Users/jhqdoe/perl5/lib/perl5/darwin-thread-multi-2level
/Users/jhqdoe/perl5/lib/perl5
/opt/local/lib/perl5/site_perl/5.26/darwin-thread-multi-2level
/opt/local/lib/perl5/site_perl/5.26
...
PATH
哎呀,这是我第一个使用的 MacPorts 版本
% /usr/bin/perl -E 'say for @INC'
/Users/jhqdoe/perl5/lib/perl5/darwin-thread-multi-2level
/Users/jhqdoe/perl5/lib/perl5
/Library/Perl/5.18/darwin-thread-multi-2level
/Library/Perl/5.18
/Network/Library/Perl/5.18/darwin-thread-multi-2level
/Network/Library/Perl/5.18
...
前两条路径来自local::lib
其他设置可能有也可能没有。无论如何,对于每个目录,我们都需要查找权限问题,因为这是错误消息。如果东西已经损坏,那么这可能会出现问题,因此您无法跑去perl
查看其中@INC
包含的内容。是时候破坏我的系统了。
% chmod 000 /Users/jhqdoe/perl5/lib/perl5
% perl -E 'say for @INC'
Can't locate feature.pm: /Users/jhqdoe/perl5/lib/perl5/feature.pm: Permission denied.
BEGIN failed--compilation aborted.
不加载模块的旧形式(例如feature.pm
)可能会有所帮助,或运行,或在未损坏的安装上perl -V
运行,然后检查损坏系统上的这些路径。perl
这里我们可以使用旧形式的代码来获取路径列表:
% perl -le 'print for @INC' | while read d; do ls -ld -- "$d"; done
d--------- 111 jhqdoe nsd 3774 Jun 1 10:44 /Users/jhqdoe/perl5/lib/perl5
...
这个错误是相当明显的。在其他系统上,您可能需要检查路径中每个目录的权限,因为有人可能配置错误/
或/Users
(等等)或者可能存在一个微妙的问题,即存在不正确的组权限(例如辅助组)未应用)或涉及一些奇特的文件系统 ACL。同样,这些可以位于路径的任何目录中。
% chmod 750 /Users/jhqdoe/perl5/lib/perl5
好吧,让我们用另一种方式来打破它。这次我将破坏 MacPorts 安装,因为 Apple 区域可能有安全限制,以防止随机更改(无论好坏)。
% sudo chmod 000 "$(perl -Mstrict -E 'say $INC{"strict.pm"}')"
% perl -Mstrict -E 'say "borked?"'
Can't locate strict.pm: /opt/local/lib/perl5/5.26/strict.pm: Permission denied.
BEGIN failed--compilation aborted.
解决方案是相同的,查看中的所有目录路径以及尝试加载的@INC
模块名称(此处为)并更正任何权限问题。可能存在多个错误。您可能需要使用系统跟踪工具(,或在 Linux 上)来帮助查找正在查看的文件系统路径。perl
strict.pm
dtrace
strace
perl
% sudo chmod 644 /opt/local/lib/perl5/5.26/strict.pm
如果strict.pm
不存在,那就是一个不同的问题,可能表明关键文件已被删除,或者安装不知何故出错,或者硬盘驱动器出现故障,或者您使用的是一个奇怪的操作系统(例如 RedHat Linux),其中perl
有被供应商切成各种包装。