请问1>&2 2>&1 <&m [n]>&m [n]<&- [n]>&-的作用和区别

sh/bash/dash/ksh/zsh等Shell脚本
回复
zipkong
帖子: 76
注册时间: 2010-11-27 22:20

请问1>&2 2>&1 <&m [n]>&m [n]<&- [n]>&-的作用和区别

#1

帖子 zipkong » 2011-03-31 18:40

书是这么说的
1>&2 将命令的标注输出重定向到标准错误输出
2>&1 声明文件描述符2为文件描述符1的副本
<&m 从文件描述符m复制标准输入
[n]>&m 从文件描述符复制标准输入或者文件描述符n(如果命令中指定了n)
[n]<&- 关闭标准输入或者文件描述符n(如果指定了n)
[n]>&- 关闭标准输出或者文件描述符n(如果指定了n)

书中描述我看不明白……他也没有举具体的例子,请问哪个大侠可以帮忙通过例子来解释一下?
zipkong
帖子: 76
注册时间: 2010-11-27 22:20

Re: 请问1>&2 2>&1 <&m [n]>&m [n]<&- [n]>&-的作用和区别

#2

帖子 zipkong » 2011-04-07 17:24

是不是太难了?还是这表示法根本不存在?
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 请问1>&2 2>&1 <&m [n]>&m [n]<&- [n]>&-的作用和区别

#3

帖子 fnan » 2011-04-07 21:40

自己去看,动手试试,真不明白再问。
http://www.cnblogs.com/chengmo/tag/shell/
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
arthurchen
帖子: 8
注册时间: 2011-04-07 21:47

Re: 请问1>&2 2>&1 <&m [n]>&m [n]<&- [n]>&-的作用和区别

#4

帖子 arthurchen » 2011-04-19 23:18

其实很简单,首先默认情况下0,1,2是stdin, stdout, stderr的fd, 然后< > 分别是重定向输入及输出
使用时要确认当前的fd是指向哪里的,因为有可能0,1,2之前被重定向过了

eg: echo Hello >/dev/null 这里stdout指向了/dev/null所以没有输出
echo Hello 1>&2 这里stdout指向了stderr, 也没有输出,但在log文件里可以看到
printf "%v\n error"> testfile 2>&1 这里stdout指向了testfile, 之后stderr重定向到stdout的当前位置,也就是testfile
这里也可以直接用&>>testfile 将stdout及stderr都指向同一个文件testfile

可以自己指定文件描述符,比如
Swap Standard Output and Standard Error,通过指定fd 3实现
$ command 3>&2 2>&1 1>&3

至于关闭重定向那个就是字面意思了,比较简单
回复