linux输出⽇志1与2,你知道Linuxshell中“21”吗?它有什么作
⽤?
今天⼩编要跟⼤家分享的⽂章是关于Linux shell中“2>&1。经常使⽤Linux系统的你是否知道shell中“2>&1”的具体⽤途,相信⼤家应该都见过类似的脚本调⽤,
./test.sh > 2>&1
你是否知道这⾥的2>&1是什么意思?下⾯就来和⼩编⼀起看⼀看⽂章内容吧,在⽂章中你会得到答案。
不卖关⼦,我们先说结论:上⾯的调⽤表明将./test.sh的输出重定向到⽂件中,同时将标准错误也重定向到⽂件中。
我下⾯我们来举例说明⼀下,假如有脚本test.sh:
#!/bin/bashdate #打印当前时间while true #死循环do #每隔2秒打印⼀次 sleep 2 whatthis #不存在的命令
echo -e "std output"done
脚本中先打印当前⽇期,然后每隔2秒执⾏whatthis并打印⼀段字符。由于系统中不存在whatthis命令,因此执⾏会报错。
假如我们想保存该脚本的打印结果,只需将test.sh的结果重定向到中即可:
./test.sh >
执⾏结果如下:
ubuntu$ ./test.sh &/test.sh: ⾏ 7: whatthis: 未到命令linux重定向
我们明明将打印内容重定向到中了,但是这条错误信息却没有重定向到中。如果你是使⽤程序调⽤该脚本,当查看脚本⽇志的时候,将会完全看不到这条错误信息。⽽使⽤下⾯的⽅式则会将出错信息也重定向到中:
./test.sh > 2>&1
以这样的⽅式调⽤脚本,可以很好的将错误信息保存,帮助我们定位问题。
怎么理解“2>&1”
每个程序在运⾏后,都会⾄少打开三个⽂件描述符,分别是0:标准输⼊;1:标准输出;2:标准错误。
例如,对于前⾯的test.sh脚本,我们通过下⾯的步骤看到它⾄少打开了三个⽂件描述符:
./test.sh #运⾏脚本ps -ef|grep test.sh #重新打开命令串⼝,使⽤ps命令到test.sh的pidhyb 5270
4514 0 19:20 pts/7 00:00:00 /bin/bash ./test.shhyb 5315 5282 0 19:20 pts/11
00:00:00 grep --color=auto test.sh
可以看到test.sh的pid为5270,进⼊到相关fd⽬录:
cd /proc/5270/fd #进程5270所有打开的⽂件描述符信息都在此ls -l #列出⽬录下的内容 0 -> /dev/pts/7 1
-> /dev/pts/7 2 -> /dev/pts/7 255 ->
/home/hyb/workspaces/shell/test.sh
可以看到,test.sh打开了0,1,2三个⽂件描述符。同样的,如果有兴趣,也可以查看其他运⾏进程的⽂件描述符打开情况,除⾮关闭了否则都会有这三个⽂件描述符。
那么现在就容易理解前⾯的疑问了,2>&1表明将⽂件描述2(标准错误输出)的内容重定向到⽂件描述符1(标准输出),为什么1前⾯需要&?当没有&时,1会被认为是⼀个普通的⽂件,有&表⽰重定向的⽬标不是⼀个⽂件,⽽是⼀个⽂件描述符。在前⾯我们知道,test.sh
&⼜将⽂件描述符1的内容重定向到了⽂件,那么最终标准错误也会重定向到。我们同样通过前⾯的⽅法,可以看到test.sh进程的⽂件描述符情况如下:
0 -> /dev/pts/7 1 -> /home/hyb/workspaces/ 2 ->
/home/hyb/workspaces/ 255 ->
/home/hyb/workspaces/shell/test.sh
我们可以很明显地看到,⽂件描述符1和2都指向了⽂件,也就得到了我们最终想要的效果:将标准错误输出重定向到⽂件中。
它们还有两种等价写法:
./test.sh >& /test.sh &>
通过上⾯的介绍总结⼀下“2>&1”的作⽤主要有:
1、程序运⾏后会打开三个⽂件描述符,分别是标准输⼊,标准输出和标准错误输出。
2、在调⽤脚本时,可使⽤2>&1来将标准错误输出重定向。
3、只需要查看脚本的错误时,可将标准输出重定向到⽂件,⽽标准错误会打印在控制台,便于查看。
4、>&会将重定向内容追加到⽂件末尾。
5、通过查看/proc/进程id/fd下的内容,可了解进程打开的⽂件描述符信息。
以上就是⼩编今天为⼤家分享的你知道 Linux
shell中“2>&1”吗?它有什么作⽤?的⽂章,希望本篇⽂章能够对喜欢Linux的你有所帮助,想要了解更多Linux相关知识记得关注达内Linux培训官⽹,⼩编将会在这⾥为你分享更多Linux相关信息。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。