在POSIX shell中,命令的结果可以通过%>;的形式来定义(其中%表示文件描述符:1为标准输出stdout、2为标准错误 stderr)!
系统默认%值是1,也就是1>;,而1>;可以简写为>;,也就是默认为>;。而stdout的默认目标是终端(这点不用验证吧)。
另外,stderr的默认目标我个人认为也是终端,比如:
#abcddcba sh: abcddcba: not found.
错误信息显示在终端上(对于telnet、dtterm等,那就说虚拟终端了)。
实验环境
#mkdir redtest #cd redtest #mkdir a4 #touch a1 a2 a3
简单试验
#ls >;redout.lst
(等同于ls 1>;redout.lst,标准输出重定向)
系统先执行>;redout.lst,生成一个空文件,然后
系统执行ls,再把结果重定向到redout.lst。这时在终端看不到任何信息,但是#more redout.lst可以看到a1、a2、a3、a4和redout.lst。
#./ourgame 2>;rederr.lst
(标准错误重定向)
因为系统找不到执行,脚本ourgame,产生错误,但并不是显示在终端上,而是把错误信息重定向到了rederr.lst。
#more rederr.lst sh: ourgame: not found.
组合试验
#rm rederr.lst #rm redout.lst #vi conj #!/usr/bin/sh #Email:webmaster@myhpux.com for FN in `ls` do if [[ -f $FN ]] then echo $FN else cp $FN $FN.new fi done //conj的作用是执行以后产生标准输出(echo)和标准错误(cp) #chmod 755 conj
看看一下命令的结果:
#./conj a1 //stdout a2 //stdout a3 //stdout cp: a4: is a directory. Need -R option.//stderr conj //stdout
再试试重定向的结果:
(1)、输出重定向到文件a1,终端上只能看到标准错误:
#./conj >;a1 #./conj 1>;a1 #more a1 a1 a2 a3 conj
(2)、错误重定向到文件a1,终端上只能看到标准输出:
#./conj 2>;a1 #more a1 cp: a4: is a directory. Need -R option.
(3)、把标准输出和标准错误都重定向到a1,终端上看不到任何信息:
#./conf >;a1 2>;&1 (等同于#./conf 1>;a1 2>;&1) #more a1 a1 a2 a3 cp: a4: is a directory. Need -R option. conj
//其中&的意思,可以看成是“The same as”、“与...一样”的意思。本例中就是2>;和1>;一样,都输出到a1中。
再看一个例子:
#./conj 2>;&1 >;a1
同样可以解释为2>;和1>;一样,但是这时1>;是系统默认输出到终端,所以标准错误也输出到终端;然后,系统把标准输出重定向到文件a1。
记得unixpianpianMM有个问题:
echo Usage $0 -d >;&2
那么可以解释为echo Usage $0 -d 1>;&2
也就是把结果输出到和标准错误一样;之前如果有定义标准错误重定向到某log文件,那么标准输出也重定向到这个log文件。
原文地址:https://blog.csdn.net/dragonfly0939
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。