简单的问题是:如何找出 Cocoa 应用程序中可执行文件的位置。
请记住,在许多类 Unix 操作系统中,人们使用 PATH 环境来为其可执行文件分配首选位置,特别是当他们的系统中有同一应用程序的多个版本时。作为一个好的实践,我们的 Cocoa 应用程序应该找到它所需的可执行文件的首选位置。
例如,Leopard 默认配置中有一个 SVN 1.4,位于/usr/bin,而您安装了一个更新的版本,例如通过 MacPorts 在/opt/local/bin 安装了 SVN 1.5.3。然后使用/etc/path.d 或 .bash_profile 或 .zshrc 设置 PATH,如下所示:
导出 PATH=/opt/local/bin:$PATH
这样你就可以从系统中使用新版本的 svn 而不是旧版本。它在任何终端环境下都能正常工作。但在 Cocoa 应用程序中则不然。据我所知,Cocoa 应用程序只有一个默认的 PATH 环境,如下所示:
导出 PATH="/usr/bin:/bin:/usr/sbin:/sbin"
默认情况下它不会使用/etc/path.d、.bash_profile、.profile、.zshrc等中的配置
那么我们到底该怎么做呢?
附:我们有a semi-solution here ,但并不能完全满足本题的目的。
最佳答案
尝试执行此操作的棘手部分是,用户可以将其 shell 设置为任何内容:sh、bash、csh、tcsh 等,并且每个 shell 设置其终端环境的方式不同。我不确定我自己是否会为此烦恼,但如果您真的愿意,这就是我会采取的路线。
第一步是找出用户的 shell。在 OS X 上,此信息存储在目录服务中,可以通过 DirectoryService.framework 中的 API 或使用 dscl 命令行工具来访问目录服务。 DirectoryService API 是一个令人头疼的问题,所以我可能会选择 CLI 路线。在 Cocoa 中,您可以使用 NSTask 来执行带参数的工具来获取用户的 shell(我将在其他地方详细介绍这一点)。该命令类似于:
dscl -plist localhost -read/Local/Default/Users/用户名 UserShell
这将返回 XML 文本,您可以将其解释为 plist 并转换为 NSDictionary,或者您可以省略 -plist
选项并自行解析文本输出。
一旦知道用户 shell 的路径,下一步就是执行该 shell 并告诉它运行 env
命令来打印出用户的环境。看起来大多数 shell 都接受 -c
命令行选项,让你传入一个字符串来执行 - 我猜你只需要假设它是用户拥有的任何 shell 的通用接口(interface)选择。
一旦您拥有了用户的环境,您就可以从中获取他们的路径列表,并从中搜索您要查找的任何可执行文件。就像我说的,我真的不知道这是否值得这么麻烦,但如果我实现这个,那就是我会走的方向。
关于cocoa - 找出 Cocoa 中可执行文件的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/208897/