双括号与文件重定向的目的是什么?

时间:2014-05-23 19:01:11

标签: bash sh

我用partclone命令看到了这一点,例如

( ( partclone.restore -s ${SOUR_PART} -o ${DEST_PART} 2>&3 ) 3>&1 ) | ... 

2>&3 ) 3>&1 )的含义或目的是什么?是否与

相同
partclone.restore -s ${SOUR_PART} -o ${DEST_PART} 2>&1

...?如果没有,有什么区别?

3 个答案:

答案 0 :(得分:2)

double open paren会创建两个子shell。

最内层shell中的2>& 3将stderr发送到文件描述符3

最外层shell中的3>& 1将文件描述符3发送到stdout,然后将其传送到下一个命令。

请参阅Linux文档项目中的IO重定向:http://www.tldp.org/LDP/abs/html/io-redirection.html

对于会让您大开眼界的重定向脚本,请参阅此处的练习:http://www.tldp.org/LDP/abs/html/ioredirintro.html

答案 1 :(得分:2)

表达式

2>&3

告诉shell将目标为文件描述符2的任何输出(这是标准错误)重定向到文件描述符3

3>&1

表示将目标为文件描述符3的任何I / O重定向到文件描述符1(标准输出)。

圆括号帮助shell解析它并创建子shell。内括号有:

( partclone.restore -s ${SOUR_PART} -o ${DEST_PART} 2>&3 )

表示该子shell中I / O的特定重定向。然后用另一个带有自己重定向的子shell包装在另一组括号中:

( the_command_shown_above 3>&1 ) | ...

然后将所有标准输出通过管道输入...

表示的任何命令


此方法的一个有趣用途是,如果要使用通常只接受stderr的命令捕获stdin而不是stdin。考虑:

( (my_cmd 2>&1 1>&3) | error_processor ) 3>&1

执行my_cmd并将其标准输出发送到终端(最终),但将my_cmd的错误输出路由到命令error_processor,该命令期望从stdin输入

答案 2 :(得分:0)

它创建一个子shell,允许另一个重定向步骤。