如何将Shell脚本中的datetime变量设为静态 实现循环调用共用单个日志文件
问题根因
每次执行sh test4.sh都会启动独立的Shell子进程,子进程内部变量默认与父进程隔离,test4.sh内部每次生成时间戳、使用计数器的逻辑都会随着子进程重启重置,因此无法固定日志文件名。
可行解决方案
方案1:父脚本预生成日志路径,通过参数传递
该方案兼容性最好,不影响test4.sh单独调用的场景。
修改后test3.sh代码
# 循环外仅生成一次时间戳,固定全局日志路径 LogFileDateFormat=%Y%m%d_%H%M%S GetDateTime=$(date +$LogFileDateFormat) LogDirectory="/cred/logs" GLOBAL_LOG_FILE="${LogDirectory}/test4_${GetDateTime}.log" for i in "${array[@]}";do # 将全局日志路径作为入参传递给子脚本 sh test4.sh "$GLOBAL_LOG_FILE" done
修改后test4.sh代码
LogDirectory="/cred/logs" # 优先使用传入的日志路径,无入参时自动生成(兼容单独调用场景) if [ $# -ge 1 ] && [ -n "$1" ]; then LOG_FILE="$1" else LogFileDateFormat=%Y%m%d_%H%M%S GetDateTime=$(date +$LogFileDateFormat) LOG_FILE="${LogDirectory}/test4_${GetDateTime}.log" fi # 原有业务逻辑保持不变 .Do Something >> $LOG_FILE
方案2:通过环境变量传递日志路径
如果不想修改子脚本的调用参数,可以利用Shell子进程会继承父进程导出的环境变量的特性实现:
修改后test3.sh代码
LogFileDateFormat=%Y%m%d_%H%M%S GetDateTime=$(date +$LogFileDateFormat) LogDirectory="/cred/logs" # 导出为环境变量,所有子进程均可读取 export LOG_FILE="${LogDirectory}/test4_${GetDateTime}.log" for i in "${array[@]}";do sh test4.sh done
修改后test4.sh代码
LogDirectory="/cred/logs" # 优先读取父进程导出的环境变量,无值时自动生成 if [ -z "$LOG_FILE" ]; then LogFileDateFormat=%Y%m%d_%H%M%S GetDateTime=$(date +$LogFileDateFormat) LOG_FILE="${LogDirectory}/test4_${GetDateTime}.log" fi # 原有业务逻辑保持不变 .Do Something >> $LOG_FILE
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

