Linux 标准输入输出和错误输出重定向 2>/dev/null和>/dev/null 2>&1和2>&1>/dev/null
简介
Linux 输入输出重定向 :2>/dev/null
和>/dev/null 2>&1
和2>&1>/dev/null
0 – stdin (standard input,标准输入)
1 – stdout (standard output,标准输出)
2 – stderr (standard error,标准错误输出)
在 shell 脚本中经常会发现 >/dev/null 2>&1 这样的语句。
当执行 shell 命令时,会默认打开 3 个文件,每个文件有对应的文件描述符来方便我们使用:
类型 | 文件描述符 | 默认情况 | 对应文件句柄位置 |
---|---|---|---|
标准输入(standard input) | 0 | 从键盘获得输入 | /proc/slef/fd/0 |
标准输出(standard output) | 1 | 输出到屏幕(即控制台) | /proc/slef/fd/1 |
错误输出(error output) | 2 | 输出到屏幕(即控制台) | /proc/slef/fd/2 |
所以在执行 shell 命令时,默认是从键盘获得输入,并且将结果输出到控制台上。但是我们可以通过更改文件描述符默认的指向,从而实现输入输出的重定向。比如我们将 1 指向文件,那么标准的输出就会输出到文件中。
/dev/null 代表 linux 的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称 "黑洞"。
/dev/null是一个特殊的设备文件,这个文件接收到任何数据都会被丢弃。因此,null这个设备通常也被称为位桶(bit bucket)或黑洞。
- 2>/dev/null 意思就是把错误输出到 "黑洞"
- >/dev/null 2>&1 默认情况是 1,也就是等同于 1>/dev/null 2>&1 ,就是把标准输出重定向到 "黑洞", 还把错误输出 2 重定向到标准输出 1 ,即 标准输出和错误输出都进了“黑洞”
- 2>&1 >/dev/null 意思就是把错误输出 2 重定向到标准输出 1 中也就是屏幕,标准输出进了 " 黑洞 "。整个意思:也就是标准输出进了黑洞,错误输出打印到屏幕
/dev/null详解
在 Linux 系统中,/dev/null 是一个特殊的文件,它被称为“空设备”。它没有任何数据,读取它永远不会产生任何输出,写入它永远不会导致任何数据被存储。/dev/null 起着丢弃数据的作用,可以用于一些需要忽略输出或者输入的场合。
在本文中,我们将会深入了解 /dev/null 文件,它的作用以及如何在 Linux 中使用它。
/dev/null 的作用
在 Linux 系统中,/dev/null 是一个特殊的文件,用于将数据彻底丢弃。它是一个特殊的文件设备,可以通过标准输入和标准输出访问。读取 /dev/null 将会立即返回 EOF(文件结束符),而向它写入任何数据将会直接被忽略掉,从而丢弃数据。
因为 /dev/null 丢弃所有数据,所以它通常用于一些需要忽略输出或者输入的场合。例如,如果你正在运行一个命令,但是你不想看到输出,你可以将输出重定向到 /dev/null。类似的,如果你需要一个空的输入流来执行一个命令,你可以将输入重定向到 /dev/null。
如何使用 /dev/null
重定向输出
使用 /dev/null 可以轻松地禁止输出,将输出重定向到 /dev/null 即可。例如,以下命令将不会在屏幕上打印任何输出:
1 | $ ls /not/a/real/path > /dev/null |
在这个例子中,输出被重定向到 /dev/null,因此不会在屏幕上打印任何输出。
禁止输出和错误
如果你希望同时禁止输出和错误输出,你可以将标准输出和标准错误输出都重定向到 /dev/null。例如,以下命令将不会输出任何内容,即使命令本身存在错误:
1 | $ ls /not/a/real/path > /dev/null 2>&1 |
在这个例子中,标准输出和标准错误输出都被重定向到 /dev/null。因此,即使命令本身存在错误,也不会在屏幕上显示任何输出。
禁止输入
类似地,你也可以使用 /dev/null 来禁止输入。例如,以下命令将不会等待任何输入,而是立即退出:
1 | $ cat < /dev/null |
在这个例子中,/dev/null 被用作输入流,因此该命令不会等待任何输入,而是立即退出。
关于 ”&” 的作用
这里的 & 没有固定的意思
1 2 3 4 5 6 7 8 9 10 11 12 13 | 放在 > 后面的 & ,表示重定向的目标不是一个文件,而是一个文件描述符,内置的文件描述符如下 1 => stdout 2 => stderr 0 => stdin 2>1 代表将 stderr 重定向到当前路径下文件名为 1 的 regular file中, 2>&1 代表将 stderr 重定向到文件描述符为 1 的文件(即/dev/stdout)中,这个文件就是stdout在file system中的映射 &>file 是一种特殊的用法,也可以写成 >&file,二者的意思完全相同 都等价于 >file 2>&1 此处 &> 或者 >& 视作整体,分开没有单独的含义 |
我们可以这么理解 2>/dev/null 重定向到文件,那么 2>&1,这里如果去掉了&就是把错误输出给了文件1了,用了&是表明 1 是标准输出。