数据流重定向
standard output与standard error output
标准输出是指命令执行所回传的正确的信息,而标准错误输出可以理解为命令执行失败后,所回传的错误信息。
- 标准输入(stdin):代码为0,使用<或<<;
- 标准输出(stdout):代码为1,使用>或>>;
- 标准错误输出(stderr):代码为2,使用2>或2>>。
>与>>符号
[root@shadow ~]# ll ~/rootfile
ls: cannot access /root/rootfile: No such file or directory
[root@shadow ~]# ll / > ~/rootfile
[root@shadow ~]# ll ~/rootfile
-rw-r--r-- 1 root root 1083 Oct 15 16:13 /root/rootfile
本例中使用“>”将ll命令的输出重定向到“~/rootfile”这个文件中。同时,如果这个文件本身不存在,系统则会自动创建这个文件;如果这个文件存在,系统则会先将这个文件内容清空,然后将数据写入。
而如果想要将数据累加而不想要将旧的数据删除,那我们可以使用“>>”这个符号。这种情况下,如果文件不存在,系统会主动创建这个文件;如果文件已存在,系统则会在文件的最下面将相应的内容累加进去。
以上重定向数据的方法是指正确的数据(因为仅有>存在时,默认代码为1),完整的数据输出方式如下:
- 1>:以覆盖的方法将正确的数据输出到指定的文件或设备上;
- 1>>:以累加的方法将正确的数据输出到指定的文件或设备上;
- 2>:以覆盖的方法将错误的数据输出到指定的文件或设备上;
- 2>>:以累加的方法将错误的数据输出到指定的文件或设备上。
如下有一个将正确与错误的数据分别存入不同文件的例子:
[shadow@shadow ~]$ find /home -name .bashrc
find: ‘/home/arod’: Permission denied
find: ‘/home/alex’: Permission denied
find: ‘/home/agetest’: Permission denied
/home/shadow/.bashrc
[shadow@shadow ~]$ find /home -name .bashrc > list_right 2> list_wrong
[shadow@shadow ~]$ cat list_right
/home/shadow/.bashrc
[shadow@shadow ~]$ cat list_wrong
find: ‘/home/arod’: Permission denied
find: ‘/home/alex’: Permission denied
find: ‘/home/agetest’: Permission denied
/dev/null垃圾桶黑洞设备与特殊写法
这个/dev/null可以吃掉任何导向这个设备的信息,例如,我们忽略上面的错误信息:
[shadow@shadow ~]$ find /home -name .bashrc 2> /dev/null
/home/shadow/.bashrc
这样的情况下屏幕上就只会显示正确的操作信息,错误的信息则被丢弃了。
如果需要将正确与错误数据写入同一个文件,这个时候需要使用特殊写法:
[shadow@shadow ~]$ find /home -name .bashrc > list 2> list
# <==错误,两条数据同时写入同一个文件且没有使用特殊的写法,此时两条数据可能会交叉写入该文件内,造成次序错乱。
[shadow@shadow ~]$ cat list # <== 错误的次序
/home/shadow/.bashrc
: Permission denied
find: ‘/home/alex’: Permission denied
find: ‘/home/agetest’: Permission denied
[shadow@shadow ~]$ find /home -name .bashrc
find: ‘/home/arod’: Permission denied
find: ‘/home/alex’: Permission denied
find: ‘/home/agetest’: Permission denied
/home/shadow/.bashrc
[shadow@shadow ~]$ find /home -name .bashrc > list 2>&1 # <== 正确
[shadow@shadow ~]$ find /home -name .bashrc &> list # <== 正确
以上“2>&1”与“&>”都是正确的方法。
<与<<符号
这两个符号是用来重定向标准输入的,即将原本需要由键盘输入的数据改由文件内容替代。例如:
# 键盘输入
[root@shadow ~]# cat > catfile
hello
[root@shadow ~]# cat catfile
hello
# 重定向输入
[root@shadow ~]# cat > catfile < .bashrc
[root@shadow ~]# ll catfile .bashrc
-rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc
-rw-r--r-- 1 root root 176 Oct 15 16:59 catfile # <==两个文件内容一样
<<这个符号代表结束输入的意思,例如,如果我们使用cat直接将输入的信息输出到catfile文件中,且当键盘输入eof时结束,我们可以这么写:
[root@shadow ~]# cat > catfile << "eof"
> Hello
> World
> eof
[root@shadow ~]# cat catfile
Hello
World
可见,使用<<右侧的控制字符,可以终止一次输入,而不必使用[ctrl]+d来结束。