这是一个典型的场景,我们将脚本输出重定向到文件。由于权限问题或任何原因,无法创建输出文件。 (通常,这些是根据产品的 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