You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 07:16:12