不再手动地向某个文件里输入或者输出内容,而是通过文件、命令结果、操作符等进行输入或者输出,这种行为则是重定向。
昨天学习了有关于输入输出的相关内容,其中特别注意重定向的相关用法,即输入重定向,输出重定向,改变了默认的位置。
在学习期间,还学习到了管道的用法。
今天来回顾一下这两个方面的内容,重定向和管道大部分都是可以一起使用的。
首先单独学习重定向和管道的相关知识。
重定向
一般来说,输入默认是键盘鼠标,输出默认到输出到终端界面上。重定向,顾名思义便是重新进行输入输出并定向地输入、输出到指定的
文件。
举个简单地例子,当我们使用计算机计算时,希望能够将结果存放在我们指定的某个文件时,这便是重定向。
重定向则分为:
标准输入(STDIN)-0 默认接受来自键盘的输入
标准输出(STDOUT)-1 默认输出到终端窗口
标准错误(STDERR)-2 默认输出到终端窗口
输入重定向:
使用 < 来重定向标准输入,需要注意的是,只有 < 能进行输入重定向,需分清 < 和 > 出现在同一命令行的时候。
当cat > hello ,需要从键盘端进行输入。
举个简单的例子来说,当我们希望将/etc/passwd文件里的定向输入到命名为a的文件时,除了cp命令外还可以使用 < ,但是会对 > 有点混淆。
1 [root@mmmm ~]# cat > a < /etc/passwd #先读 < ,即先将/etc/passwd 输入到 cat 命令里,然后由cat 命令输出到文件 a
2 [root@mmmm ~]# cat a
3 root:x:0:0:root:/root:/bin/bash
4 bin:x:1:1:bin:/bin:/sbin/nologin
5 daemon:x:2:2:daemon:/sbin:/sbin/nologin
6 adm:x:3:4:adm:/var/adm:/sbin/nologin
7 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
8 sync:x:5:0:sync:/sbin:/bin/sync
9 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
输出重定向:
输出重定向分为标准输出(STDOUT)、标准错误(STDERR)。
STDOUT和STDERR可以被重定向到文件、命令、操作符号、文件名 。
支持的操作符号包括:
> 把STDOUT重定向到文件
2> 把STDERR重定向到文件
&> 把所有输出重定向到文件
标准输出:
但是我们需要注意的是,有时候运行的结果和我们预期的不一样。
比如:> 文件内容会被覆盖
1 [root@mmmm ~]# cat test.txt
2 111222333
3 [root@mmmm ~]# cat > test.txt
4 abcdabcd
5 [root@mmmm ~]# cat test.txt
6 abcdabc
这时候可以使用 set –C 禁止将内容覆盖已有文件,但可追加 ,
但是有的时候需要临时覆盖,则可以使用 >| file 进行强制覆盖,而 set +C 允许覆盖 。
另一种方法防止覆盖则是在原命令上 使用 >> 原有内容基础上,追加内容。
标准错误
2> 覆盖重定向错误输出数据流
2>> 追加重定向错误输出数据流
例如:使用find 命令 查找在 /etc 目录下,以.conf 结尾的文件,但是,运行发现有些文件的权限有限制,这时我们将错误结果输入到
已有的find.err 文件里,但是,同标准输出一样,> 内容会被覆盖掉,使用>> 则是追加。
1 [mmmm@localhost ~]$ vi find.err
2 [mmmm@localhost ~]$ cat find.err
3 it's wrong
4 [mmmm@localhost ~]$ find /etc -name "*.conf" 2> find.err
5 /etc/plymouth/plymouthd.conf
6 /etc/fprintd.conf
7 /etc/abrt/plugins/CCpp.conf
8 /etc/abrt/plugins/python.conf
查看find.err 内容如下,会发现内容被覆盖:
1 [mmmm@localhost ~]$ cat find.error
2 find: ‘/etc/grub.d’: Permission denied
3 find: ‘/etc/pki/CA/private’: Permission denied
4 find: ‘/etc/pki/rsyslog’: Permission denied
5 find: ‘/etc/selinux/targeted/active’: Permission denied
6 find: ‘/etc/selinux/final’: Permission denied
7 find: ‘/etc/dhcp’: Permission denied
8 find: ‘/etc/lvm/archive’: Permission denied
[mmmm@localhost ~]$ vi find.error
[mmmm@localhost ~]$ cat find.error
hello mmmm!
[mmmm@localhost ~]$ find /etc -name "*.conf" 2>> find.error
/etc/resolv.conf
/etc/fonts/conf.d/31-cantarell.conf
/etc/fonts/conf.d/65-0-smc-meera.conf
/etc/fonts/conf.d/10-scale-bitmap-fonts.conf
[mmmm@localhost ~]$ cat find.error
hello mmmm!
find: ‘/etc/grub.d’: Permission denied
find: ‘/etc/pki/CA/private’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
find: ‘/etc/selinux/targeted/active’: Permission denied
find: ‘/etc/selinux/final’: Permission denied
标准输出和错误输出各自定向至不同位置
1 [mmmm@localhost ~]$ find /etc -name "*.conf" > file.out 2> error.out
2 [mmmm@localhost ~]$ cat file.out
3 /etc/resolv.conf
4 /etc/fonts/conf.d/31-cantarell.conf
5 /etc/fonts/conf.d/65-0-smc-meera.conf
6 /etc/fonts/conf.d/10-scale-bitmap-fonts.conf
7 /etc/fonts/conf.d/65-1-vlgothic-gothic.conf
8 /etc/fonts/conf.d/20-unhint-small-vera.conf
9 /etc/fonts/conf.d/65-0-lohit-telugu.conf
10 [mmmm@localhost ~]$ cat error.out
11 find: ‘/etc/grub.d’: Permission denied
12 find: ‘/etc/pki/CA/private’: Permission denied
13 find: ‘/etc/pki/rsyslog’: Permission denied
14 find: ‘/etc/selinux/targeted/active’: Permission denied
15 find: ‘/etc/selinux/final’: Permission denied
16 find: ‘/etc/dhcp’: Permission denied
合并标准输出和错误输出为同一个数据流进行重定向 ,
&> 覆盖重定向
&>> 追加重定向
[mmmm@localhost ~]$ find /etc -name "*.conf" &> find.all
[mmmm@localhost ~]$ cat find.all
/etc/resolv.conf
/etc/fonts/conf.d/31-cantarell.conf
/etc/fonts/conf.d/65-1-vlgothic-gothic.conf
find: ‘/etc/pki/CA/private’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
/etc/libreport/events/report_Uploader.conf
此时需要注意的是, >> 是将正确结果输出,所以将错误结果也输出时需要进行转换,
1>&2 表示将正确结果转换为错误结果
2>&1 表示将错误结果转换为正确结果
因为在用户的角度可以直观的看出结果的对与错,可是对计算机指令而言有的时候无法识别错误,进而无法继续
重定向,所以需要转换来重定向。
():合并多个程序的STDOUT
例如如下的命令,将2018,2019年日历定向输出到all.txt 文件里,下面代码行我只粘贴了部分结果,便于展示。
[mmmm@localhost ~]$ ( cal 2018 ; cal 2019 ) > all.txt
[mmmm@localhost ~]$ cat all.txt
2018 January February March
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 1 2 3 1 2 3
7 8 9 10 11 12 13 4 5 6 7 8 9 10 4 5 6 7 8 9 10
14 15 16 17 18 19 20 11 12 13 14 15 16 17 11 12 13 14 15 16 17
21 22 23 24 25 26 27 18 19 20 21 22 23 24 18 19 20 21 22 23 24
28 29 30 31 25 26 27 28 25 26 27 28 29 30 31 2019
January February March
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 4 5 1 2 1 2
6 7 8 9 10 11 12 3 4 5 6 7 8 9 3 4 5 6 7 8 9
13 14 15 16 17 18 19 10 11 12 13 14 15 16 10 11 12 13 14 15 16
20 21 22 23 24 25 26 17 18 19 20 21 22 23 17 18 19 20 21 22 23
27 28 29 30 31 24 25 26 27 28 24 25 26 27 28 29 30
31