Bash脚本执行完自定义函数后无法自动退出需手动按回车问题
问题根因
- 脚本中所有
foo函数调用都通过&放到后台执行,但主脚本未添加wait指令等待所有后台子进程运行结束,主进程会在启动完所有后台任务后直接退出,此时后台任务的输出(如Done $i日志)会冲掉已经打印的shell提示符,视觉上呈现出脚本未退出的假死状态,按下回车会触发shell重新打印提示符,就表现为需要手动按回车才能结束。 - 后台运行的
prokka命令如果存在读取标准输入的逻辑,会因为后台进程无法获取用户输入进入挂起状态,也会导致进程无法正常结束。
修复后的脚本
#!/bin/bash PATH=/opt/conda/bin:$PATH export PATH eval "$(conda shell.bash hook)" # 环境激活失败直接退出,避免后续执行报错 conda activate prokka_env || exit 1 foo () { local i=$1 # 重定向标准输入为空,避免后台运行时读取输入挂起,变量加引号兼容带空格的文件名 prokka "$i" --outdir ./"${i%.*}" --prefix "${i%.*}" < /dev/null echo "Done $i" } for i in *.fasta; do foo "$i" & done # 等待所有后台子进程全部执行完成后,主脚本再退出 wait
验证说明
修改后运行脚本,所有fasta文件处理完成、所有Done $i日志打印完成后,主脚本会自动退出并正常返回shell提示符,无需手动敲击回车。
内容的提问来源于stack exchange,提问作者Macdonald
相关产品推荐
相关产品推荐

