需要一种临时重定向STDOUT的方法

时间:2012-11-05 19:00:55

标签: linux bash redirect

我知道如何在Linux中重定向输出。事实是,我的bash脚本中有很多输出,我不想输入类似

的内容
echo $foo >> bar

一遍又一遍。我宁愿做类似的事情:

hey, bash, for the time being put all your STDOUT in "bar"
echo $foo
.
.
OK, bash, you can go back to regular STDOUT now

我尝试将FD 1作为文件打开:

exec 1>bar

但是当我完成时无法使STDOUT恢复正常。关闭文件

exec 1>&-

给了我一些我无法解决的错误。

有什么办法吗?谢谢!

3 个答案:

答案 0 :(得分:16)

你必须首先保存stdout(例如通过在fd#4上链接它)

  

exec 4<& 1

重定向标准输出

  

exec 1> bar

恢复已保存的标准输出

  

exec 1<& 4

答案 1 :(得分:7)

有可能有几种方法可以做你想要的,但最简单的可能是子shell或命令组:

( some
  commands
  you
  want
  to
  redirect ) >> logfile

( ... )构造是子shell;使用{ ... }的重量略轻,因为它只是一组命令。哪个更喜欢取决于您是否希望在组内分配的变量在之后保持,主要是,尽管还有其他一些差异...

答案 2 :(得分:2)

重定向块

最简单的方法是:

{
    echo "ALL THE THINGS"
} > OUTFILE

带有文件描述符的重定向

function verbose() {
    local tmp stdout;
    exec {stdout}>&1 {tmp}>>OUTFILE # Save STDOUT; append to OUTFILE
    exec >&$tmp {tmp}>&-  # dup tmp to STDOUT; close tmp
    echo "ALL THE THINGS"
    exec >&$stdout-  # Restore STDOUT, close placeholder
}

以上,echo也将进入OUTFILE