【问题标题】:How to obtain an application's Bundle ID (or plist path) from only the PID?如何仅从 PID 获取应用程序的 Bundle ID(或 plist 路径)?
【发布时间】:2012-01-12 18:16:45
【问题描述】:

类似于"How to find Bundle Identifier from known PID?""How to read plist information (bundle id) from a shell script,但不同.. 因为它们都与 Xcode 构建变量扩展等有关。

我的问题是,在 BASH shell 中,他们只知道进程的 PID,如何获得该进程的 PATH 或唯一的“Bundle ID”。

我确信有一个可怕的正则表达式来解析 ps,但我希望有一些更干净、更便携的东西。前面提到的帖子中的 cmets 包括

BUNDLE_ID=$(/usr/libexec/PlistBuddy -c "Print :CFBundleIdentifier" "${BUILD_ROOT}/${INFOPLIST_PATH}")

但是,我不认为每台 Mac 上都安装了plistbuddy,更重要的是,我的问题是在理论脚本中,而不是在 Xcode 构建阶段中。..

我尝试过plutilplistkitplistdump,但似乎没有一个能奏效..

我试图实现这一点的原因是能够执行 defaults read / write 函数,而无需对父进程的 BundleID 进行硬编码。我知道如何将此信息作为参数传递给脚本..但我希望能够怀疑脚本中的检查..。

【问题讨论】:

  • 当他们被回答时我接受他们。此外,我已经回答了 70 个问题,而提出了 16 个问题。其中大多数已经接受了答案。当我可以添加到解决方案时我会发布.. 当它解决问题时我会接受答案,而不仅仅是因为有人发布了它。

标签: macos bash shell plist nsuserdefaults


【解决方案1】:

不需要一个可怕的正则表达式来解析ps 的输出——ps 实用程序已经可以满足您的要求。使用以下选项(诚然有些神秘)调用它

ps [-ww] -o comm= -p <pid>

将返回属于你的PID的可执行文件的路径(-ww参数仅在你输出到终端时才需要,因为ps将截断没有它的返回路径。否则应该没有必要)。

从那里检索包 ID 的问题在于,并非所有进程都映射到带有 Info.plist(定义包 ID)的包 - 值得注意的是,*nix 类型的可执行文件不是包,因此没有包 ID。此外,即使在应用程序包的情况下,ps 返回应用程序的核心可执行文件,而不是包本身的路径。但是,由于应用程序包中可执行文件的路径是标准化的(它位于Path.app/Contents/MacOS),因此您可以通过一些目录遍历来检索它。

假设您已将上述ps 调用的输出存储在变量execfile 中,则此

[[ ${execfile%/*} =~ ^.+/Contents/MacOS$ ]] && defaults read "${execfile%/*/*}"/Info CFBundleIdentifier

将使用defaults 检索可能路径的包标识符,以检索每个应用程序包在其根目录中包含的Info.plist 文件的CFBundleIdentifier 键的值。

【讨论】:

  • 任何在 2012 年仍然神秘的事物通常也被称为“灰心丧气”。我不认为“他们”希望“我们”这样做。不过看起来不错……会测试并报告。
  • @alexgray:我倾向于同意第一部分(*nix 工具链的 20 年演变并没有阻止我直接从 Unix Haters 手册中嘀咕段落每当我深入研究外壳时……我的意思是:-ww?真的吗?)。确实在我的系统上工作,物有所值。
  • 哈!我从未听说过The Unix Hater's Handbook。喜怒无常。
  • 我拥有第一手资料,然后新的平装本很好地提醒我,我已经使用计算机太久了。 *nix 工具链也是如此。在一些 mod 核对整个评论线程之前关闭它,因为它是 OT。完全是这样的。
  • 只是说明为什么会这样:defaults read 正在从应用程序包的 Info.plist 文件中提取一个值。扩展@kopischke 命令的最后部分扩展如下所示:defaults read /Applications/Mail.app/Contents/Info CFBundleIdentifier 返回com.apple.mail
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-29
相关资源
最近更新 更多