在Shell脚本中重定向STDOUT和STDERR

时间:2013-05-06 06:23:41

标签: exec solaris sh

我有一个脚本使用exec命令将STDOUTSTDERR重定向到文件。该脚本在Solaris 9下运行正常。我在VMware上的Solaris 10上测试它,它在exec命令失败。

prog=`basename $0`
log="${LOCLOG}/${prog}$$"

if test -z "$LDDEBUG"
then
    exec > ${log} 2>&1

    chmod 644 "${log}"
else
    set -x
fi

在上面,脚本在该行结束,没有任何错误消息。

我在变量exec > "${log}" 2>&1周围添加了引号。这让脚本运行到最后,但它没有创建日志文件。

然后我用文件路径尝试了它:

exec > /tmp/blahblah1 2>&1

......它奏效了。它创建了文件并写入了它。但这并不能解决我的问题,因为必须在脚本中生成日志文件名。

我迷失在这里的解决方案,我知道它可能非常简单,但是如果不对脚本进行任何重大更改,我就无法想到其他任何事情。

====== 输出sh -x

ld-test@lunar-tst[60] sh -x /home/hameed/test/local/bin/qikload
+ basename /home/hameed/test/local/bin/qikload
prog=qikload
datefmt=+%H:%M:%S
dayfmt=+%y%m%d
log=/home/hameed/test/local/etc/log/0508/qikload2199
+ test -z
+ exec

=======

然后我删除了2>&1并运行了sh -x,它就越过了那条线。

+ basename /home/hameed/test/local/bin/qikload
prog=qikload
datefmt=+%H:%M:%S
dayfmt=+%y%m%d
log=/home/hameed/test/local/etc/log/0508/qikload27213
+ test -z
+ exec
+ chmod 644 /home/hameed/test/local/etc/log/0508/qikload27213
+ date +%H:%M:%S
now=10:44:23
+ echo Log: 10:44:23 Commencing loads

1 个答案:

答案 0 :(得分:1)

失败的一个非常可信的原因是在VMWare下的Solaris 10上未设置$LOCLOG(但是在Solaris 9上设置),因此脚本正在尝试(但是失败)在根目录中写入。 / p>

您可以通过检查$LOCLOG是否已设置来验证这一点(例如,echo LOCLOG="$LOCLOG"没有任何重定向)。