shell之重定向

使用>和>>都表示向结果重定向到一个文件中,区别在于>是覆盖式的重定向,会先将内容先清空,然后再将结果输入,而>>是追加式的重定向,是将要输入的内容追加在在已存在的内容后面,并不会清空文件。

实例:

[root@localhost ~]# echo 123456 > a.txt
[root@localhost ~]# cat a.txt
123456
[root@localhost ~]# echo 78910 >> a.txt
[root@localhost ~]# cat a.txt
123456
78910
[root@localhost ~]# echo 2468 > a.txt
[root@localhost ~]# cat a.txt
2468

  重定向符号>之前的数字(0表示标准输入,1表示标准输出,2表示错误输出),如果>之前没有添加数字,则默认为1,表示将 要正常显示的内容重定向到指定文件,如果出现错误,错误信息将显示在屏幕,而不会重定向到文件中,则不会将错误也写入文件中;如果 > 之前写的是2,表示如果出现错误,则将错误信息重定向到文件,而正常的命令的结果内容仍旧正常显示。

比如下面的例子:

ubuntu@ubuntu:~$ echo hello 1> a.txt
ubuntu@ubuntu:~$ cat a.txt
hello
ubuntu@ubuntu:~$ #等价与下面这个语句
ubuntu@ubuntu:~$ echo hello > a.txt
ubuntu@ubuntu:~$ cat a.txt
hello
ubuntu@ubuntu:~$ #当发生错误时,2> 会将错误的信息输出到文件中
ubuntu@ubuntu:~$ #而正常部分的内容仍会正常显示
ubuntu@ubuntu:~$ show 2> a.txt;echo world;
world
ubuntu@ubuntu:~$ #上一条命令中的show出现错误了,但是并没有出现错误信息,因为错误信息重定向到了a.txt中
ubuntu@ubuntu:~$ #第二条命令正常运行,所以结果正常显示。
The program 'show' can be found in the following packages:
 * mailutils-mh
 * nmh

  

  单独使用>或者2>,只能将错误或者正确的运行结果重定向到指定文件中,而如果要让正常运行的结果和出现异常时的提示信息都重定向到文件中的话,可以使用&>,注意没有&>>这种语法,即不能追加,但是可以通过其他方法实现。如下例:

#!/bin/bash
#test.sh

ls
catt /

  执行脚本test.sh

ubuntu@ubuntu:~$ bash test.sh
a.txt	 Documents  examples.desktop  Pictures	Templates  Videos
Desktop  Downloads  Music	      Public	test.sh
test.sh: line 5: catt: command not found
ubuntu@ubuntu:~$ cat a.txt
a.txt    Documents  examples.desktop  Pictures  Templates  Videos
Desktop  Downloads  Music             Public    test.sh
ubuntu@ubuntu:~$ bash test.sh &>a.txt
ubuntu@ubuntu:~$ cat a.txt
a.txt    Documents  examples.desktop  Pictures  Templates  Videos
Desktop  Downloads  Music  Public    test.sh
test.sh: line 5: catt: command not found

  尝试将输出(包含正确命令的输出和错误命令的提示信息)以追加方式重定向到一个文件中,重点在2>&1 表示将错误输出(2)也重定向到标准输出(1)中的管道中。

ubuntu@ubuntu:~$ bash test.sh 1>a.txt 2>&1 a.txt  #覆盖
ubuntu@ubuntu:~$ cat a.txt
a.txt    Desktop Documents    Downloads    examples.desktop
Music    Pictures    Public    Templates    test.sh    Videos
test.sh: line 5: catt: command not found
ubuntu@ubuntu:~$ bash test.sh 1>a.txt 2>&1 a.txt  #覆盖
ubuntu@ubuntu:~$ cat a.txt
a.txt    Desktop Documents    Downloads    examples.desktop
Music    Pictures    Public    Templates    test.sh    Videos
test.sh: line 5: catt: command not found
ubuntu@ubuntu:~$ bash test.sh 1>>a.txt 2>&1 a.txt    #追加方式
ubuntu@ubuntu:~$ cat a.txt
a.txt    Desktop Documents    Downloads    examples.desktop
Music    Pictures    Public    Templates    test.sh    Videos
test.sh: line 5: catt: command not found
a.txt    Desktop Documents    Downloads    examples.desktop
Music    Pictures    Public    Templates    test.sh    Videos
test.sh: line 5: catt: command not found
ubuntu@ubuntu:~$ 

  

原文地址:https://www.cnblogs.com/-beyond/p/8215533.html