前言:为了能更好的理解 commond >/dev/null 2>&1
命令,我们将其拆分为三部分来理解。
part 1 文件描述符 0 1 2
在Linux系统启动时,三个标准文件流以及三个文件描述符j就被预先占用了,他们的具体描述如下:
文件流类型 | 描述符 | 缩写 | 默认设备 |
---|---|---|---|
标准输入 | 0 | STDIN | 键盘 |
标准输出 | 1 | STDOUT | shell终端显示器 |
标准错误输出 | 2 | STDERR | shell终端显示器 |
当我们在终端执行一个命令时,如果该命令被正常执行且有输出,则输出的输出位置为标准输出文件流,即打印在shell终端中;而如果命令执行失败,则会输出一个标准错误输出文件流,同样会打印在shell终端中。
yibingyihan@localhost:~$ whoami
yibingyihan #标准输出
yibingyihan@localhost:~$ whoani
-bash: whoani: command not found #标准错误输出
part 2 重定向 > >>
重定向是将输出定向到自定义文件或者设备的过程。重定向命令有两种:
>
:亦覆盖的形式重定向输出到文件>>
:以追加的形式重定向输出到文件
yibingyihan@localhost:~$ cat test.log #读取测试文件默认内容
This is a TestText
yibingyihan@localhost:~$ whoami >> test.log #追加方式
yibingyihan@localhost:~$ cat test.log
This is a TestText
yibingyihan
yibingyihan@localhost:~$ whoami > test.log #覆盖方式
yibingyihan@localhost:~$ cat test.log
yibingyihan
yibingyihan@localhost:~$
此时我们已经将标准输出重定向到了test.log文件中。其中
commond >> test.log
= commond 1>>test.log
,
commond > test.log
= commond 1>test.log
,
只是标准输出1
可以省略。
而前面我们说过还有一种标准错误输出
,如果命令执行错误,如果仅仅使用>> test.log
将标准输出重定向,标准错误输出还是会打印在shell终端上:
yibingyihan@localhost:~$ whoani >> test.log #追加方式
-bash: whoani: command not found #标准错误输出打印在了屏幕上
如果想让标准错误输出也重定向到test.log,可以使用2>&1
,代表将标准错误输出重定向到标准输出:
yibingyihan@localhost:~$ whoani >> test.log 2>&1 #标准输出和标准错误输出同时重定向到test.log
yibingyihan@localhost:~$ cat test.log
yibingyihan
-bash: whoani: command not found #此时标准错误输出也重定向到了test.log中
yibingyihan@localhost:~$
其中&
是***用来告诉系统,这里的1
指的是标准输出,而不是文件名***,如果不加&
,标准错误输出将重定向到名为1
的文件:
echo "TestText" > test.log
yibingyihan@localhost:~$ whoani >> test.log 2>1
yibingyihan@localhost:~$ cat test.log
TestText #可以看到标准错误输出并未定向到test.log
yibingyihan@localhost:~$cat 1
-bash: whoani: command not found #而是定向到了文件 1 中
yibingyihan@localhost:~$
part 3 伪设备——/dev/null
伪设备是指一类没有物理设备对应的一类设备节点,伪设备可以为系统的一些操作提供支持。常见的一些伪设备:
/dev/null
- 接受并丢弃所有输入; 不产生输出(总是在读取时返回文件结束指示)/dev/zero
- 接受并丢弃所有输入; 产生连续的NUL(零值)字节流/dev/full
- 读取时产生连续的NUL(零值)字节流,并在写入时返回“磁盘已满”消息/dev/random
和/dev/urandom
-它们产生的一个可变长度的数据流的伪随机数。
总结——commond > /dev/null 2>&1
通过前面三部分分解,commond > /dev/null 2>&1
已经不难理解了,它表示:
将
commond
操作产生的标准输出和标准错误输出全部丢弃,不产生任何运行日志输出。
yibingyihan@localhost:~$ whoami > /dev/null 2>&1
yibingyihan@localhost:~$ whoani > /dev/null 2>&1
配合nohup
和 &
后台运行命令的话,我们就可以做到程序的后台无输出运行。
详见: nohup &——Linux后台运行命令