Linux 输入输出重定向, &>file, 2>&1, 1>&2
相关博文原文地址:
CSDN:一个行走的民:Linux shell中2>&1的含义解释 (全网最全,看完就懂)
一、1和2在Linux中代表什么
在 Linux 下几乎一切都号称是文件,标准输入、输出也不例外,它们是叫做 fd (File Descriptor) 文件描述符。
名称 | 代码 | 操作符 | Java中表示 | Linux 下文件描述符(Debian 为例) |
---|---|---|---|---|
标准输入(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 |
使用 > 或 >> 时,默认为标准输出 1 重定向, 所以 > file 就是 1> file 的省写,1 与 > 之间不能有空格。
比如 ls -l > a.txt 就是 ls -l 1> a.txt ,数字 0, 1, 2 与它后面的操作符 > 或 < 等 总是一个整体。
2>&1 表示把 标准错误输出 重定向到 标准输出, 这在控制台下看到的效果 2>&1 和 1>&2 可能是一样的,因为标准输出或标准错误输出的目的地默认都为屏幕。
2>&1 是最常见到的写,这样就是把错误信息与标准输出都收集到一块了
&> file 表示把 标准输出 和 标准错误输出 都重定向到文件 file 中
>& file 把标准输出和标准错误输出都重定向到文件 file, 由于 > 默认为重定向标准输出,所以和 1>& file 是一个意思
1.1 输出重定向
1.2 输入重定向
1.3 绑定重定向
二、关于2>&1的含义
含义:将标准错误输出重定向到标准输出
三、为什么2>&1要放在后面
nohup java -jar app.jar >log 2>&1 &
&表示把条命令放到后台执行.
为什么2>&1一定要写到>log后面,才表示标准错误输出和标准输出都定向到log中?
把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 &>log &