美文网首页
Shell 输入输出重定向

Shell 输入输出重定向

作者: 我阿郑 | 来源:发表于2022-01-27 17:28 被阅读0次

重定向就是不使用系统的标准输入端口、标准输出端口或标准错误端口,而进行重新的指定,所以重定向分为:输入重定向输出重定向错误重定向

从字面上理解,输入输出重定向就是「改变输入与输出的方向」的意思。

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

一般情况下,我们都是从键盘读取用户输入的数据,然后再把数据拿到程序(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重定向(输入输出重定向)精讲

相关文章

网友评论

      本文标题:Shell 输入输出重定向

      本文链接:https://www.haomeiwen.com/subject/ptsahrtx.html