Bash脚本exec创建带时间戳日志失败,目录不存在如何解决
问题分析与解决方法
核心问题解释
exec 重定向时会自动创建不存在的日志文件,但不会自动创建文件所在的上级目录。你遇到的报错是因为 $1/logs 这个目录不存在,导致无法在里面创建日志文件。
解决步骤
要解决这个问题,需要先确保日志目录存在,同时保证日志文件名的时间戳和实际创建文件的时间一致,具体操作如下:
- 预先生成带时间戳的日志文件名:先把日期时间变量存起来,避免创建目录前后时间戳不一致(比如差几秒)。
- 创建日志目录:用
mkdir -p命令,它会自动创建多级目录,且目录已存在时不会报错。 - 执行重定向:用预先生成的文件名完成输出重定向。
修改后的脚本代码
#!/usr/bin/env bash exec 3>&1 4>&2 trap 'exec 2>&4 1>&3' 0 1 2 3 # 预先生成带时间戳的日志文件名 log_filename=$(date '+%Y%m%d_%H%M%S')_start.log log_dir="$1/logs" # 创建日志目录(-p 参数确保多级目录都能创建,且目录存在时不报错) mkdir -p "$log_dir" # 执行输出重定向到指定日志文件 exec 1>"$log_dir/$log_filename" 2>&1
关键细节说明
mkdir -p "$log_dir":-p是关键参数,比如如果$1是/output,它会自动创建/output/logs;如果$1是/a/b/c,它会创建/a/b/c/logs整个路径。- 先存
log_filename:这样不管创建目录花了多久,日志文件名的时间戳都是脚本执行到这一行的时间,避免出现目录创建前后秒数变化的问题。
内容的提问来源于stack exchange,提问作者GKelly
相关产品推荐
相关产品推荐

