前言
上节我们学习了linux的一些使用技巧,这节我们一起来学习下linux的输出重定向。作为一个后端开发,经常需要在开发环境部署一些项目,有时候会拿一些别人写好的脚本使用或者是稍微改一改用在自己的项目。那么,你是否对>、>>、1>、2>、&>这些命令感到陌生,它们到底是什么作用,今天就带你一问彻底弄懂它们!
输出重定向
> 符号
>的作用是将命令的执行结果输出(覆盖)到指定文件中。
例如我需要统计一下服务器根目录下文件、文件夹的信息,当然你可以使用ls命令的结果复制出来,如果需要更详细的信息,则可以使用ls -l命令(等同于ll)然后把结果复制出来。然而,更好的办法是我们可以把结果输出丛定祥到一个文件中
ls -l > result.txt
这时查看result.txt文件发现刚才ll命令的结果已经被保存到result.txt中。
>> 符号
>>的作用是将命令的执行结果输出(追加)到指定文件中。
咋一看,>和>>两个命令的解释没多大差别,那么做个实验你就能清除的区别它们了。分别执行下面命令:
ls -l > result1.txt
ls -l > result1.txt
ls -l > result1.txt
ls -l >> result2.txt
ls -l >> result2.txt
ls -l >> result2.txt
执行完上面 6 条命令,然后分别查看(查看文件内容可以使用cat 文件名命令,后面的内容会讲到)result1、result2文件的内容会发现,result1里面只有一份结果,而result2里面有3份结果,因为ls -l >> result2.txt执行了 3 次。二者的区别相信聪明的你已经体会到了。
注意:>会将命令执行的结果覆盖式写入文件,多次执行文件内容只有一份。>>会将命令执行的结果追加式写入文件,执行几次文件内容就回有几份。
1>、2>、&> 符号
有了对>、>>认识的基础,1>、2>、&>相对来说就简单多了。
1>即>,系统默认的正确重定向,会把命令执行的正确结果重定向到指定文件。
2>即错误重定向,会把命令执行的正确结果重定向到指定文件。
111 1> result1.txt
111 2> result2.txt
执行上面两条命令后分别查看result1.txt、result2.txt两个文件会发现,result1.txt文件中没有内容,但是result2.txt中会有-bash: 111: 未找到命令的字样。这样你对上面的解释就清除了吧,2>只会把前面命令执行出错时的返回结果重定向到指定文件。而1> 或者是 >则恰恰相反,只会把前面命令执行正确时的返回结果重定向到指定文件。
那么有没有把二者结合起来的功能呢?这就到&>出场了。
为了做实验,下面我书写一段简单的shell脚本:
#!/bin/bash
# test shell
1111
ls l
脚本只有两句,第一句是无意义的字符,会报错,第二句可以正常输出。那么现在我们执行下这个脚本。当然ll查看信息如下:
-rw-r--r-- 1 root root 46 4月 6 11:03 test.sh 同时文件名是白色的(白色的说明我们没有执行权限,linux中对有执行权限的文件默认是绿色的)
这时我们可以使用chmod a+x test.sh来添加对文件的执行权限,或者是使用bash test.sh命令来直接解析这个脚本(关于权限相关的内容,以后会详细讲解)。
这时,我们使用刚学的&>来接收上一个脚本执行的结果
./test.sh &> result.txt
查看result.txt
cat result.txt
./test.sh:行4: 1111: 未找到命令 总用量 8 -rw-r--r-- 1 root root 38 4月 6 11:17 result.txt -rwxr-xr-x 1 root root 37 4月 6 11:15 test.sh
我们发现里面既有错误的提示,也有命令正确执行后的结果。
相应的,
1>> 表示将命令的执行(正确执行)结果追加到指定文件中。
2>> 表示将命令的执行出错结果追加到指定文件中。
注意 没有 &>>这个符号! 不信你可以试试。
动动小手实验一波吧
今天的内容就分享到这里了,我们下节见!
系列传送门如下:
Shell脚本基础从头开始(一)── 几个linux实操技巧
Shell脚本基础从头开始(九)── shell的循环语句控制