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 python3和# -*- coding: utf-8 -*-