启动带有多个选项卡的新 gnome 终端,并等待命令运行完毕

启动带有多个选项卡的新 gnome 终端,并等待命令运行完毕

我想启动一个新的 gnome-terminal 窗口并在多个选项卡中运行一些命令。根据这个问题

gnome-terminal --tab -t "FOO" -e "/bin/zsh -i -c 'cd $(pwd); zsh -i'" \
               --tab -t "XYZ" -e "/bin/zsh -i -c 'cd $(pwd); tail -f /var/log/dmesg; zsh -i'"

我面临的问题是,在我关闭后,CTRL-C阻止tail -f选项卡就退出并消失了。不过,我希望它保持打开状态,并可能检查过去的输出。

不知怎的,我的猜测是,一些父母得到了它SIGINT并退出了这一切,而不是将它发送给tail命令。

例如,一个简单的sleep作品就可以了:

gnome-terminal --tab -t "FOO" -e "/bin/zsh -i -c 'cd $(pwd); zsh -i'" \
               --tab -t "XYZ" -e "/bin/zsh -i -c 'cd $(pwd); sleep 3; zsh -i'"

这将使两个选项卡保持打开状态并显示提示。

答案1

使用zshtrap内置函数(该trap内置函数也存在于 中bash):

gnome-terminal --tab -t "FOO" -e "zsh" \
--tab -t "XYZ" -e "zsh -c 'trap \"zsh\" 2; tail -f /var/log/dmesg'"

或者:

gnome-terminal --tab -t "FOO" -e "zsh" \
--tab -t "XYZ" -e "zsh -c 'trap \"zsh\" SIGINT; tail -f /var/log/dmesg'"

看起来您正在从 运行此程序sh。一些补充说明:

  • zsh在您的安装中已经在/bin(因此在path) 中,所以您需要生成一个zshshell 的是zsh
  • zsh默认情况下以交互方式运行,因此生成交互式zshshell 可能只需运行zsh
  • zsh足够智能,pwd默认情况下可以读取,因此您可能只需要zsh在实例的同一工作目录中生成一个交互式 shell,sh然后运行zsh

正如您所想,问题在于 SIGINT 信号,该信号会传播到接收信号的进程的同一进程组中的所有进程。

使用trap 'zsh' 2/trap 'zsh' SIGINT当前zsh实例设置为zsh在接收到 SIGINT 信号时生成另一个实例,从而绕过该问题。

您还可以zsh通过在参数中以空格分隔列出多个信号,使实例对多个信号“免疫”:

trap 'zsh' 1 2 3 [...]

或者:

trap 'zsh' SIGHUP SIGINT SIGQUIT [...]

您可以通过运行以下命令打印所有可用信号的有序列表kill -l

% kill -l
HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL PWR SYS

相关内容