当我开始一个新的shell会话时,我如何才能使TMUX处于活动状态?
不必每次都inputtmux
, 我怎样才能将tmux
始终用于新的会话窗口 ?
所以,如果我没有terminal窗口打开,然后打开一个,那么第一个会话怎么能在tmux
?
好像是一个.bashrc
类的东西?
警告 这可能会破坏你的Ubuntulogin。 请谨慎使用,并确保您在计算机上有第二个pipe理员帐户,以防您遇到同样的问题。 看到我的答案更多的细节和一个不同的方法。
最简单的解决scheme是将tmux
调用追加到.bashrc
的末尾,例如
alias g="grep" alias ls="ls --color=auto" # ...other stuff... if [[ ! $TERM =~ screen ]]; then exec tmux fi
请注意, exec
意味着打开terminal时启动的bash进程被replace为tmux
,因此Ctrl-B D
(即从tmux断开连接)实际上closures了窗口,而不是返回到原来的bash进程,这可能是你想要的行为?
此外, if
语句是必需的(它检测当前的bash窗口是否已经在tmux进程中),否则每次启动tmux时,包含的bash进程将尝试启动自己的tmux会话,导致无限数量的嵌套tmuxen这可能是,很呃,很烦人(说,它看起来很酷)。
但是这样做的风险非常小,可以使bash
以其他程序不期望的方式运行,因为运行bash可能会导致它变成一个tmux进程,所以最好修改启动terminal的方式模拟器。
我使用了一个小的可执行shell脚本~/bin/terminal
(在$PATH
有~/bin
,所以它会自动find),看起来有点像:
#!/bin/sh exec gnome-terminal -e tmux
(我不使用gnome-terminal,所以你可能不得不删除exec
,我不确定。)
现在,无论何时运行terminal
scipt,都有一个带有tmux的terminal。 您可以将其添加到您的菜单/桌面/键盘快捷方式,以取代默认terminal。
(这种方法还可以让你更方便地定制关于terminal仿真器的其他内容,如果你有任何愿望的话)。
如果你想有一个单独的tmux会话,把下面的内容放在你的〜/ .bashrc中用于bash或〜/ .zshrc for zsh :
tmux attach &> /dev/null if [[ ! $TERM =~ screen ]]; then exec tmux fi
tmux attach
行是为了确定是否有会话连接到,如果没有会话,你将不会得到有关“ 没有会话 ”的警告。
我最初接受的答案是,最近升级后,我的Ubuntu14系统停止工作。
使用任一
[ -z "$TMUX" ] && command -v tmux > /dev/null && TERM=xterm-256color && exec tmux
要么
[ $TERM != "screen" ] && TERM=xterm-256color && exec tmux
会阻止我甚至无法login。 我只能通过在计算机上进行第二次pipe理login来解决此问题。
Ubuntu上的修复程序(也是在osx中)是改变我的terminal程序来实际运行tmux
我还有
[ `uname -s` != Linux ] && exec tmux
作为我最后的.bashrc
行,但他现在只有我的Mac OSX系统。
对于我来说,我喜欢每次在远程计算机上进行shell程序启动时的tmux,并且当我从tmux中分离或退出时,连接应该自动closures。 在深入研究这个问题一段时间后,下面的代码完全符合我的要求,并据我所知是最优化的。
[ -z "$TMUX" ] && { tmux attach || exec tmux new-session && exit;}
注意这行应该是你的bashrc文件中的第一行,以确保它首先被加载。 我们不能在“tmux attach”前面加一个“exec”调用,因为在exec使用tmuxreplace了bash进程之后,即使没有会话连接,连接也会被closures。 因此,我们需要一个“退出”呼叫来终止连接后,我们分离或退出附加的会议。 但是在新会话命令前面放置一个“exec”就好了,因为这是最后一个要执行的命令。
将以下代码行追加到.bashrc
的末尾,
[[ $TERM != "screen" ]] && exec tmux
单线也确保terminaltypes正确设置为256色:
[ -z "$TMUX" ] && export TERM=xterm-256color && exec tmux
要为login和ssh会话启用tmux,可以将其添加到.bashrc的末尾:
# enable tmux at login PNAME="$(ps -o comm= $PPID)"; if [ $PNAME == "login" ] || [ $PNAME == "sshd" ] ; then exec tmux fi
这个脚本查找bash shell的父进程。 如果bash从sshlogin或启动,它将执行tmux。 如果你想要这个GUIterminal的工作,你可以在那里添加。 例如,如果你想在启动Ubuntu的标准gnome-terminal
时自动启动tmux,你可以使用下面的命令:
PNAME="$(ps -o comm= $PPID)"; if [ $PNAME == "login" ] || [ $PNAME == "sshd" ] || [ $PNAME == "gnome-terminal" ] ; then exec tmux fi
我已经在Live Ubuntu Desktop上testing了上述内容,之后我就可以login了。 这不应该打破GUIlogin,除非它调用login命令login。我不知道这样做的Linux GUI。
我开始使用这个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
如何添加
# 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
我只是把它做成了键盘快捷键(在Linux Mint中不是Ubuntu;所以我不确定这是否容易)…
这可能很难看,但自定义的快捷方式是gnome-terminal --window --maximize -e tmux
。 这将启动一个新的gnome-terminal
窗口最大化,然后exec
你的tmux
。
另外我还有另外一个自定义的快捷方式来启动一个“正常的” gnome-terminal
最大化(没有-e tmux
也是一样的)。
我觉得这是最好的方法,因为你可以以任何你想要的方式启动任何terminal,并且是最可定制的方式。
在xfce4(我正在运行Fedora 24 XFCE自旋,这很好),我发现最简单的解决scheme是编辑面板快捷方式,以便他们运行:
xfce4-terminal -e tmux
这个相同的命令可以用来replace键盘应用程序快捷方式。
我曾经在我的.bashrc中插入了一个if语句,但是它导致login失败(只要input了正确的密码,就会循环回login框)。
Thunar的Open Terminal Here命令的命令略有不同。 要改变这个转到:
Thunar>编辑>configuration自定义操作…>在此处打开terminal>编辑button,并replace:
exo-open –working-directory%f – 启动TerminalEmulator
用:xfce4-terminal –working-directory%f -e tmux