每当我开始新的shell会话时,如何使TMUX处于活动状态?

时间:2012-06-17 04:41:15

标签: shell session terminal tmux

不必每次都输入tmux我怎样才能将tmux始终用于新的会话窗口

因此,如果我没有打开终端窗口,然后打开一个终端窗口,那么第一个会话如何在tmux中?

或许看起来像.bashrc类似的东西?

11 个答案:

答案 0 :(得分:61)

警告 现在可以'损坏'(让它无法打开终端窗口 - 这不好!)你的Ubuntu登录。请务必谨慎使用,并确保您可以在计算机上安装第二个管理员帐户,以防万一我遇到同样的问题。有关详细信息和其他方法,请参阅我的其他答案。

鉴于该警告,最简单的解决方案是将tmux调用附加到.bashrc的末尾,例如

alias g="grep"
alias ls="ls --color=auto"

# ...other stuff...

if [[ ! $TERM =~ screen ]]; then
    exec tmux
fi

请注意,exec表示在您打开终端时启动的bash进程由tmux 替换,因此Ctrl-B D(即与tmux断开连接) )实际上关闭窗口,而不是返回原始的bash进程,这可能是你想要的行为?

此外,if语句是必需的(它检测当前bash窗口是否已经在tmux进程中)否则每次启动tmux时,包含的bash进程将尝试启动自己的tmux会话,到无限数量的嵌套tmuxen,这可能,错误,非常烦人(说,它看起来很酷)。


然而,这会使bash以其他程序不期望的方式运行的风险非常小,因为运行bash可能会导致它变成tmux进程,所以它可能会更好修改如何启动终端模拟器。

我在~/bin/terminal中使用了一个小的可执行shell脚本~/bin$PATH,因此它会自动找到),看起来有点像:

#!/bin/sh
exec gnome-terminal -e tmux

(我不使用gnome-terminal,所以你可能不得不删除exec,我不确定。)

现在每当你运行terminal scipt时,你都有一个带有tmux的终端。您可以将其添加到菜单/桌面/键盘快捷方式中,以替换默认终端。

(如果您愿意,此方法还允许您以后更轻松地自定义有关终端模拟器的其他内容。)

答案 1 :(得分:15)

我最初接受的答案是在最近一次升级后停止了我的Ubuntu14系统。

使用

[ -z "$TMUX" ] && command -v tmux > /dev/null && TERM=xterm-256color && exec tmux

[ $TERM != "screen" ] && TERM=xterm-256color && exec tmux

会阻止我甚至无法登录。由于在计算机上进行了第二次管理员登录,我只能解决这个问题。

Ubuntu(以及osx中)对我的修复是将我的终端程序改为实际运行tmux,即。

enter image description here

我还有

[ `uname -s` != Linux ] && exec tmux

作为我的上一个.bashrc行,但现在只用于我的Mac OSX系统。

答案 2 :(得分:14)

如果您想要一个tmux会话,请将以下内容放在〜/ .bashrc中 bash 或〜/ .zshrc zsh

tmux attach &> /dev/null

if [[ ! $TERM =~ screen ]]; then
    exec tmux
fi

tmux attach是为了确定是否有附加的会话,如果没有会话,则不会收到有关" no的警告会话"

答案 3 :(得分:7)

对我来说,我希望每次在我的远程机器上安装时都会启动我的tmux,当我从tmux分离或退出时,应该自动关闭连接。在深入研究这个问题一段时间之后,下面的代码完全符合我的要求,并且被认为是我所知道的最优化代码。

[ -z "$TMUX"  ] && { tmux attach || exec tmux new-session && exit;}

请注意,此行应该是bashrc文件中的第一行,以确保首先加载它。我们不能放一个" exec"在" tmux attach"前面打电话因为在exec用tmux替换bash进程之后,即使没有要附加的会话,连接也将被关闭。因此我们需要退出"退出"在我们分离或退出附加会话后调用以终止连接。但是放一个" exec"在前面,new-session命令很好,因为它是最后一个要执行的命令。

答案 4 :(得分:3)

代码行附加到.bashrc的末尾,

[[ $TERM != "screen" ]] && exec tmux

答案 5 :(得分:3)

我从这个https://wiki.archlinux.org/index.php/Tmux#Bash开始并对其进行了增强,以便在已经附加所有会话的情况下回收已分离的会话并创建新会话

# .bashrc

case $- in
    *i*)
    if command -v tmux>/dev/null; then
        if [[ ! $TERM =~ screen ]] && [[ -z $TMUX ]]; then
          if tmux ls 2> /dev/null | grep -q -v attached; then
            exec tmux attach -t $(tmux ls 2> /dev/null | grep -v attached | head -1 | cut -d : -f 1)
          else
            exec tmux
          fi
        fi
    fi
    ;;
esac

答案 6 :(得分:2)

我刚刚将其设为键盘快捷键(在Linux Mint中不是Ubuntu;所以我不确定这是否容易)...

custom shortcut for tmux terminal

可能很难看到,但自定义快捷方式gnome-terminal --window --maximize -e tmux。这会启动一个新的gnome-terminal窗口最大化,然后为您exec utes tmux

我还有另一个自定义快捷方式,可以启动"正常" gnome-terminal已最大化(如果没有-e tmux,则相同。)

我觉得这是最好的方式,因为你可以随心所欲地开始任何终端,并且是最可定制的方式。

答案 7 :(得分:2)

要为登录和ssh会话启用tmux,您可以将其添加到.bashrc的末尾:

# enable tmux at login
PNAME="$(ps -o comm= $PPID)";
if [ $PNAME == "login" ] || [ $PNAME == "sshd" ] ; then
  exec tmux
fi

此脚本查找bash shell的父进程。如果从登录或从ssh启动bash,它将执行tmux。如果您希望它与GUI终端一起使用,您也可以在其中添加它。例如,如果你想在启动Ubuntu的标准gnome-terminal时自动启动tmux,你可以使用它:

PNAME="$(ps -o comm= $PPID)";
if [ $PNAME == "login" ] || [ $PNAME == "sshd" ] || [ $PNAME == "gnome-terminal" ] ; then
  exec tmux
fi

我在Live Ubuntu Desktop上测试了上述内容,之后我就可以登录了。这不应该破坏GUI登录,除非它调用登录命令登录。我不知道这样做的linux GUI。

答案 8 :(得分:2)

在xfce4中(我正在运行Fedora 24 XFCE旋转,它很棒),我发现最简单的解决方案是编辑面板快捷方式,以便它们运行:

xfce4-terminal -e tmux

此命令可用于替换键盘应用程序快捷方式。

我以前在我的.bashrc中插入了一个if语句,但是它导致登录失败(无论何时输入正确的密码,都会循环回登录框)。

Thunar的Open Terminal Here命令略有不同。要改变那个转到:

Thunar>编辑>配置自定义操作...>这里打开终端>编辑按钮,然后替换:

exo-open --working-directory%f - 启动TerminalEmulator

with:xfce4-terminal --working-directory%f -e tmux

答案 9 :(得分:1)

也可确保终端类型正确设置为256色的单行:

[ -z "$TMUX" ] && export TERM=xterm-256color && exec tmux

答案 10 :(得分:0)

如何添加

# If not running interactively, do not do anything
[[ $- != *i* ]] && return
[[ -z "$TMUX" ]] && exec tmux

到你的.bashrc。它也适用于zsh。

取自https://wiki.archlinux.org/index.php/Tmux#Start_tmux_with_default_session_layout