在macOS中,通常可以通过直接在终端中执行进程来执行进程,从而获得一些可观的控制台/shell输出:
/Applications/SOME_APPLICATION.app/Contents/MacOS/SOME_APPLICATION
这对于调试和捕获发生的错误非常有用。随着Catalina(10.15(的引入,不鼓励以这种方式直接执行脚本等应用程序,并导致各种问题,最终需要使用/usr/bin/open
。
我们如何在进程启动后重定向进程的 STDERR/STDOUT?
之前在Linux上已经有一些关于这个话题的讨论,但目前尚不清楚其中一些现在是否适用于macOS。
如果retyr可以重新用于macOS,那就太棒了,因为它已经主要适用于FreeBSD。
这个答案来自 2013 年,但大部分仍然相关。
在Mountain Lion之前,所有由 管理的流程都已启动,包括 常规应用程序,具有其标准输出和标准输出文件描述符 转发到系统日志。在山狮及以上,标准和 STDERR 对于启动的托管应用程序无处可去。仅消息 显式发送到系统日志将在那里结束。
如果您正在编写应用程序并希望显示一些输出 在控制台中,然后采用基于 syslog(3( 或 asl(3( 构建的 API 相反。NSLog 就是这样一个 API,它的优点是可以记录到 stdrr也是,所以无论你如何都可以轻松看到你的输出 启动了您的应用程序。如果您想要该功能但想要 要直接使用 ASL 或系统日志,您需要查看 ASL_OPT_STDERR选项asl_open,LOG_PERROR选项用于 分别打开日志。
基本上,当您双击应用程序(与/usr/bin/open
相同(时,没有stdout/stderr。开发人员应将任何相关的输出/错误发送到可用的日志记录 API,例如 NSLog。
关于/usr/bin/open
,看看它的帮助(-h
(,看起来应该可以使用--stdin
和--stdout
参数:
⇒ /usr/bin/open -h
Usage: open [-e] [-t] [-f] [-W] [-R] [-n] [-g] [-h] [-s <partial SDK name>][-b <bundle identifier>] [-a <application>] [-u URL] [filenames] [--args arguments]
Help: Open opens files from a shell.
By default, opens each file using the default application for that file.
If the file is in the form of a URL, the file will be opened as a URL.
Options:
..snip..
-i, --stdin PATH Launches the application with stdin connected to PATH; defaults to /dev/null
-o, --stdout PATH Launches the application with /dev/stdout connected to PATH;
--stderr PATH Launches the application with /dev/stderr connected to PATH to
--env VAR Add an enviroment variable to the launched process, where VAR is formatted AAA=foo or just AAA for a null string value.