我编写了这个脚本来在同一个终端窗口中创建多个选项卡并在其中运行命令:
#!/bin/bash
#Use the commands as:
#--tab-with-profile=Default --title=<SPECIFY THE TAB TITLE HERE> -e "bash -ic \"<SPECIFY THE COMMAND YOU WANT TO RUN HERE>; bash\"" \
#The ampersand in the end of this file makes sure that the gnome-terminal command is run as a background process
echo "Setting up simulator environment";
service mysqld start;
gnome-terminal \
--tab-with-profile=Default --title=PROG1 -e "bash -ic \"clear;ls;./prog1; bash disown\"" \
--tab-with-profile=Default --title=SIMULATOR -e "bash -ic \"clear;ls;./simulator; bash disown\"" \
--tab-with-profile=Default --title=PROG2 -e "bash -ic \"clear;ls;./prog2; bash disown\"" \
--tab-with-profile=Default --title=DATA -e "bash -ic \"./data -f \"/home/user/NetBeansProjects/data3.txt\" -p \"6785\"; bash disown\"" \
--tab-with-profile=Default --title=PROG3 -e "bash -ic \"cd /home/user/NetBeansProjects/simulator;./prog3; bash disown\"" \
&
问题是,当这些程序中的任何一个完成运行或者如果我按下Ctrl+c
停止其中任何一个程序时,该选项卡将关闭。我不想关闭选项卡。我希望选项卡保持打开状态并显示 bash 终端,以便我可以在选项卡中运行其他命令。有办法做到这一点吗?
答案1
有两个问题;
第一个是在每个bash -ic
命令中(顺便说一下,它不会生成交互式 shell,因为-c
会覆盖-i
,因此-i
可以安全地删除它),您正在调用bash disown
而不是bash
,这意味着什么都没有,并在出错时立即退出;因此,没有交互式 shell 继续运行并gnome-terminal
在外部命令结束时保持打开状态bash -c
;
(另请注意,您可以使用exec bash
而不是bash
在命令末尾使用来保存一些进程。)
第二个是Ctrl+ CSIGINT 被杀死进程的同一组中的所有进程,包括bash
应该在命令结束时生成交互式 shell 的父实例;
要解决此问题,您可以使用bash
的trap
内置设置来设置在接收到 SIGINT 信号时bash
生成另一个交互式实例。bash
简而言之,这应该有效:
gnome-terminal \
--tab-with-profile=Default --title=PROG1 -e "bash -c \"trap 'bash' 2; clear;ls;./prog1; exec bash\"" \
--tab-with-profile=Default --title=SIMULATOR -e "bash -c \"trap 'bash' 2; clear;ls;./simulator; exec bash\"" \
--tab-with-profile=Default --title=PROG2 -e "bash -c \"trap 'bash' 2; clear;ls;./prog2; exec bash\"" \
--tab-with-profile=Default --title=DATA -e "bash -c \"trap 'bash' 2; ./data -f \"/home/user/NetBeansProjects/data3.txt\" -p \"6785\"; exec bash\"" \
--tab-with-profile=Default --title=PROG3 -e "bash -c \"trap 'bash' 2; cd /home/user/NetBeansProjects/simulator;./prog3; exec bash\"" \
&