Bash脚本执行my_command_2后提前退出循环问题求助
解决方案
问题根源
执行nohup $new_command &时,后台进程会继承当前脚本的文件描述符(包括读取my_command_1输出的管道),可能干扰my_command_1的输出流,导致while循环提前终止;同时用字符串拼接命令、依赖eval执行存在安全隐患,且易出现参数解析错误。
修正后的脚本
# 直接执行my_command_1,避免eval带来的安全问题 while read -r line; do if [[ $line == "str_1"*"str_2" ]]; then my_id="${line:20:30}" echo "my id: $my_id" echo "$line" elif [[ $line == *"issue command str"* ]]; then echo "$line" # 用数组存储命令,避免参数含特殊字符时的拆分错误 new_command=(my_command_2 --id "$my_id") echo "bash issuing command ${new_command[*]}" # 重定向my_command_2的输入输出到/dev/null,避免干扰my_command_1的输出流 nohup "${new_command[@]}" >/dev/null 2>&1 & else echo "$line" fi done < <(my_command_1 --arg) # 确保my_command_1完全执行完毕后,再运行my_command_3 my_command_3 --arg
关键修改点
- 移除
eval:直接通过进程替换执行my_command_1 --arg,避免字符串解析带来的安全问题和参数错误。 - 用数组存储命令:
new_command=(my_command_2 --id "$my_id"),确保参数含空格或特殊字符时仍能正确传递。 - 重定向后台进程的IO:
nohup "${new_command[@]}" >/dev/null 2>&1 &,将my_command_2的标准输出和错误重定向到/dev/null,避免其继承当前脚本的文件描述符,防止干扰my_command_1的输出读取。 - 确保
my_command_1执行完毕:进程替换< <(my_command_1 --arg)会等待my_command_1执行完成后才关闭管道,因此while循环会一直读取直到my_command_1结束,之后才会执行my_command_3 --arg。
内容的提问来源于stack exchange,提问作者dl639j
相关产品推荐
相关产品推荐

