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

这似乎做我想要的,但它似乎相当复杂。有没有更清洁/更清晰的方法来做到这一点?

4

2 回答 2

9

如果您真的需要来回切换它,而事先不知道什么会在何时何地发生,那几乎就是这样做的方法。根据您的要求,尽管隔离需要重定向的部分并将它们作为组执行可能会更整洁,如下所示:

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

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

echo first
(
  exec 1>outfile 2>&1

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

请注意,我在()这里使用括号,而不是大括号{}(在第一个示例中使用)。

高温高压

于 2011-04-27T17:55:32.117 回答
3

对我来说似乎很干净。我唯一要做的就是将“outfile”名称作为参数传递给函数,因为您在函数之外使用文件名

redirect() {
    exec 3>&1
    exec 4>&2
    exec 1>"$1" 2>&1
}
:
redirect outfile
:
if some_predicate outfile; ...
于 2011-04-27T17:56:38.600 回答