概述
重定向就是将我们原本要输出到屏幕的数据信息,重新定向到某个指定的文件中。比如我们每天定时备份数据的时候,希望将备份数据的结果保存到某个文件中。这样我们第二天就可以查看这个文件得知备份成功还是失败
重定向的使用场景
- 当屏幕输出很重要的信息时,而且希望保存重要的信息时。
- 后台执行中的程序频繁干扰屏幕正常的输出结果时。
- 系统的例行命令,例如定时任务的执行结果希望保存下来时。
- 一些执行命令,我们已经知道可能会出现错误信息,不想再看到报错时。
- 错误日志与正确日志需要分别输出至不同的文件保存时。
标准输入与输出
学习重定向我们首先要了解Linux系统标准的输入与输出。
当我们运行一个程序时通常会自动打开三个标准文件,分别是标准输入,标准输出,错误输出。
名称 | 文件描述 | 作用 |
---|---|---|
标准输入(STDIN) | 0 | 默认是键盘,也可以是文件或其他命令的输出。 |
标准输出(STDOUT) | 1 | 默认输出到屏幕 |
错误输出(STDERR) | 2 | 默认输出到屏幕 |
文件名称(filename) | 3+ |
进程是使用文件描述符(file descriptors)来管理打开的文件
输出设备(链接指向):
[root@localhost ~]# ll /dev/std*
lrwxrwxrwx. 1 root root 15 Mar 18 08:28 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 Mar 18 08:28 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 Mar 18 08:28 /dev/stdout -> /proc/self/fd/1
输出重定向
输出重定向就是改变输出内容的位置。
输出重定向的方式:
类型 | 操作符 | 用途 |
---|---|---|
标准覆盖输出重定向 | > | 将程序输出的正确结果输出到指定的文件中,会覆盖文件原有的内容 |
标准追加输出重定向 | >> | 将程序输出的正确结果以追加的方式输出到指定文件,不会覆盖原有文件 |
错误覆盖输出重定向 | 2> | 将程序的错误结果输出到执行的文件中,会覆盖文件原有的内容 |
错误追加输出重定向 | 2>> | 将程序输出的错误结果以追加的方式输出到指定文件,不会覆盖原有文件 |
标准输入重定向 | << | 将命令中接收输入的途径由默认的键盘更改为指定的文件或命令 |
案例演示
-
标准输出重定向
标准覆盖输出重定向,先清空文件内容,再写入,如果文件不存在则新建
[root@localhost ~]# ifconfig ens32 > file.txt
标准追加输出重定向,向配置文件末尾追加内容
[root@localhost ~]# echo "my name is Q" >> file.txt
-
错误输出重定向
正确的输出以及错误的输出重定向至不同文件
[oldQ@localhost ~]$ find /etc -name "*.conf*" 1>a 2>b
-
正确和错误输出结果重定向到相同位置
将标准输出和标准错误输出重定向到同一文件,混合输出
[oldQ@localhost ~]$ find /etc -name "*.conf*" &>ab
合并两个文件内容至一个文件
[oldQ@localhost ~]$ cat a b > c
-
重定向到空设备/dev/null
将产生的任何数据都放入黑洞设备,放入后则视为丢弃。
[root@localhost ~]# ls /root /error >ab 2>/dev/null
[root@localhost ~]# ls /root /error >ab &>/dev/null
-
脚本中使用重定向
[root@localhost ~]# vim ping.sh ping -c1 10.0.0.1 &>/dev/null if [ $? -eq 0 ];then echo "10.0.0.1 is up." >>up.txt else echo "10.0.0.1 is down." >>down.txt fi [root@localhost ~]# chmod +x ping.sh [root@localhost ~]# ./ping.sh
$? 是用来判断上一条命令的执行结果,0表示ok,只要不是0都是错的。
-
两条命令同时重定向
无论ls命令执行是否成功,都会执行date命令
[root@localhost ~]# ls ; date
ls和date分为两个整体,左右重定向位置互不影响。
[root@localhost ~]# ls ; date &>/dev/null
使两个命令同时定向到一个位置
[root@localhost ~]# (ls ; date) &>/dev/null