重定向就是不使用系统的标准输入端口、标准输出端口或标准错误端口,而进行重新的指定,所以重定向分为:输入重定向
、输出重定向
和错误重定向
。
从字面上理解,输入输出重定向就是「改变输入与输出的方向」的意思。
那么,什么是输入输出方向呢?标准的输入输出方向又是什么呢?
一般情况下,我们都是从键盘读取用户输入的数据,然后再把数据拿到程序(C语言程序、Shell 脚本程序等)中使用;这就是标准的输入方向,也就是从键盘到程序
。
反过来说,程序中也会产生数据,这些数据一般都是直接呈现到显示器上,这就是标准的输出方向,也就是从程序到显示器
。
计算机的硬件设备有很多,常见的输入设备有键盘、鼠标、麦克风、手写板等,输出设备有显示器、投影仪、打印机等。不过,在Linux
中,标准输入设备指的是键盘,标准输出设备指的是显示器
。
其实输入输出方向就是数据的流动方向:
- 输入方向就是数据从哪里流向程序。数据默认从键盘流向程序,如果改变了它的方向,数据就从其它地方流入,这就是输入重定向。
- 输出方向就是数据从程序流向哪里。数据默认从程序流向显示器,如果改变了它的方向,数据就流向其它地方,这就是输出重定向。
硬件设备和文件描述符
Linux 中一切皆文件,包括标准输入设备(键盘)和标准输出设备(显示器)在内的所有计算机硬件都是文件。
为了表示和区分已经打开的文件,Linux 会给每个文件分配一个 ID,这个 ID 就是一个整数,被称为文件描述符
(File Descriptor)。
表1:与输入输出有关的文件描述符
文件描述符 | 文件名 | 类型 | 硬件 |
---|---|---|---|
0 | stdin | 标准输入文件 | 键盘 |
1 | stdout | 标准输出文件 | 显示器 |
2 | stderr | 标准错误输出文件 | 显示器 |
Linux 程序在执行任何形式的 I/O 操作时,都是在读取或者写入一个文件描述符。一个文件描述符只是一个和打开的文件相关联的整数,它的背后可能是一个硬盘上的普通文件、FIFO、管道、终端、键盘、显示器,甚至是一个网络连接。
stdin、stdout、stderr
默认都是打开的,在重定向的过程中,0、1、2
这三个文件描述符可以直接使用。
Linux Shell 输入输出重定向
通常情况下,重定向到一个文件。在Shell中,要实现重定向主要依靠重定向符,即Shell是检查命令行中有无重定向符来决定是否需要实施重定向。
重定向符 | 说明 |
---|---|
< | 实现输入重定向 |
> 或者 >> | 实现输出重定向 |
2> 或者 2>> | 实现错误重定向 |
&> | 同时实现输出重定向和错误重定向 |
1-Linux Shell 输出重定向
输出重定向是指命令的结果不再输出到显示器
上,而是输出到其它地方,一般是输出到文件中
。这样做的最大好处就是把命令的结果保存起来,当我们需要的时候可以随时查询。
表:Bash shell 支持的输出重定向符号
image.png在输出重定向中,>
代表的是覆盖,>>
代表的是追加
⚠️ 注意
输出重定向的完整写法其实是 fd>file
或者 fd>>file
,其中 fd
表示文件描述符,如果不写,默认为 1
,也就是标准输出文件。
当文件描述符为 1
时,一般都省略不写,如上表所示;
当然,如果你愿意,也可以将 command >file
写作 command 1>file
,但这样做是多此一举。
当文件描述符为大于 1
的值时,比如 2
,就必须写上。
需要重点说明的是,fd
和 >
之间不能有空格,否则 Shell 会解析失败;
>
和file
之间的空格可有可无。为了保持一致,我习惯在>
两边都不加空格。
下面的语句是一个反面教材:
echo "c.biancheng.net" 1 >log.txt
注意1和>之间的空格。echo 命令的输出结果是c.biancheng.net,我们的初衷是将输出结果重定向到 log.txt,但是当你打开 log.txt 文件后,发现文件的内容为c.biancheng.net 1,这就是多余的空格导致的解析错误。也就是说,Shell 将该条语句理解成了下面的形式:
echo "c.biancheng.net" 1 1>log.txt
更多详细内容参考 Linux Shell重定向(输入输出重定向)精讲
网友评论