当Linux执行一个程序时,会自动打开三个流
0
:标准输入流(默认是键盘) 1
:标准输出流(默认是屏幕)2
:标准错误流(默认是屏幕)
名称 | 代码 | 操作符 | java中表示 | Linux中文件描述符 |
---|---|---|---|---|
标准输入(stdin) | 0 | < 或 << | System.in | /dev/stdin -> /proc/self/fd/0 -> /dev/pts/0 |
标准输出(stdout) | 1 | >, >>, 1> 或 1>> | System.out | /dev/stdout -> /proc/self/fd/1 -> /dev/pts/0 |
标准错误输出(stderr) | 2 | 2> 或 2>> | System.err | /dev/stderr -> /proc/self/fd/2 -> /dev/pts/0 |
从上表看出,平常使用的 echo 'hello' > a.log
可以写成 echo 'hello' 1> a.log
为什么2>&1
要放在后面 ?
如下一条shell命令 nohup java -jar app.jar >log 2>&1 &
我们不妨把1和2都理解是一个指针,然后来看上面的语句就是这样的:
本来1----->屏幕 (1指向屏幕)
执行>log后, 1----->log (1指向log)
执行2>&1后, 2----->1 (2指向1,而1指向log,因此2也指向了log)
再来分析下nohup java -jar app.jar 2>&1 >log &
本来1----->屏幕 (1指向屏幕)
执行2>&1后, 2----->1 (2指向1,而1指向屏幕,因此2也指向了屏幕)
执行>log后, 1----->log (1指向log,2还是指向屏幕)
所以这就不是我们想要的结果。
每次都写>log 2>&1
太麻烦,能简写吗?
可以简写成 &>log
或 >&log
nohup java -jar app.jar 2>&1 >log &
简写成:nohup java -jar app.jar &>log &