在Bash文件中重定向STDERR会导致创建文件,即使没有错误也是如此。为什么?

时间:2009-08-10 18:03:02

标签: bash shell stderr

我创建了一个用于执行MySQL数据转储的小型Bash脚本。因为转储可能相当大,所以我将进程放在后台,然后等待错误或日志显示在文件系统中。我有以下代码:

mysqldump main_db > /loc/to/dmp/file.sql 2>/loc/to/error/log/file.log &

问题是我得到一个大小为0的'/loc/to/error/log/file.log'文件(我认为这意味着没有真正的错误),有时当这个命令运行时,这会杀死进程,即使没有错误。

我不确定为什么STDERR会在没有数据写入时写入文件。这是因为&后台流程吗?

3 个答案:

答案 0 :(得分:5)

重定向文件在执行shell执行脚本之前设置。

即。在解析了包含重定向的stdout / stderr的命令后,shell分叉打开(如果文件不存在则创建文件)。将打开的文件描述符附加到文件描述符1和2(分别为stdout / err),然后执行实际命令。

答案 1 :(得分:0)

无论是否有任何数据写入,都会创建重定向文件。无论哪个进程正在查看错误日志,都应检查非零文件大小,而不是存在。

答案 2 :(得分:0)

可能的简单解决方法:

mysqldump main_db > file.sql 2> errors.log ; [ -s errors.log ] || rm -f errors.log

OR
(具有时间戳的简短可读易于调整的脚本)

OUTPUT="/loc/to/dmp/`date +%F.%T`.sql"
ERRORS="$OUTPUT.ERRORS"
mysqldump main_db > $OUTPUT 2> $ERRORS
[ -s $ERRORS ] || rm -f $ERRORS