You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用xterm/urxvt启动持续命令,退出后进入同窗口shell?

问题原因

当你执行sh -c "持续命令; sh"这类命令时,按下Ctrl+C会向整个前台进程组发送SIGINT信号——这包括执行脚本的sh进程和它启动的持续命令进程。结果是持续命令被终止的同时,sh进程也会收到SIGINT并直接退出,导致后续的sh命令根本没有机会执行,终端因此进入无响应状态。

解决方案

以下几种方法可以解决这个问题,适用于urxvt和xterm:

方法一:让脚本进程忽略SIGINT信号

urxvt -e sh -c 'trap "" INT; tail -f /dev/null; exec sh'
  • trap "" INT:让当前sh进程忽略SIGINT信号,按下Ctrl+C时只有持续命令(比如tail -f)会被终止,sh进程会继续执行后续的交互shell命令。
  • exec sh:用新的交互shell替换当前sh进程,避免多余的进程层级,同时终端会保持打开直到你主动退出shell(可以去掉-hold选项,因为exec sh会让终端持续运行)。

方法二:后台运行持续命令+信号捕获

urxvt -e sh -c 'tail -f /dev/null & PID=$!; trap "kill $PID" INT; wait $PID; exec sh'
  • tail -f /dev/null &:将持续命令放到后台运行,并记录它的进程ID(PID)。
  • trap "kill $PID" INT:捕获SIGINT信号,触发时主动杀死后台的持续命令进程。
  • wait $PID:等待持续命令进程结束后,启动交互shell。

方法三:适配xterm的命令

将上述示例中的urxvt替换为xterm即可,比如:

xterm -e sh -c 'trap "" INT; tail -f /dev/null; exec sh'

内容的提问来源于stack exchange,提问作者flappix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 11:12:46