190301-linux输入与输出重定向

linux输入与输出重定向

什么是输入和输出重定向

Linux Shell 重定向分为两种,一种输入重定向,一种是输出重定向;从字面上理解,输入输出重定向就是「改变输入与输出的方向」的意思。

那么,什么是输入输出方向呢?标准的输入输出方向又是什么呢?

一般情况下,我们都是从键盘读取用户输入的数据,然后再把数据拿到程序(C语言程序、Shell 脚本程序等)中使用;这就是标准的输入方向,也就是从键盘到程序。

反过来说,程序中也会产生数据,这些数据一般都是直接呈现到显示器上,这就是标准的输出方向,也就是从程序到显示器。

我们可以把观点提炼一下,其实输入输出方向就是数据的流动方向:

  • 输入方向就是数据从哪里流向程序。数据默认从键盘流向程序,如果改变了它的方向,数据就从其它地方流入,这就是输入重定向。

  • 输出方向就是数据从程序流向哪里。数据默认从程序流向显示器,如果改变了它的方向,数据就流向其它地方,这就是输出重定向。

硬件设备和文件描述符

计算机的硬件设备有很多,常见的输入设备有键盘、鼠标、麦克风、手写板等,输出设备有显示器、投影仪、打印机等。不过,在 Linux 中,标准输入设备指的是键盘,标准输出设备指的是显示器。

Linux 中一切皆文件,包括标准输入设备(键盘)和标准输出设备(显示器)在内的所有计算机硬件都是文件。

为了表示和区分已经打开的文件,Linux 会给每个文件分配一个 ID,这个 ID 就是一个整数,被称为文件描述符(File Descriptor)。

文件描述符 文件名 类型 硬件
0 stdin 标准输入文件 键盘
1 stdout 标准输出文件 显示器
2 stderr 标准错误输出文件 显示器

stdin、stdout、stderr 默认都是打开的,在重定向的过程中,0、1、2 这三个文件描述符可以直接使用。

输出重定向

输出重定向是指命令的结果不再输出到显示器上,而是输出到其它地方,一般是文件中。这样做的最大好处就是把命令的结果保存起来,当我们需要的时候可以随时查询。Bash 支持的输出重定向符号如下表所示。

文件描述符 文件名 类型
标准输出重定向 command >file 标准错误输出文件
command >>file 以追加的方式,把 command 的正确输出结果输出到 file 文件中

关于 “&” 的作用

这里的 & 没有固定的意思

1
2
3
4
5
6
7
8
放在 > 后面的 & ,表示重定向的目标不是一个文件,而是一个文件描述符,内置的文件描述符如下
1 => stdout
2 => stderr
0 => stdin
2>1 代表将 stderr 重定向到当前路径下文件名为 1 的 regular file中
2>&1 代表将 stderr 重定向到文件描述符为 1 的文件(即/dev/stdout)中,这个文件就是stdout在file system中的映射

&>file 是一种特殊的用法,也可以写成 >&file,二者的意思完全相同,都等价于>file 2>&1,此处 &> 或者 >& 视作整体,分开没有单独的含义

重定向绑定

1
>/dev/null 2>&1

这条命令其实分为两命令,一个是 >/dev/null,另一个是 2>&1

  1. 这条命令的作用是将标准输出1重定向到/dev/null中。/dev/null代表linux的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称”黑洞”。那么执行了>/dev/null之后,标准输出就会不再存在,没有任何地方能够找到输出的内容
  2. 这条命令用到了重定向绑定,采用&可以将两个输出绑定在一起。这条命令的作用是错误输出将和标准输出同用一个文件描述符,说人话就是错误输出将会和标准输出输出到同一个地方

本文参考链接

# ,
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×