Linux命令5-输入输出重定向
本文中介绍的是Linux
中输入输出重定向,具体包含:
- 硬件设备和文件描述符
- 两个特殊符号
- 输入输出重定向
硬件设备和文件描述符
计算机的硬件设备有很多种,常见的输入设备有键盘、鼠标、手写板等,输出设备有显示器、投影仪、打印机等。不过,在 Linux 中,标准输入设备指的是键盘,标准输出设备指的是显示器(屏幕)。
Linux 中一切皆文件,包括标准输入设备(键盘)和标准输出设备(显示器)在内的所有计算机硬件都是文件。
为了表示和区分已经打开的文件,Linux 会给每个文件分配一个 ID,这个 ID 就是一个整数,被称为文件描述符(File Descriptor)。任何一条Linux命令的执行会经历以下3个过程:
Linux启动后,会默认打开3个文件描述符来描述3个过程,它们分别是:
- 标准输入:standard input 0
- 正确输出:standard output 1
- 错误输出:error output 2
标准输入重定向:STDIN,文件描述符为0;默认从键盘中输入,也可从其他文件或者命令中输入
标准输出重定向:STDOUT,文件描述符为1;默认输出到屏幕
错误输出重定向:STDERR,文件描述符为2;默认输出到屏幕
文件 | 描述符 |
---|---|
输入文件—标准输入 | 0 |
输出文件—标准输出 | 1 |
错误输出文件—标准错误输出 | 2 |
两个符号
首先介绍的是两个符号:>
和>>
>:输出重定向;将输出的内容写入到指定的文件中;文件存在则覆盖了再写入,没有文件则创建了再写入
>>:追加;将内容追加到指定文件的末尾
输入输出重定向
两种重定向
Linux shell重定向分为两种情况:输入重定向和输出重定向。从字面上理解,输入输出重定向就是改变输入和输出方向的意思。
如果从键盘中读取用户输入的数据,再将数据在程序中运行,这就是标准的输入方向,也就是从键盘到程序(标准输入);如果我们改变了它的方向,数据就从其他地方流入,这就是输入重定向。
在程序运行的过程中也会产生一些数据,这些数据会直接显示在显示器上,这就是标准的输出方向,从程序到显示器(标准输出);如果我们改变了数据流向,数据就会流向其他地方,这就是输出重定向。输出重定向则是将原本要输出的内容写入到指定的文件中
输出重定向的频率更高
输出重定向两种技术和模式
两种不同的技术:
- 标准输出重定向
- 错误输出重定向
两种不同的模式:
- 清空写入:类比覆盖的效果
- 追加写入:直接追加到末尾
输入重定向
符号
$\color{red}{输入重定向}$中用到的符号及其作用如下表所示:
符号 | 作用 |
---|---|
命令 < 文件 | 将文件作为命令的标准输入 |
命令 << 分界符 | 从标准输入中读入,直到遇到分解符才停止 |
命令 < 文件1 > 文件2 | 将文件1作为命令的标准输入并标准输出到文件2中 |
案例
1 | wc -l < readme.txt # 把readme.txt文件导入给wc -l命令,统计文件的行数,等同于cat readme.txt | wc -l的管道符命令组合 |
输出重定向
符号
输出重定向就是将结果不再输出到显示器上,而是输出到其他地方,比如某个文件中。这样最大的好处就是能够将命令的结果保存起来,可以方便随时查询使用。常用的输出重定向符号有:
符号 | 作用 |
---|---|
命令 > 文件 | 将标准输出重定向到一个文件中(清空原有文件的数据) |
命令 2> 文件 | 将错误输出重定向到一个文件中(清空原有文件的数据) |
命令 >> 文件 | 将标准输出重定向到一个文件中(追加到原有内容的后面) |
命令 2>> 文件 | 将错误输出重定向到一个文件中(追加到原有内容的后面) |
命令 >> 文件 2>&1 或 命令 &>> 文件 | 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面) |
记住3点:
- >表示覆盖写入;>>表示追加末尾写入
- 文件描述符号中1表示标准输出,2表示错误输出。$\color{red}{如果文件描述符号是1,可以省略不写;如果是2,必须写上}$
- 文件描述符号和>之间不能有空格,否则shell会解析失败;>和文件file之间的空格非必须的。
输出重定向的完整写法其实是
fd>file
或者fd>>file
,其中 fd 表示文件描述符,如果不写,默认为 1,也就是标准输出文件。当文件描述符为 1 时,一般都省略不写
案例
1、正确输出情形
1 | ls -l > a.txt # 将ls -l 命令的结果覆盖写入到a.txt文件中;如果文件存在,则覆盖里面的内容;如果不存在,则创建该文件 |
2、错误输出情形
1 | (base) peter:~ peter$ ls python # 错误命令 |
3、正确和错误信息同时保存
1 | ls -l >out.txt 2>&1 # 命令结果(正确或者错误)同时覆盖模式写入到文件中 |
4、正确结果和错误结果分开保存
将正确的结果和错误的结果保存到不同文件中:
- 正确结果(文件描述符号1,可省略):out.txt
- 错误结果(文件描述符号2):err.txt
1 | ls -l >>out.txt 2>>err.txt |
5、清空输出结果
如果不想把命令的输出结果保存在文件或者显示到屏幕上,可以将命令的结果重定向到/dev/null
文件中:
1 | ls -l &>/dev/null |
/dev/null
文件就像是Linux的垃圾箱,任何放入垃圾箱的数据都会被丢弃,不能恢复。
参考文章
shell数据重定向精讲:http://c.biancheng.net/view/942.html
Linux就该这么学-重定向和管道符:https://www.linuxprobe.com/chapter-03.html