Fork me on GitHub

Linux命令5-输入输出重定向

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. 文件描述符号中1表示标准输出,2表示错误输出。$\color{red}{如果文件描述符号是1,可以省略不写;如果是2,必须写上}$
  3. 文件描述符号和>之间不能有空格,否则shell会解析失败;>和文件file之间的空格非必须的。

输出重定向的完整写法其实是fd>file或者fd>>file,其中 fd 表示文件描述符,如果不写,默认为 1,也就是标准输出文件。当文件描述符为 1 时,一般都省略不写

案例

1、正确输出情形

1
2
3
ls -l > a.txt   #  将ls -l 命令的结果覆盖写入到a.txt文件中;如果文件存在,则覆盖里面的内容;如果不存在,则创建该文件
ls -l >> b.txt # 将命令的结果追加到b.txt文件的末尾
ehco "hello Linux" > c.txt # 将echo命令的结果以覆盖模式写入到文件中

2、错误输出情形

1
2
3
4
5
(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、正确和错误信息同时保存

1
2
3
ls -l >out.txt 2>&1   # 命令结果(正确或者错误)同时覆盖模式写入到文件中
ls python >>out.txt 2>&1 # 将命令结果追加到文件末尾
cat out.txt # 查看文件内容,末尾有一条错误信息

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

本文标题:Linux命令5-输入输出重定向

发布时间:2021年02月20日 - 11:02

原始链接:http://www.renpeter.cn/2021/02/20/Linux%E5%91%BD%E4%BB%A4-5-%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E9%87%8D%E5%AE%9A%E5%90%91.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea