bash:如何重定向stdout / stderr,然后稍后恢复fd的?

7

我希望有一个脚本可以将标准输出和标准错误重定向到一个文件中,然后执行一些操作,最后撤销这些重定向并对文件内容采取行动。我正在尝试:

function redirect(){
   exec 3>&1
   exec 4>&2
   exec 1>outfile 2>&1
}
function undirect(){
   exec 1>&3
   exec 2>&4
}
echo first
redirect
echo something
cat kjkk
undirect
if some_predicate outfile; then echo ERROR; fi

这个方法似乎能够实现我的需求,但是看起来比较复杂。有没有更简单、更清晰的方法可以做到这一点?

2个回答

9

如果你需要在不预先知道要将什么放在哪里以及何时放置的情况下来回切换,那么这基本上就是做法。但根据您的需求,将需要重定向的部分隔离并作为一组执行可能更加整洁,如下所示:

echo first
{
  echo something
  cat kjkk
} 1>outfile 2>&1
if some_predicate outfile; then echo ERROR; fi

{} 被称为组命令,整个组的输出被重定向。如果您愿意,可以在子 shell 中执行 execs,因为它只影响子 shell。

echo first
(
  exec 1>outfile 2>&1

  echo something
  cat kjkk
)
if some_predicate outfile; then echo ERROR; fi

请注意,我在这里使用圆括号(),而不是花括号{}(这在第一个示例中使用)。
希望对你有所帮助。

甚至可以在当前的shell中使用:{ echo something; cat afile; } >outfile 2>&1 - glenn jackman
@glenn;没错。第一个可以这样,而且可能更好。我会编辑的。 - falstro

3

我觉得这段代码很简洁。唯一需要改进的是将“outfile”文件名作为参数传递给函数,因为你在函数外部使用了该文件名。

redirect() {
    exec 3>&1
    exec 4>&2
    exec 1>"$1" 2>&1
}
:
redirect outfile
:
if some_predicate outfile; ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接