路漫漫其修远兮
吾将上下而求索

shell编程:io输出重定向

IO重定向

      a. 输入输出的数据流分为三种:1标准输入,2标准输出,3标准错误输出

            1、 输入的数据流: <– 标准输入(stdin),键盘

                    代码为0,使用<或<<

            2、输出的数据流:–> 标准输出(stdout).显示器

                    代码为1,使用>或>>

            3、 错误的输出流: –>标准错误输出(stderr),显示器

                    代码为2,使用2>或2>>

      b. fd: file descriptor,文件描述符

          i. 标准输入:0

          ii. 标准输出:1

          iii. 错误输出:2

      c. IO重定向

          i. 输出重定向:>  命令的输出结果由显示器转到某个文件中,也就是说所有结果都保存在重定向的文件中了

              1. 特性:覆盖输出,将原来文件中的内容覆盖掉,

          ii. 输出重定向:>>

              1. 特性:追加输出,在原来的基础上增加

[root@localhost ~]#echo "hello" > test
[root@localhost ~]#cat test
hello
[root@localhost ~]#echo "how are you" > test    #原来的内容会丢失
[root@localhost ~]#cat test
how are you
[root@localhost ~]#echo "how old are you" >> test    #追加到后面
[root@localhost ~]#cat test
how are you
how old are you

          vi. 错误输出流重定向:2>,2>> 特性和上面相同,不通用,命令的输出的错误结果信息由显示器转到某个文件中,也就是说所有结果都保存在重定向的文件中了

      

示例说明:如果命令执行成功,执行命令echo $?的结果为0,表示成功,如果结果非0,表示失败,如果andy用户已经存在了,再创建相同的用户名会报错,结果为非0,“>”重定向只能将正常的输出流重定向,这里重定向到/dev/null,但是执行的错的信息就不能成功重定向到/dev/null里面,要使用“2>”才可以将错误信息重定向。

[root@localhost ~]#id andy
uid=496(andy) gid=491(andy) groups=491(andy)
[root@localhost ~]#useradd andy
useradd: user 'andy' already exists
[root@localhost ~]#useradd andy > /dev/null    #错误信息不能重定向
useradd: user 'andy' already exists
[root@localhost ~]#echo $?
9
[root@localhost ~]#useradd andy 2> /dev/null   #错误信息可以正常重定向
[root@localhost ~]#echo $?
9
[root@localhost ~]#useradd bob > /dev/null    #执行命令成功的状态值为0
[root@localhost ~]#echo $?
0

    vii. 合并正常输出流和错误输出流:

              1. &>, &>>,覆盖和追加,不管对错都可以执行,比下面的简洁,推荐

              2. 合并追加

                  a. COMMAND > /path/to/somefile 2>&1

                  b. COMMAND >> /path/to/somefile 2>&1

示例:不管输出信息正确错误与否,都可以重定向,只关心执行状态结果

[root@localhost ~]#useradd andy &> /dev/null
[root@localhost ~]#echo $?
9
[root@localhost ~]#useradd alex &> /dev/null
[root@localhost ~]#echo $?
0

另外一个示例,test文件存在,test2文件不存在,不管cat的结果是否正确,都重定向到log文件中,作为日志记录,只关心执行命令的状态值

[root@localhost ~]#cat test
hello
[root@localhost ~]#cat test > log 2>&1
[root@localhost ~]#echo $?
0
[root@localhost ~]#cat log
hello
[root@localhost ~]#cat test2 > log 2>&1
[root@localhost ~]#echo $?
1
[root@localhost ~]#cat log
cat: test2: No such file or directory

------下面的一样,重定向
[root@localhost ~]#cat test &> log
[root@localhost ~]#cat log
hello
[root@localhost ~]#cat test2 &> log
[root@localhost ~]#cat log
cat: test2: No such file or directory
-------追加
[root@localhost ~]#cat test &>> log
[root@localhost ~]#cat test2 &>> log
[root@localhost ~]#cat log
hello
cat: test2: No such file or directory

未经允许不得转载:江哥架构师笔记 » shell编程:io输出重定向

分享到:更多 ()

评论 抢沙发

评论前必须登录!