bash:如何重定向stdin / stderr然后再恢复fd?

时间:2011-04-27 17:51:20

标签: bash redirect descriptor

我想要一个脚本将stdin和stderr重定向到一个文件,做一堆东西,然后撤消这些重定向并对文件内容采取行动。我在尝试:

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 个答案:

答案 0 :(得分:8)

如果你真的需要来回切换它,事先不知道会发生什么,何时会发生,这几乎就是这样做的。根据您的要求,尽管隔离需要重定向的部件并将其作为组执行可能比较简洁,如下所示:

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

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

echo first
(
  exec 1>outfile 2>&1

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

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

HTH

答案 1 :(得分:3)

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

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