不必每次都输入tmux
,我怎样才能将tmux
始终用于新的会话窗口?
因此,如果我没有打开终端窗口,然后打开一个终端窗口,那么第一个会话如何在tmux
中?
或许看起来像.bashrc
类似的东西?
答案 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,即。
我还有
[ `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;所以我不确定这是否容易)...
可能很难看到,但自定义快捷方式是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