我的团队正在编写一个需要在外部目录中调用shell脚本的Mac OS应用程序。
该应用程序在优胜美地(10.10.3)上运行良好。但是,如果我在 El Capitan (10.11.2) 上运行它,应用程序会从脚本中收到如下错误:
/bin/bash: <path-to-script>: /bin/sh: bad interpreter: Operation not permitted
我可以在这样的简单脚本上触发此错误:
#!/bin/sh
echo "Hello World!"
如果我从终端手动运行脚本,我不会收到错误。
应用程序使用文件选择器打开脚本目录。我确认应用程序可以从此目录中读取其他文件。
将/bin/sh
更改为/bin/bash
或不同路径上的/bin/sh
副本会给新的解释器路径带来相同的错误。
一位同事在禁用系统完整性保护的 El Capitan 计算机上测试了此问题,但他遇到了同样的错误。
我正在从.pkg文件安装测试应用程序。权利是:
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.security.files.bookmarks.app-scope</key>
<true/>
<key>com.apple.security.files.user-selected.read-write</key>
<true/>
添加com.apple.security.files.user-selected.executable
权利没有区别
如果我尝试运行在包构建的中间步骤中生成的.app,则可以运行脚本而不会出错。
下面的问题描述了类似的错误。但是,我检查了应用程序和脚本,发现两者都没有设置com.apple.quarantine
属性。
Mac OS:/usr/bin/env: 错误的解释器: 不允许操作
https://apple.stackexchange.com/questions/49589/bash-applications-mvim-bin-sh-bad-interpreter-operation-not-permitted
---更新----
我们在 PKG 权利列表中又添加了两个:
<key>com.apple.security.scripting-targets</key>
<true/>
<key>com.apple.security.temporary-exception.apple-events</key>
<true/>
我们尝试通过AppleScript(.scpt)文件(存储在应用程序目录中)运行简单的.sh文件,我们还确认.sh文件和.scpt文件也具有任何扩展属性,但我们仍然有该错误。
下面分别显示了 AppleScript 和 shell 脚本文件上的ls -@Oel
命令。
$ ls -@Oel TestMXMLCall.scpt
-rwxrwxrwx 1 root wheel - 2302 Jun 15 03:12 TestMXMLCall.scpt
$ ls -@Oel /usr/local/bin/mxmlc
-rwxr-xr-x 1 santanukarar staff - 2190 Jun 15 01:17 /usr/local/bin/mxmlc
试试这个:$ ls -l@ whereverthescriptis
如果它说它有com.apple.quarantine,那就是问题所在。 在其上运行其中之一,从最不危险到最危险:
$ xattr -d com.apple.quarantine whereverthescriptis # delete that attr
$ xattr -c whereverthescriptis # delete ALL the attrs on file
$ xattr -c * # on every file in this dir
$ xattr -cr . # and all subdirectories
我希望这会对某人有所帮助,因为我是上述问题的一个稍微独特的解决方案:我让其他人为我做代码,所以当我拿到代码时,它不会在 android 和 iOS 上以"不允许操作"状态运行。
事实证明,我必须转到包含该项目的文件夹,并取得该文件夹的所有权。您可以在Mac上执行此操作,方法是转到包含Flutter项目的文件夹,然后单击上下文菜单中的"获取信息"。然后将您的访问权限更改为"只读",然后在底部最后一个窗格中返回"写入和读取"。
按照上述建议之一进行操作,通过转到终端从文件夹中删除 Apple 隔离属性,然后使用"cd"命令导航到包含 Flutter 项目的文件夹,然后键入以下命令:
xattr -dr com.apple.quarantine [your flutter project directory name]
就是这样!现在,Android Studio或您选择的IDE将能够从该文件夹运行iOS和Android版本。
如果您只使用 pod,我正在解决它
- Pod 解体
- 容器安装
和项目准备运行