Chinaunix首页 | 论坛 | 博客
  • 博客访问: 84619
  • 博文数量: 18
  • 博客积分: 1521
  • 博客等级: 上尉
  • 技术积分: 150
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-22 18:07
文章分类

全部博文(18)

文章存档

2014年(4)

2011年(1)

2010年(4)

2008年(9)

我的朋友

分类:

2008-10-08 11:27:41

关于>&2、2>&1等重定向的详细解释
作者:成雨   
在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。 
阅读(1026) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~