如何有条件地重定向bas​​h脚本输出

时间:2014-05-01 18:04:48

标签: bash shell io-redirection

我想从bash脚本控制日志记录。我是脚本编写的新手,并继承了一个脚本:

LOG_STDOUT=/tmp/stdout.$$
LOG_STDERR=/tmp/stderr.$$
exec 3>&1
exec 4>&2
exec 1>${LOG_STDOUT}
exec 2>${LOG_STDERR}
set -x
echo $0 $SCRIPTREV starting $(date) >&3
...
echo ERRORMESS > &4

整体重定向当然可以通过将执行者置于条件中来控制,但我不知道如何管理>& 3和>& 4重定向。

处理这个问题的好方法是什么,所以日志文件通常收集-x的所有输出,但是可选地允许我将所有输出都输出到控制台?

由于

2 个答案:

答案 0 :(得分:0)

您可以通过使用输出变量来避免更改exec语句:

[ $STD -eq 1 ] && LOG_STDOUT=/dev/stdout || LOG_STDOUT=/tmp/stdout.$$
[ $STD -eq 1 ] && LOG_STDOUT=/dev/stderr || LOG_STDERR=/tmp/stderr.$$
...

答案 1 :(得分:0)

感谢putnamhill的好建议。

实际上我已经意识到这是一个愚蠢的问题。所有我需要做的只是将条件放在第三和第四个exec语句周围(我有条件围绕所有的执行)。这样,>& 3和>& 4被重定向到& 1和& 2所以不是问题。

这是我避免这个问题的方法:

LOG_STDOUT=/tmp/stdout.$$
LOG_STDERR=/tmp/stderr.$$
exec 3>&1
exec 4>&2

if [[ $mydebug ]]; then
    echo NOT REDIRECTING
else
    exec 1>${LOG_STDOUT}
    exec 2>${LOG_STDERR}
fi