数据流重定向

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来结束。

posted @ 2020-10-15 18:42  southernEast  阅读(93)  评论(0编辑  收藏  举报