我知道如何在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>&-
给了我一些我无法解决的错误。
有什么办法吗?谢谢!
答案 0 :(得分:16)
你必须首先保存stdout(例如通过在fd#4上链接它)
exec 4<& 1
重定向标准输出
exec 1> bar
恢复已保存的标准输出
exec 1<& 4
答案 1 :(得分:7)
有可能有几种方法可以做你想要的,但最简单的可能是子shell或命令组:
( some
commands
you
want
to
redirect ) >> logfile
( ... )
构造是子shell;使用{ ... }
的重量略轻,因为它只是一组命令。哪个更喜欢取决于您是否希望在组内分配的变量在之后保持,主要是,尽管还有其他一些差异...
答案 2 :(得分: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
。