Ubuntu嵌套Bash脚本多终端执行无输出问题求助
主脚本调用gnome-terminal执行子脚本无输出的问题
我想通过单个主脚本简化程序运行流程,用它打开多个终端窗口并在每个窗口执行独立子脚本。但运行主脚本后,子脚本进程看似在后台运行(关闭终端时会提示有进程),但终端窗口里完全没有输出内容。我已经简化了代码来定位问题。
主脚本 main_script.sh 内容
echo "run my program" gnome-terminal -- ~/Path/To/program_script_1.sh sleep 2 gnome-terminal -- ~/Path/To/program_script_2.sh
子脚本内容
program_script_1.sh
bash conda activate MyEnv echo "do the first thing" sleep 1 echo "done"
program_script_2.sh
bash conda activate MyEnv echo "do the second thing" sleep 1 echo "done"
所有脚本都在同一目录下。运行主脚本后,主脚本本身执行正常,但打开的子脚本终端窗口没有任何输出。我猜测问题出在子脚本里调用的bash命令上,而我原本加这个是为了加载conda环境。运行后遇到的现象:
- 子脚本终端窗口无任何文本输出
- 关闭终端时提示有后台进程在运行
问题原因与解决办法
问题根源就是子脚本里的bash命令——它会启动一个新的交互式bash shell,这个新shell会接管当前终端的输入输出,而后续的conda activate、echo等命令都在原来的shell进程里等待这个新shell退出后才会执行,所以终端窗口里看不到任何输出(因为新shell一直在前台运行,没有机会执行后面的命令)。
要加载conda环境并正常执行后续命令,不需要额外调用bash,可以用以下两种方式修改:
方式1:修改子脚本,直接加载conda初始化脚本
如果你的conda没有在shell里自动初始化,可以在子脚本开头手动加载conda的初始化文件,示例:
# 根据你的conda安装路径调整,默认miniconda路径示例 source ~/miniconda3/etc/profile.d/conda.sh conda activate MyEnv echo "do the first thing" sleep 1 echo "done" # 可选:执行完成后保持终端窗口不关闭 exec bash
方式2:在主脚本中直接指定终端执行的命令
也可以直接在主脚本里定义gnome-terminal要运行的完整命令,不需要单独子脚本:
echo "run my program" gnome-terminal -- bash -c "source ~/miniconda3/etc/profile.d/conda.sh && conda activate MyEnv && echo 'do the first thing' && sleep 1 && echo 'done' && exec bash" sleep 2 gnome-terminal -- bash -c "source ~/miniconda3/etc/profile.d/conda.sh && conda activate MyEnv && echo 'do the second thing' && sleep 1 && echo 'done' && exec bash"
关键说明
exec bash是为了在命令执行完成后保持终端窗口不关闭,方便查看输出;如果不需要保留窗口,可以去掉这部分。- 确保conda初始化脚本路径正确,不同conda版本(miniconda/anaconda)的路径可能略有不同,可通过
which conda找到安装目录,再定位到etc/profile.d/conda.sh。
内容的提问来源于stack exchange,提问作者stackoverflowing321
相关产品推荐
相关产品推荐

