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

59

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

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

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

我发现这个人有一个非常类似的问题,但被接受的答案是文件系统在挂载时有一个“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

1
你已经覆盖了可能出现问题的大多数基础内容,干得好。当您运行perl -v时会发生什么?在Perl脚本(bbcolors)中的初始注释行之后会出现什么?此外,权限后面的“@”表示文件有一些辅助属性信息;您是否已经调查了这个(也许可以使用ls -@)? - Jonathan Leffler
我用 xattr -r com.apple.quarantine /file/path 解决了这个问题。我会回答自己的问题,但是我现在还没有足够的声望在几个小时内进行回答。 - Nick
xattr -d com.apple.quarantine /usr/local/bin/bbcolors?(-r表示“递归”;-d表示“删除”。)我老是忘记这个命令叫什么。 - Jonathan Leffler
6个回答

113

你是否尝试在TextEdit中打开/保存文件?

这可能会引入文件系统元数据(隔离属性),导致你所描述的症状出现

尝试以下操作:

xattr -l /usr/local/bin/bbcolors

并且

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

如果您看到quarantine属性。


5
是的,我自己无法回答我的问题,但你从我上面的评论中得到了正确的信息。顺便说一句:在文件上执行“ls -al@”命令以查看“com.apple.quarantine”也是值得的。 - Nick
2
哈。我发现了那个解决方案,没有看你的评论。这会教训我更频繁地刷新。 - pilcrow
6
参考:如果你发现整个目录树下都有“com.apple.quarantine”属性,可以在该目录内运行“xattr -dr com.apple.quarantine .” 命令清除其内所有文件。我曾因解压从本地网络复制的一个ZIP文件而得到了一个类似被大规模隔离的目录。 - Rory O'Kane
2
com.apple.quarantine 也可能被设置在磁盘映像上,导致它被挂载时带有隔离标记。 - eile
1
对于稀疏映像,我没有在稀疏捆绑包本身上找到com.apple.quarantine属性,但它隐藏在捆绑包内的一个文件中。使用-r标志清除该属性是必要的。 - jrc
显示剩余4条评论

15

pilcrow的回答是正确的,但我想提醒您,如果您正在使用磁盘映像,则问题可能会非常混乱,因为com.apple.quarantine属性似乎从磁盘映像文件继承到内部文件(感谢febeling在Apple dev论坛上的注意!)。

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

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

然后弹出并重新挂载磁盘映像。然后您的文件将再次变得清洁。

1
如果是稀疏捆绑包,还需要检查其中的文件。例如,在我的情况下,内部的“token”文件带有隔离标志,我必须执行以下操作: xattr -d com.apple.quarantine /path/to/disk_image.sparsebundle/token - Binks

6

0
在使用BBEdit创建一个shell脚本之后(CLI: bbedit ~/bin/foo),我遇到了这个问题。似乎macOS沙盒安全功能会自动隔离被BBEdit修改的文件 - 如果该文件可执行并以某种方式被BBEdit访问。
解决方法很简单:首选项 > 应用程序 > 允许。

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


0
-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 环境变量。因此,如果您的系统上有多个解释器,它将使用您首选的解释器。 - njh

-2

1. 删除 "node_modules" 文件夹 2. 运行 npm install 命令


1
你怎么认为这个问题与Node.js有关系呢? - Quentin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接