OS X El Capitan 上的 Perl 问题

OS X El Capitan 上的 Perl 问题

由于某种奇怪的原因,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 上)来帮助查找正在查看的文件系统路径。perlstrict.pmdtracestraceperl

% sudo chmod 644 /opt/local/lib/perl5/5.26/strict.pm

如果strict.pm不存在,那就是一个不同的问题,可能表明关键文件已被删除,或者安装不知何故出错,或者硬盘驱动器出现故障,或者您使用的是一个奇怪的操作系统(例如 RedHat Linux),其中perl有被供应商切成各种包装。

相关内容