作者:Gakki
前言
- 在 bash 中,在执行一个命令之前,可以使用重定向操作符对该命令的输入、输出进行重定向。从其他文件获取输入,把命令输出写到其他文件。
- 定向分为输入重定向与输出重定向。字面上理解就是改变输入/输出的方向。
- 一般情况下,标准的输入方向就是从键盘到程序;标准的输出方向就是从程序到显示器。
- Linux 中一切皆文件,包括标准输入设备(键盘)和标准输出设备(显示器)在内的所有计算机硬件都是文件。为了表示和区分已经打开的文件,Liunx 会给给每个文件分配一个 ID ,这个 ID 就是一个整数,被称为文件描述符(File Descriptor)。
文件描述符 | 文件名 | 类型 | 硬件 | 备注 |
---|---|---|---|---|
0 | STDIN | 标准输入文件 | 键盘 | 默认从stdin读取数据 |
1 | STDOUT | 标准输出文件 | 显示器 | 默认向stdout输出数据 |
2 | STDERR | 标准错误输出文件 | 显示器 | 向stderr流中写入错误信息 |
- 注:一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件。stdin、stdout、stderr 默认都是打开的,在重定向的过程中,0、1、2 这三个文件描述符可以直接使用。
输出重定向
- 在输出重定向中,
>
表示覆盖,>>
表示追加。
# 标准输出重定向
command >file:以覆盖的方式,把 command 的正确输出结果输出到 file 文件中。
command >>file: 以追加方式,把 command 的正确输出结果输出到 file 文件中。
# 标准错误输出重定向
command 2>file:以覆盖的方式,把 command 的错误信息输出到 file 文件中。
command 2>>file:以追加的方式,把 command 的错误信息输出到 file 文件中。
# 正确输出和错误信息同时保存
command >file 2>&1:以覆盖的方式,把正确输出和错误信息同时保存到同一文件(file)中。
command >>file 2>&1:以追加的方式,把正确输出和错误信息同时保存到同一个文件(file)中。
command > file1 2>file2:以覆盖的方式,把正确的输出结果输出到 file1 文件中,把错误的信息输出到 file2 文件中。
command >>file1 2>>file2:以追加的方式,把正确的输出结果输出到 file1 文件后中,把错误的信息输出到 file2 文件中。
command >file 2>file 或 command >>file 2>>file:【不推荐】,会导致 file 打开两次,引起资源竞争,导致 stdout 和 stderr 会互相覆盖
注:
- 如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null 。命令:
command > /dev/null
。/dev/null是一个文件,这个文件比较特殊,所有写入到它的内容都会被丢弃。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。如果希望屏蔽 stdout 和 stderr,可以这样写:command > /dev/null 2>&1
。 -
2>&1
:表示复制标准错误输出的文件描述符 2 到标准输出的文件描述符 1。
输入重定向
- 输入重定向就是改变输入的方向,不再使用键盘作为命令输入的来源,而是使用文件作为命令的输入。
符号 | 说明 |
---|---|
command <file | 将 file 文件中的内容作为 command 的输入。 |
command <<tag | 从标准输入(键盘)中读取数据,直到遇见分界符 tag 才停止(分界符可以是任意的字符串,用户自己定义) |
command <file1 >file2 | 将 file1 作为 command 的输入,并将 command 的处理结果输出到 file2 |
注: 输入重定向的完整写法也是 fd<file
,其中 fd 表示文件描述符,如果不写,默认为 0,也就是标准输入文件。
重定向的先后顺序
- 重定向的先后顺序:当指定了多个重定向操作时,按照重定向出现的顺序,从左到右处理。
-
command > file 2>&1
:将标准输出和标准错误指向文件 file -
command 2>&1 > file
:只将标准输出定向到文件 file。因为在将标准输出重定向到 file 之前,标准错误已经从标准输出中复制了。 - 解释说明:
- 对于
command > file 2>&1
命令来说,第一个> file
表示重定向command
命令的标准输出到 file 文件。第二个2>&1
表示复制标准错误输出到标准输出。由于标准输出已经被重定向到 file 文件,所以 file 文件会包含command
命令的标准输出和标准错误输出。 - 而
command 2>&1 > file
命令只重定向标准输出到 file 文件,标准错误输出只会打印打终端。第一个2>&1
表示复制标准错误输出到标准输出,换句话说就是:把标准错误输出写入到标准输出对应的文件。但此时标准输出还没有重定向,会关联到默认的终端,所以标准错误输出会写入到终端。
第二个> file
表示把标准输出重定向到 file 文件。这并不会影响到标准错误输出,标准错误输出还是会指向终端。因此,标准错误输出没有重定向到 file 文件。
- 对于
注:
- 输出重定向完整的写法是
fd>file
或者fd>> file
,其中 fd 表示文件描述符。如果不写,默认为 1 。也就是标准输出文件。如:command 1> file
一般写作command >file
。当文件描述符为大于 1 的值时,比如 2,就必须写上。 -
fd
与>
之间不能有空格,否则 Shell 会解析失败;>
和file
之间的空格可有可无。为了保持一致性,建议>
两边都不加空格。
其他
- 大于符号
>
用于输出重定向,小于符号<
用于输入重定向。
网友评论