即使重定向到文件失败,脚本也会继续执行

即使重定向到文件失败,脚本也会继续执行

这是一个典型的场景,我们将脚本输出重定向到文件。由于权限问题或任何原因,无法创建输出文件。 (通常,这些是根据产品的 NFR 要求实现的日志文件)现​​在,因此,脚本执行本身被阻止。有没有一种方法可以避免这种情况,如果无法创建输出文件,脚本执行仍应继续。

答案1

我的建议是使用已经存在的日志子系统 ( syslog)。访问它的命令行工具是logger.

将工具设置user为适当的输出优先级(错误、警告、信息、调试等),并将标记设置为代表程序的标签,然后就完成了:

your_program 2>&1 | logger -t your_program -p user.info

答案2

您可以用作tee中间人,而不是直接重定向命令的输出。它不会仅仅因为打开输出文件失败而停止。

$ cat out.sh
#!/bin/bash
outfile=${1-/dev/null}
echo hello | tee "$outfile"
echo done.
$ touch unwritable; chmod a-w unwritable
$ bash out.sh unwritable 
tee: unwritable: Permission denied
hello
done.

管道的退出状态将是最后一个命令的退出状态tee。如果您需要管道第一部分的退出状态,您可以使用例如 Bash 的PIPESTATUS数组来获取它。

如果您不希望将输出副本重定向到脚本的标准输出,请将输出重定向tee到。/dev/null

答案3

由于重定向是在执行关联命令之前处理的,因此如果重定向失败,则该命令根本不会被执行。

因此对于

./script.sh >"$output"

为了在重定向到文件$output失败的情况下成功运行脚本,我们首先必须检测是否可以手动进行重定向。

这可以通过重定向eg的输出echo并捕获它是否失败来测试:

if ! echo >"$output" 2>/dev/null; then
    output=/dev/null
fi

./script.sh >"$output"

/dev/null在这里,如果默认输出文件不可用,我们将输出重定向到。如果您不想丢弃输出并希望将其转到标准输出,则可以使用eg 代替/dev/stdout/dev/null

相关内容