Mac OS:/usr/bin/env:错误的解释器:不允许操作

Posted

技术标签:

【中文标题】Mac OS:/usr/bin/env:错误的解释器:不允许操作【英文标题】:Mac OS: /usr/bin/env: bad interpreter: Operation not permitted 【发布时间】:2012-04-14 16:58:49 【问题描述】:

我正在尝试在 Mac OS 10.7 (Lion) 上运行此脚本,但出现错误:

$ bbcolors
-bash: /usr/local/bin/bbcolors: /usr/bin/env: bad interpreter: Operation not permitted

我已在我的其他 Mac 上成功运行此脚本。它只是从 Daring Fireball 下载并未经修改的 this script。

我发现this person 有一个非常相似的问题,但公认的答案是文件系统在挂载时有一个“noexe”选项。我很确定这对我来说不是这种情况,因为我刚刚将它放在 /usr/local/bin/ 中,并且那里的其他东西工作正常(它也不能从其他地方运行或作为其他用户(包括 root)运行) .

$ which bbcolors
/usr/local/bin/bbcolors
$ ls -l /usr/local/bin/bbcolors 
-rwxr-xr-x@ 1 nick  staff  9751 Mar 30 19:09 /usr/local/bin/bbcolors

这是一个 Perl 脚本而不是编译后的二进制文件,这无关紧要。以下是有关其价值的一些额外信息:

$ cat /usr/local/bin/bbcolors |head -n 1
#!/usr/bin/env perl
$ which perl
/usr/bin/perl
$ env | grep PATH
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

【问题讨论】:

您已经了解了大多数可能出现问题的正常基础;做得好。当你运行perl -v 时会发生什么? Perl 脚本 (bbcolors) 中最初的注释行之后会出现什么?另外,权限后面的@表示文件有一些辅助属性信息;你有没有调查过那是(可能是ls -@)? 我用xattr -r com.apple.quarantine /file/path 解决了这个问题我会回答我自己的问题,但我没有足够的代表来做几个小时。 xattr -d com.apple.quarantine /usr/local/bin/bbcolors? (-r 表示“递归”;-d 表示“删除”。)我一直忘记那个命令叫什么。 【参考方案1】:
-bash: /usr/local/bin/bbcolors: /usr/bin/env: bad interpreter: Operation not permitted

/usr/bin/env 存在吗?你能运行它吗?自行运行它应该将您的环境变量转储到标准输出。

您可以放心更换:

#!/usr/bin/env perl

带有您选择的perl 二进制文件的完整路径,例如:

#!/usr/bin/perl

【讨论】:

使用#!/usr/bin/env perl 的优点是它使用您的PATH 环境。因此,如果您的系统上有多个解释器,它会使用您首选的解释器。【参考方案2】:

您是否碰巧在 TextEdit 中打开/保存了文件?

可以引入文件系统元数据(隔离属性)leading to the symptom you describe。

试试:

xattr -l /usr/local/bin/bbcolors

xattr -d com.apple.quarantine /usr/local/bin/bbcolors

如果您看到隔离属性。

【讨论】:

是的,我无法回答我自己的问题,但您从我上面的 cmets 中获得了正确的信息。 FWIW:还值得在文件上添加ls -al@ 以查看com.apple.quarantine 哈。我发现该解决方案没有阅读您的 cmets。这将教会我更频繁地刷新。 作为参考,如果您意识到您有一个具有com.apple.quarantine 属性的完整目录树,请从目录内部运行xattr -dr com.apple.quarantine . 以清除其中的所有文件。通过解压缩我通过本地网络复制的 zip 文件,我得到了一个像这样的大规模隔离目录。 com.apple.quarantine 也可能设置在磁盘映像上,导致它与隔离区一起挂载。 对于稀疏图像,我没有在稀疏包本身上找到 com.apple.quarantine 属性,但它隐藏在包内的文件中。 -r 标志是清除属性所必需的。【参考方案3】:

我已经解决了这个问题。用 TextEdit 打开命令文件然后保存。

更多信息:Resolved Operation not permitted

【讨论】:

【参考方案4】:

pilcrow 的回答是正确的,但是我提请您注意,如果您使用的是磁盘映像,问题可能会非常混乱,因为 com.apple.quarantine 属性似乎是从磁盘映像文件继承的到里面的文件(感谢febeling at Apple dev forums 注意到这一点!)。

要解决这个问题,你必须从磁盘映像中删除隔离属性:

xattr -d com.apple.quarantine /path/to/disk/image

然后弹出并重新挂载磁盘映像。然后您的文件将再次干净。

【讨论】:

如果是稀疏包,还要检查里面的文件。例如。在我的情况下,里面的token 文件有隔离标志,我必须这样做:xattr -d com.apple.quarantine /path/to/disk_image.sparsebundle/token【参考方案5】:

我在 BBEdit(CLI:bbedit ~/bin/foo)中创建了一个 shell 脚本后遇到了这个问题。似乎 macOS 沙盒安全功能会自动隔离由 BBEdit 修改的文件——如果该文件是可执行的并且被 BBEdit 以某种方式访问​​。

修复很简单:首选项 > 应用程序 > 允许

https://www.barebones.com/support/bbedit/quarantine.html

【讨论】:

以上是关于Mac OS:/usr/bin/env:错误的解释器:不允许操作的主要内容,如果未能解决你的问题,请参考以下文章

#!/usr/bin/env python 是什么

关于#!/usr/bin/env python 的用法

#!/usr/bin/env python3和# -*- coding: utf-8 -*-

#!/usr/bin/env python作用

python中#!/usr/bin/env python与#!/usr/bin/python

出现错误 /usr/bin/env: node : Permission Denied