commond >/dev/null 2>&1 命令详解

前言:为了能更好的理解 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后台运行命令

猜你喜欢

转载自blog.csdn.net/YiBYiH/article/details/127314526