如何解决Shell函数rc_result执行成功分支的参数处理问题?
问题分析与修复方案
问题根源
你的rc_result函数在**else分支(执行成功时)**存在致命错误:错误地使用$?为log_dir、NAME_JOB、cluster_logs_dir赋值,而非使用函数调用时传入的第2、3、4个参数。
$?是Shell中表示上一条命令的退出状态码的特殊变量,在else分支里,它对应的是if [ $rc -gt 0 ]这条判断命令的退出结果(因为条件不成立,返回0)。这会导致三个变量都被赋值为0,进而在log_output函数中拼接出完全错误的本地日志路径,最终触发No such file or directory错误。
修复后的代码
将else分支的变量赋值逻辑改为和if分支一致,直接使用传入的参数$2、$3、$4:
rc_result() { rc=$? if [ $rc -gt 0 ]; then ULTIMO_ERRO=$1 export log_dir=$2 export NAME_JOB=$3 export cluster_logs_dir=$4 echo $ULTIMO_ERRO log_output "$log_dir" "$NAME_JOB" "$cluster_logs_dir" exit $rc else # 改用调用时传入的参数赋值,替换错误的$? export log_dir=$2 export NAME_JOB=$3 export cluster_logs_dir=$4 log_output "$log_dir" "$NAME_JOB" "$cluster_logs_dir" fi }
修复说明
修改后,无论命令执行成功还是失败,函数都会正确读取调用时传入的:
- 第2个参数:本地日志目录
/data/workdir/sustentacao_id/desenvolvimento/m292121/encaps_logs/logs/ - 第3个参数:任务名
PP_AAAR_ST_4898_DAVMOV_D_TEST - 第4个参数:集群日志路径
/hadoop/cluster_logs/tests/AAAR/aaar-srv-produtos-mov/
log_output函数就能正常拼接出正确的本地日志文件路径(例如/data/workdir/sustentacao_id/desenvolvimento/m292121/encaps_logs/logs/PP_AAAR_ST_4898_DAVMOV_D_TEST_20221121_082844.log),避免路径拼接错误。
内容的提问来源于stack exchange,提问作者gfernandes
相关产品推荐
相关产品推荐

