我想要一个脚本将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
这似乎做了我想要的,但似乎相当复杂。是否有更清洁/更清晰的方法来做到这一点?
答案 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; ...