在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有个问题:
来源:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=16361&page=1 http://blog.chinaunix.net/uid-22566367-id-381983.html http://bbs.chinaunix.net/thread-433972-1-1.html |
重定向详解
最新推荐文章于 2024-07-19 12:04:51 发布