14

我知道如何在 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>&-

给了我无法解决的错误。

有什么办法可以做到这一点?谢谢!

4

3 回答 3

21

您必须首先保存标准输出(例如通过在 fd #4 上链接它)

执行 4<&1

重定向标准输出

执行 1> 酒吧

并恢复保存的标准输出

执行 1<&4

于 2012-11-05T19:19:58.053 回答
8

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

( some
  commands
  you
  want
  to
  redirect ) >> logfile

( ... )构造是一个子外壳;using{ ... }的重量稍轻,因为它只是一组命令。首选哪一个取决于您是否希望在组内分配的变量在之后持续存在,主要是,尽管还有一些其他差异......

于 2012-11-05T19:13:41.130 回答
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

于 2018-06-30T08:25:50.233 回答