在macOS中,通常可以通过以下方式直接在终端中执行进程的二进制文件来获得一些可观的控制台/ shell输出:
/Applications/SOME_APPLICATION.app/Contents/MacOS/SOME_APPLICATION
这对于调试和捕获发生的错误非常有用。随着 Catalina (10.15)的引入,不鼓励以这种方式直接执行脚本等应用程序。并导致各种问题,最终需要使用/usr/bin/open
。
如何在进程启动后重定向进程的STDERR / STDOUT?
关于previously for Linux这个主题已经有了一些讨论,但目前还不清楚其中一些是否适用于macOS。
如果reptyr可以重新用于macOS,那就太棒了,因为它已经基本上适用于FreeBSD。
2条答案
按热度按时间clj7thdc1#
This answer is from 2013 but is mostly still relevant。
在Mountain Lion之前,launchd管理的所有进程(包括常规应用程序)都将其stdout和stderr文件描述符转发到系统日志。在Mountain Lion及更高版本中,stdout和stderr不适用于launchd托管应用程序。只有显式发送到系统日志的消息才会在那里结束。
如果您正在编写一个应用程序,并且希望在控制台中显示一些输出,那么可以采用基于syslog(3)或asl(3)构建的API。NSLog就是这样一个API,它的优点是可以记录到stderr,因此无论您如何启动应用程序,都可以轻松查看输出。如果您喜欢该功能,但希望直接使用asl或syslog,则需要分别查看asl_open的ASL_OPT_STDERR选项和openlog的LOG_PERROR选项。
基本上,当你双击一个应用程序(和
/usr/bin/open
一样)时,没有stdout/stderr。开发人员应该将任何相关的输出/错误发送到可用的日志API,如NSLog。mlmc2os52#
关于
/usr/bin/open
,看看它的帮助(-h
),看起来应该可以使用--stdin
和--stdout
参数: