gpt4 book ai didi

macos - 检测是否从命令行(终端)启动了 macOS 应用程序

转载 作者:行者123 更新时间:2023-12-04 12:50:38 25 4
gpt4 key购买 nike

我有一个 GUI macOS 应用程序,它也可以从终端启动,带有可选的命令行参数。

当使用参数启动时,我喜欢在“cmdline”模式下运行应用程序,在这种模式下我不显示任何 UI,而是仅通过 stdin + stdout 进行通信。

我可以像这样检测这个 cmdline 模式:

BOOL cmdMode = NSProcessInfo.processInfo.arguments.count > 1;

(arg 0 始终是可执行文件的路径,因此任何更多的 args 都将手动传递 args)。

现在,这是一个大问题:

如果用户在没有终端参数的情况下调用我的应用程序(通过在 Contents/MacOS 中调用应用程序的可执行文件,即不通过 open cmd),我也喜欢进入 cmdline 模式。我如何检测到这一点?

注意:较旧的 OS X 版本确实传递了一个“-psn ...”参数,当不存在时,可用于检测从 cmdline 启动,但最近的 macOS 版本在从 cmdline 启动应用程序时似乎不再传递此参数Finder,所以我不能再用它来检测了。

更新

我意识到我几乎可以通过检查某些环境变量的存在来正确解决这个问题:
TERMPWD仅在从终端启动应用程序时设置,而不是从 Finder 启动。

但是,我也希望能够区分直接启动(可在 Contents/MacOS 目录中执行)与使用 open 启动之间的区别。命令,因为我认为 open cmd 相当于通过 Finder 打开应用程序或通过启动服务从另一个应用程序打开。

简而言之,问题也可能是: 检测应用是否由 Launch Services 启动

作为记录,以下是来自 environ() 的值.标有星号的那些仅在从 Terminal.app 调用时才出现,但在从 Finder 启动时不出现:
    __CF_USER_TEXT_ENCODING=0x1F5:0x0:0x0
* _=/Applications/Myapp.app/Contents/MacOS/Myapp
Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.laVQnD7IXl/Render
HOME=/Users/username
* LANG=en_US.UTF-8
* LC_ALL=en_US.UTF-8
* LC_CTYPE=UTF-8
LOGNAME=username
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
* PWD=/Users/username
SHELL=/bin/bash
* SHLVL=1
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.KeHv8KNuuk/Listeners
* TERM_PROGRAM_VERSION=388.1.2
* TERM_PROGRAM=Apple_Terminal
* TERM_SESSION_ID=EF2C59E6-D661-45BE-B7EF-7A0E71158C8D
* TERM=xterm-color
TMPDIR=/var/folders/hm/ycnxcbwx8xl1v7008k8wnpjh0000gn/T/
USER=username
XPC_FLAGS=0x0
XPC_SERVICE_NAME=0

但是,对于使用 Launch Services 启动的应用程序(例如在 Finder 中双击时),没有独有的环境值。

最佳答案

如果你想知道哪个进程执行了你的程序,你可以使用 getppid()获取父进程 ID,然后检查该进程以确定您是由交互式 shell 进程、Finder 或 launchctl 等执行的。
/sbin/launchd是 PID 1 - 如果您的进程的父 PID 是 1,则您是由 launchd 执行的。

否则,您将被另一个进程执行——可能是一个交互式 shell,或者作为另一个进程的子进程。您可以使用 KERN_PROCARGS syscall with sysctl() 通过其PID获取进程名称。

您可能还想考虑使用 isatty(STDIN)同样:交互式 shell 有一个 TTY,非交互式 shell 和其他进程不会。

关于macos - 检测是否从命令行(终端)启动了 macOS 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52687788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com