Bash脚本启动多终端遇阻:如何让脚本完成循环执行?
解决Bash批量启动终端的阻塞与重复执行问题
问题出在哪
- 循环匹配逻辑错误:你循环里的
grep调用了整个array_of_terminals_to_launch数组,而非当前循环的变量,导致每次循环都会执行所有符合数组元素的命令,自然重复启动同一个终端。 - 终端进程占据前台:
gnome-terminal默认会挂在前台运行,脚本必须等该终端关闭才会继续循环,哪怕加了&,只要前面的匹配错误没解决,还是会重复执行。
修正后的脚本
先把循环和匹配逻辑改对,再将终端进程丢到后台:
# 遍历数组时加引号,避免元素含空格时出错 for terminal_key in "${array_of_terminals_to_launch[@]}" do # 只匹配当前循环对应的关键字行,执行后丢入后台 grep -F -i "$terminal_key" /path/to/file/of/gnome-terminal_commands | sh & done # 可选:让脚本等待所有后台终端启动完成再结束(不需要可删除) wait
顺便修正终端命令的语法错误
你提供的示例命令里--title后缺少等号,会导致标题不生效,修正后如下:
gnome-terminal -q --geometry="105x8" --window --title="Title 1" --command="command_to_run_in_new_terminal" --tab --title="Tab 2" --command="command_to_run_in_second_tab"
额外优化建议
如果你的数组元素是用来精准定位命令行的标识,用awk可以更高效处理:
for terminal_key in "${array_of_terminals_to_launch[@]}" do awk -v key="$terminal_key" 'BEGIN{IGNORECASE=1} $0 ~ key {system($0 " &")}' /path/to/file/of/gnome-terminal_commands done
内容的提问来源于stack exchange,提问作者STride
相关产品推荐
相关产品推荐

