cocoa - 找出 Cocoa 中可执行文件的位置

标签 cocoa macos

简单的问题是:如何找出 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/

相关文章:

perl - Perl如何与正在运行的脚本进行交互?

cocoa - Cocoa 中继承的、综合的属性的访问器

eclipse - 从 Eclipse 运行 Tomcat 时出现错误 404

objective-c - NSPredicate谓词WithFormat : variable substitution

objective-c - 如何在 Mac 和 iPhone 之间同步 Core-Data 应用程序?

objective-c - 拖出以删除项目

c++ - Visual C++ 程序可以在 Mac OS X 或 Linux 上编译运行吗?

macos - 以编程方式确定 MacVim 何时完成文件编辑

objective-c - 调整 Mac 显示器亮度 Objective-C?

objective-c - loadNibNamed :owner:topLevelObjects: is called 时插件崩溃