在UNIX中,我应该编写一个Java文件,将"EXIT 1"打印到标准错误,然后以1的状态退出。
这是我的方法。。
System.err.println("EXIT 1");
System.exit(1);
这就是我应该做的吗?
如果是,我应该如何在Unix shell中使用它?当我在bash中编译和运行它时,它只打印"EXIT 1"(所以它做的事情与System.out.println相同,为什么我要使用"err"?)。这里的"标准误差"是什么?
每个运行的程序都有以下三个流:
- 标准输入(stdin),通常来自键盘。暴露为
System.in
- 标准输出(stdout),它通常进入控制台。暴露为
System.out
- 标准错误(stderr),通常也会进入控制台。暴露为
System.err
您的程序是正确的,它确实会打印到stderr。但在正常情况下,stderr流和stdout流一样进入控制台,因此它们在视觉上无法区分。
但是,错误消息应该使用stderr而不是stdout的原因是重定向。这意味着您将stderr发送到一个文件而不是控制台。同时,stdout将不受影响,因为这两个流是独立的。
例如,您可以在bash、cmd、PowerShell等中执行此操作:
$ java Program 2> errors.txt
现在,System.err.println()
的所有输出都将在errors.txt
中结束,而System.out.println()
仍将进入屏幕。这有助于调试。
几乎每个进程都有三个数据流:
- 标准输入:这是程序的输入流,可以来自终端、控制台、另一个进程的管道输出,也可以来自其他方式
- 标准错误:这是所有调试和错误消息的位置。这使得这类信息可以容易地从程序的常规输出中单独捕获。Web服务器通过
stderr
向error_log
文件发送错误消息来实现这一点,而正常的日志文件将是例如access_log
- 标准输出:这是运行程序的用户期望看到所述输出的所有典型、期望的输出出现的地方
标准输出(stdout
)和标准误差(stderr
)几乎总是分别来自进程的第一和第二输出流。这允许我做一些类似/path/to/my/neat/program > logs/program.log 2> logs/program.err
的事情,并对输出和错误进行很好的排序。