在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文件。
Bourne和Korn shell中的重定向
从文件输入 将标准输出重定向为文件 >file or 1>file
将标准错误重定向为文件 2>file
将标准输出追加到文件 >>file
将标准错误重定向为标准输入 2>&1
将第一个命令的输出作为第二个文件的输入 cmd1|cmd2
将第一个文件即作为标准输入也作为标准输出 <>file
关闭标准输入 0<&-
关闭标准输出 1>&-
关闭标准错误 2>&-
* 2>&1 就是将 stderr 并进 stdout 作输出
* 1>&2 或 >&2 就是将 stdout 并进 stderr 作输出
阅读(1488) | 评论(0) | 转发(0) |