关于>&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。

记得unixpianpianMM有个问题:
echo "Usage $0 -d" >;&2
那么可以解释为echo "Usage $0 -d" 1>;&2
也就是把结果输出到和标准错误一样;之前如果有定义标准错误重定向到某log文件,那么标准输出也重定向到这个log文件。

以上脚本在HP-UX11.00 L2000通过!所有定义、名词均建立在本人的实践和本人所了解的知识上,如有错误,请指正,谢谢!!!

 » 相关连接:
Shell环境和变量生存期 SHELL正则表达式语法 SHELL编程基础 入门shell实例讲解
控制圈for 流程控制case 流程控制select 返回状态Exit
流程控制if 控制圈while/until 参数与变数 函数function
[回复]
Bourne和Korn shell中的重定向
从文件输入                                                              <file or 0<file
将标准输出重定向为文件                                      >file or 1>file
将标准错误重定向为文件                                      2>file
将标准输出追加到文件                                          >>file
将标准错误重定向为标准输出                              2>&1 (如 2>&1 >/dev/null  , 将标准错误重定向为标准输出, 而标准输出定向到了/dev/null 所以标准错误的内容也到了/dev/null)
把标准输出重定向到标准错误         1>&2
将第一个命令的输入作为第二个文件的输入      cmd1|cmd2
将第一个文件即作为标准输入也作为标准输出  <>file
关闭标准输入                                                          0<&-
关闭标准输出                                                          1>&-
关闭标准错误                                                          2>&-

 » 相关连接:
Shell环境和变量生存期 SHELL正则表达式语法 SHELL编程基础 入门shell实例讲解
控制圈for 流程控制case 流程控制select 返回状态Exit
流程控制if 控制圈while/until 参数与变数 函数function
[回复]
2>&1 >/dev/null  等同于  1>&2  2>/dev/null

 » 相关连接:
Shell环境和变量生存期 SHELL正则表达式语法 SHELL编程基础 入门shell实例讲解
控制圈for 流程控制case 流程控制select 返回状态Exit
流程控制if 控制圈while/until 参数与变数 函数function
[回复]
如果谈到 I/O 重定向,就涉及到文件标识符 (File Descriptor) 的概念

在 Linux 系统中,系统为每一个打开的文件指定一个文件标识符以便系统对文件进行跟踪,这里有些和C语言编程里的文件句柄相似,文件标识符是一个数字,不同数字代表不同的含义.

默认情况下,系统占用了  3 个,分别是0标准输入(stdin),1 标准输出 (stdout), 2 标准错误 (stderr)

另外 3-9 是保留的标识符,可以把这些标识符指定成标准输入,输出或者错误作为临时连接。通常这样可以解决很多复杂的重定向请求。

 » 相关连接:
Shell环境和变量生存期 SHELL正则表达式语法 SHELL编程基础 入门shell实例讲解
控制圈for 流程控制case 流程控制select 返回状态Exit
流程控制if 控制圈while/until 参数与变数 函数function
[回复]
脚本是:
      nohup /mnt/Nand3/H2000G  >/dev/null  2>&1  &
      对于& 1 更准确的说应该是文件描述符 1,而1 一般代表的就是STDOUT_FILENO,实际上这个操作就是一个dup2(2)调用.他标准输出到all_result ,然后复制标准输出到文件描述符2(STDERR_FILENO),其后果就是文件描述符1和2指向同一个文件表项,也可以说错误的输出被合并了.其中0 表示键盘输入 1表示屏幕输出 2表示错误输出.把标准出错重定向到标准输出,然后扔到/DEV/NULL下面去。通俗的说,就是把所有标准输出和标准出错都扔到垃圾桶里面。
      command >out.file  2>&1 &
      command >out.file是将command的输出重定向到out.file文件,即输出内容不打印到屏幕上,而是输出到out.file文件中。 2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中。最后一个& , 是让该命令在后台执行。
     
      试想2>1代表什么,2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;
换成2>&1,&与1结合就代表标准输出了,就变成错误重定向到标准输出.

      你可以用
            ls 2>1测试一下,不会报没有2文件的错误,但会输出一个空的文件1;
            ls xxx 2>1测试,没有xxx这个文件的错误输出到了1中;
            ls xxx 2>&1测试,不会生成1这个文件了,不过错误跑到标准输出了;
            ls xxx >out.txt 2>&1, 实际上可换成 ls xxx 1>out.txt 2>&1;重定向符号>默认是1,错误和输出都传到out.txt了。
      为何2>&1要写在后面?
      command > file 2>&1
      首先是command > file将标准输出重定向到file中, 2>&1 是标准错误拷贝了标准输出的行为,也就是同样被重定向到file中,最终结果就是标准输出和错误都被重定向到file中。
      command 2>&1 >file
      2>&1 标准错误拷贝了标准输出的行为,但此时标准输出还是在终端。>file 后输出才被重定向到file,但标准错误仍然保持在终端。

用strace可以看到:
1. command > file 2>&1
这个命令中实现重定向的关键系统调用序列是:
open(file) == 3
dup2(3,1)
dup2(1,2)

2. command 2>&1 >file
这个命令中实现重定向的关键系统调用序列是:
dup2(1,2)
open(file) == 3
dup2(3,1)

      可以考虑一下不同的dup2()调用序列会产生怎样的文件共享结构。请参考APUE 3.10, 3.12

 » 相关连接:
Shell环境和变量生存期 SHELL正则表达式语法 SHELL编程基础 入门shell实例讲解
控制圈for 流程控制case 流程控制select 返回状态Exit
流程控制if 控制圈while/until 参数与变数 函数function
 » 本栏目最新帖:

Powered by PHPWind v6.0 Code © 2003-08