本文中介绍的是Linux中输入输出重定向,具体包含:
计算机的硬件设备有很多种,常见的输入设备有键盘、鼠标、手写板等,输出设备有显示器、投影仪、打印机等。不过,在 Linux 中,标准输入设备指的是键盘,标准输出设备指的是显示器(屏幕)。
Linux 中一切皆文件,包括标准输入设备(键盘)和标准输出设备(显示器)在内的所有计算机硬件都是文件。
为了表示和区分已经打开的文件,Linux 会给每个文件分配一个 ID,这个 ID 就是一个整数,被称为文件描述符(File Descriptor)。任何一条Linux命令的执行会经历以下3个过程:

Linux启动后,会默认打开3个文件描述符来描述3个过程,它们分别是:
标准输入重定向:STDIN,文件描述符为0;默认从键盘中输入,也可从其他文件或者命令中输入 标准输出重定向:STDOUT,文件描述符为1;默认输出到屏幕 错误输出重定向:STDERR,文件描述符为2;默认输出到屏幕
文件 | 描述符 |
|---|---|
输入文件—标准输入 | 0 |
输出文件—标准输出 | 1 |
错误输出文件—标准错误输出 | 2 |
首先介绍的是两个符号:>和>>
>:输出重定向;将输出的内容写入到指定的文件中;文件存在则覆盖了再写入,没有文件则创建了再写入
>>:追加;将内容追加到指定文件的末尾
Linux shell重定向分为两种情况:输入重定向和输出重定向。从字面上理解,输入输出重定向就是改变输入和输出方向的意思。
如果从键盘中读取用户输入的数据,再将数据在程序中运行,这就是标准的输入方向,也就是从键盘到程序(标准输入);如果我们改变了它的方向,数据就从其他地方流入,这就是输入重定向。
在程序运行的过程中也会产生一些数据,这些数据会直接显示在显示器上,这就是标准的输出方向,从程序到显示器(标准输出);如果我们改变了数据流向,数据就会流向其他地方,这就是输出重定向。输出重定向则是将原本要输出的内容写入到指定的文件中
输出重定向的频率更高
两种不同的技术:
两种不同的模式:
$\color{red}{输入重定向}$中用到的符号及其作用如下表所示:
符号 | 作用 |
|---|---|
命令 < 文件 | 将文件作为命令的标准输入 |
命令 << 分界符 | 从标准输入中读入,直到遇到分解符才停止 |
命令 < 文件1 > 文件2 | 将文件1作为命令的标准输入并标准输出到文件2中 |
wc -l < readme.txt # 把readme.txt文件导入给wc -l命令,统计文件的行数,等同于cat readme.txt | wc -l的管道符命令组合输出重定向就是将结果不再输出到显示器上,而是输出到其他地方,比如某个文件中。这样最大的好处就是能够将命令的结果保存起来,可以方便随时查询使用。常用的输出重定向符号有:

符号 | 作用 |
|---|---|
命令 > 文件 | 将标准输出重定向到一个文件中(清空原有文件的数据) |
命令 2> 文件 | 将错误输出重定向到一个文件中(清空原有文件的数据) |
命令 >> 文件 | 将标准输出重定向到一个文件中(追加到原有内容的后面) |
命令 2>> 文件 | 将错误输出重定向到一个文件中(追加到原有内容的后面) |
命令 >> 文件 2>&1 或 命令 &>> 文件 | 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面) |
记住3点:
输出重定向的完整写法其实是
fd>file或者fd>>file,其中 fd 表示文件描述符,如果不写,默认为 1,也就是标准输出文件。当文件描述符为 1 时,一般都省略不写
1、正确输出情形
ls -l > a.txt # 将ls -l 命令的结果覆盖写入到a.txt文件中;如果文件存在,则覆盖里面的内容;如果不存在,则创建该文件
ls -l >> b.txt # 将命令的结果追加到b.txt文件的末尾
ehco "hello Linux" > c.txt # 将echo命令的结果以覆盖模式写入到文件中2、错误输出情形
(base) peter:~ peter$ ls python # 错误命令
ls: python: No such file or directory # 该文件或者目录不存在
(base) peter:~ peter$ ls python 2> err.txt # 将上面的错误信息输出到err.txt文件中
(base) peter:~ peter$ cat err.txt # 查看err.txt文件,恰好是上面的错误内容
ls: python: No such file or directory
3、正确和错误信息同时保存
ls -l >out.txt 2>&1 # 命令结果(正确或者错误)同时覆盖模式写入到文件中
ls python >>out.txt 2>&1 # 将命令结果追加到文件末尾
cat out.txt # 查看文件内容,末尾有一条错误信息

4、正确结果和错误结果分开保存
将正确的结果和错误的结果保存到不同文件中:
ls -l >>out.txt 2>>err.txt5、清空输出结果
如果不想把命令的输出结果保存在文件或者显示到屏幕上,可以将命令的结果重定向到/dev/null文件中:
ls -l &>/dev/null/dev/null文件就像是Linux的垃圾箱,任何放入垃圾箱的数据都会被丢弃,不能恢复。
shell数据重定向精讲:http://c.biancheng.net/view/942.html
Linux就该这么学-重定向和管道符:https://www.linuxprobe.com/chapter-03.html