重定向
标准输入、输出和错误
许多程序都会产生某种输出。此输出通常由两种类型。一种是程序的输出结果;也就是说,数据程序所产生的。另一种是某些状态或错误消息
告诉我们程序进展如何。
如果我们查看像ls
这样的命令,我们可以看到它在屏幕上显示其结果和错误消息。遵循“一切皆文件
”,诸如ls
之类的程序实际上将其结果保存到一个称为标准输出
的特殊文件中(通常表示stdout
),状态消息发送到另一个文件,称为标准错误
(stderr
)。
默认情况下,标准输出和标准错误都输出到屏幕
上,而不保存到磁盘文件中。另外,许多程序从称为标准输入(stdin
)的设备(文件)中获取输入,默认情况下已连接到键盘
。
重定向标准输出
I/O
重定向使我们可以重新定义标准输出的位置。重定向标准输出到另一个文件而不是屏幕,我们使用“>”
or“>>”
操作符重定向到文件。
[root@iZerb5rob3dcf6Z ~]# ls /usr/bin/ > stdout.txt
[root@iZerb5rob3dcf6Z ~]# less stdout.txt
....
[root@iZerb5rob3dcf6Z ~]# ls /bin/usr > stdout.txt
ls: 无法访问/bin/usr: 没有那个文件或目录
[root@iZerb5rob3dcf6Z ~]# ll stdout.txt
-rw-r--r-- 1 root root 0 6月 11 19:07 stdout.txt
由于我们只重定向了标准输出而不是标准错误,该错误消息仍被发送到屏幕。而此时stdio.txt
文件夹为空,这是因为,当我们使用“>”
重定向输出时,始终从头开始重写目标文件。而ls
命令没有产生任何结果,只有一条错误消息,重定向操作开始重写文件,然后由于错误而停止,导致其被截断。如果我们不想文件内容被覆盖则可以使用“>>”
,此操作为追加:
[root@iZerb5rob3dcf6Z ~]# ll stdout.txt
-rw-r--r-- 1 root root 97414 6月 11 19:15 stdout.txt
[root@iZerb5rob3dcf6Z ~]# ll /usr/bin/ >> stdout.txt
[root@iZerb5rob3dcf6Z ~]# ll stdout.txt
-rw-r--r-- 1 root root 194828 6月 11 19:15 stdout.txt
可以看大文件内容有所增长。
输出重定向:‘>’: 覆盖输出
‘>>’:追加输出
重定向标准错误
fd:file descriptor
,文件描述符
标准输入:0
标准输出:1
标准错误:2
Shell
提供了使用文件描述符重定向的方法。由于标准错误与文件描述符编号2
相匹配,所以我们可以使用以下符号重定向标准错误:
[root@iZerb5rob3dcf6Z ~]# ls -l /bin/usr 2> stderr.txt
[root@iZerb5rob3dcf6Z ~]# cat stderr.txt
ls: 无法访问/bin/usr: 没有那个文件或目录
[