输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到屏幕 的数据信息写入到指定文件中。
输出重定向分为了标准输出重定向和错误输出重定向两种不同的技术, 以及覆盖写入与追加写入两种模式。
➢ 标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可从其他文件或 命令中输入。
➢ 标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕。
➢ 错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕。
比如分别查看两个文件的属性信息,我们先创建出第一个文件,而第二个文件是不存在 的。所以,虽然针对这两个文件的操作都分别会在屏幕上输出一些信息,但这两个操作的差 异其实很大:
[root@rhel-8 ~]# touch test[root@rhel-8 ~]# ls -l test-rw-r--r--. 1 root root 0 Nov 1418:42 test [root@rhel-8 ~]# ls -l xxxxxxls: cannot access 'xxxxxx': No such file or directory
在上述命令中,名为 test 的文件是真实存在的,输出信息是该文件的一些相关权限、所 有者、所属组、文件大小及修改时间等信息,这也是该命令的标准输出信息。而名为 xxxxxx 的第 二个文件是不存在的,因此在执行完 ls 命令之后显示的报错提示信息也是该命令的错误输出信息。
那么,要想把原本输出到屏幕上的数据转而写入到文件当中,就要区别对待这两种输出信息。
对于重定向中的标准输出模式,可以省略文件描述符 1 不写,而错误输出模式的文件描 述符 2 是必须要写的。
通过标准输出重定向将 man bash 命令原本要输出到屏 幕的信息写入到文件 readme.txt 中,然后显示 readme.txt 文件中的内容。具体命令如下:
[root@rhel-8 ~]# man bash > readme.txt[root@rhel-8 ~]# cat readme.txtBASH(1) General Commands Manual BASH(1) NAME bash- GNU Bourne-Again SHell
通过覆盖写入模式向 readme.txt 文件写入多行数据(该文件中已包含 上一个实验的 man 命令信息)。需要注意的是,在通过覆盖写入模式向文件中写入数据时,每 一次都会覆盖掉上一次写入的内容,所以最终文件中只有最后一次的写入结果:
[root@rhel-8 ~]# echo "Hello World" > readme.txt[root@rhel-8 ~]# echo "Hello World" > readme.txt[root@rhel-8 ~]# cat readme.txtHello World
通过追加写入模式向 readme.txt 文件写入一次数据,然后在执行 cat 命令之后,可以看 到如下所示的文件内容:
[root@rhel-8 ~]# echo "Hello RHEL" >> readme.txt[root@rhel-8 ~]# cat readme.txtHello World Hello RHEL
虽然都是输出重定向技术,但是命令的标准输出和错误输出还是有区别的。例如查看当 前目录中某个文件的信息,这里以 test 文件为例。由于这个文件是真实存在的,因此 使用标准输出即可将原本要输出到屏幕的信息写入到文件中,而错误的输出重定向则依然把 信息输出到了屏幕上。
[root@rhel-8 ~]# ls -l test > /root/readme.txt[root@rhel-8 ~]# ls -l test 2> /root/readme.txt-rw-r--r--. 1 root root 0 Nov 1418:42 test
如果想把命令的报错信息写入到文件,该怎么操作呢?当用户在执行一个自动化的 Shell 脚本时,这个操作会特别有用,而且特别实用,因为它可以把整个脚本执行过程中的报错信 息都记录到文件中,便于安装后的排错工作。
接下来以一个不存在的文件进行实验演示:
[root@rhel-8 ~]# ls -l xxxxxx > /root/test.txtls: cannot access 'xxxxxx': No such file or directory [root@rhel-8 ~]# ls -l xxxxxx 2> /root/test.txt[root@rhel-8 ~]# cat test.txtls: cannot access 'xxxxxx': No such file or directory
还有一种常见情况,就是我们想不区分标准输出和错误输出,只要命令有输出信息则全 部追加写入到文件中。这就要用到&>>操作符了:
[root@rhel-8 ~]# ls -l test &>> readme.txt[root@rhel-8 ~]# ls -l xxxxxx &>> readme.txt[root@rhel-8 ~]# cat readme.txt-rw-r--r--. 1 root root 0 Nov 1418:42 test ls: cannot access 'xxxxxx': No such file or directory
输入重定向相对来说有些冷门,在工作中遇到的概率会小一点。输入重定向的作用是把 文件直接导入到命令中。接下来使用输入重定向把 readme.txt 文件导入给 wc -l 命令,统计一 下文件中的内容行数:
[root@rhel-8 ~]# wc -l < readme.txt2
这次的输出结果没有了文件名称。
[root@rhel-8 ~]# wc -l /etc/passwd46 /etc/passwd
因为此前使用的“wc -l /etc/passwd”是一种非常标准的“命令+参数+对象”的执行 格式,而这次的“wc -l < readme.txt”则是将 readme.txt 文件中的内容通过操作符导入到命令 中,没有被当作命令对象进行执行,因此 wc 命令只能读到信息流数据,而没有文件名称的信息。