shell macOS:如何使用终端重定向进程启动后的STDERR / STDOUT?

wb1gzix0  于 2023-05-07  发布在  Shell
关注(0)|答案(2)|浏览(263)

在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。

clj7thdc

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。

mlmc2os5

mlmc2os52#

关于/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.

相关问题