如果 Tmux 是由 Bash 启动文件自动启动的,Bash 交互式 shell 会在 Tmux 挂起时挂起

如果 Tmux 是由 Bash 启动文件自动启动的,Bash 交互式 shell 会在 Tmux 挂起时挂起

当我手动启动时多路复用器tmux通过从我的 Bash 交互式 shell发出,我可以稍后暂停多路复用器没有CTRL-BZ问题。按此组合键将使我返回到父进程,即我从中启动的 Bash 交互式 shell多路复用器

但我的配置文件的最后有以下代码片段重击交互式 shell ( ~/.bashrc) 定义:

# Test if neither _Tmux_ nor _Screen_ is running.
if ! [[ -n "$TMUX" || "$TERM" =~ screen ]]; then
  # Test if _Tmux_ is on the `$PATH`.
  if type -p tmux &> /dev/null; then
    # Try to attach to latest unattached session or start a new one.
    { tmux attach-session || tmux new-session; } &> /dev/null
  fi
fi

此代码片段自动启动多路复用器每当我开始重击交互式 shell 假定尚未运行终端多路复用器程序。

CTRL-BZ这次按下暂停多路复用器让我处于无响应的父进程中,即自动启动的 Bash 交互式 shell多路复用器来自其启动文件 ( ~/.bashrc)。

除了分离之外多路复用器从会话中并将其重新附加到会话,有没有办法使多路复用器以这样的方式暂停,以便我可以继续在其父级中工作重击交互式 shell 并稍后返回,将其前景化为fg?

请注意,出于各种原因,我打算让重击多路复用器并且不将其自身替换为 ( exec)。

答案1

set -m您应该在.bashrc开始之前打开作业控制tmux

Bash 运行启动文件就像.bashrc禁用作业控制一样。从外壳程序:

#if defined (JOB_CONTROL)
  /* Startup files should be run without job control enabled. */
  old_job_control = interactive_shell ? set_job_control (0) : 0;
#endif

请注意,它C-b C-z本身并没有在后台设置 tmux;缺乏工作控制在上层 shell 中,SIGTSTPtmux 发送的信号只会导致其停止;该tmux过程将仍然位于终端的前台进程组中(尽管在某些终端模拟器上使用 // 转义符exit_ca_mode从备用屏幕进行欺骗性切换rmcup,例如)texterm

相关内容