不必tmux
每次都打字,我怎么能tmux
一直用于新的会话窗口?
因此,如果我没有打开终端窗口然后我打开一个,那么第一个会话如何进行tmux
?
似乎是.bashrc
某种东西?
警告 这现在可能“损坏”(使其无法打开终端窗口 - 这不好!)您的 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 进程,因此修改启动终端仿真器的方式可能会更好.
我使用了一个小的可执行 shell 脚本~/bin/terminal
(带有~/bin
in $PATH
,因此会自动找到),它看起来有点像:
#!/bin/sh
exec gnome-terminal -e tmux
(我不使用 gnome-terminal,所以你可能必须删除exec
,我不确定。)
现在,每当您运行terminal
scipt 时,您都有一个带有 tmux 的终端。您可以将其添加到您的菜单/桌面/键盘快捷方式以替换默认终端。
(如果您愿意,这种方法还允许您稍后更轻松地自定义有关终端仿真器的其他内容。)
我最初接受的答案在最近升级后停止在我的 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 系统。
如果您想要一个 tmux 会话,请将以下内容放入您的 ~/.bashrc for bash或 ~/.zshrc for zsh:
tmux attach &> /dev/null
if [[ ! $TERM =~ screen ]]; then
exec tmux
fi
这tmux attach
条线是为了确保它是否附加了一个会话,如果没有会话,您将不会收到有关“无会话”的警告。
对我来说,我希望每次在远程机器上启动我的 tmux,当我从 tmux 分离或退出时,连接应该自动关闭。在深入研究了这个问题一段时间后,以下代码完全符合我的要求,并且据我所知,它被认为是最优化的。
[ -z "$TMUX" ] && { tmux attach || exec tmux new-session && exit;}
请注意,此行应该是 bashrc 文件中的第一行,以确保首先加载它。我们不能在“tmux attach”前面放置“exec”调用,因为在 exec 用 tmux 替换 bash 进程后,即使没有要附加的会话,连接也会关闭。因此,在我们分离或退出附加会话后,我们需要一个“退出”调用来终止连接。但是在 new-session 命令前面放一个“exec”就可以了,因为这是要执行的最后一个命令。
将以下代码行追加到末尾.bashrc
,
[[ $TERM != "screen" ]] && exec tmux
我只是把它做成了键盘快捷键(在 Linux Mint 而不是 Ubuntu 中;所以我不确定它是否这么简单)......
可能很难看到,但自定义快捷方式是gnome-terminal --window --maximize -e tmux
. 这将启动一个gnome-terminal
最大化的新窗口,然后exec
为tmux
您使用。
我还有另一个自定义快捷方式,可以启动“正常”gnome-terminal
最大化(没有-e tmux
.
我觉得这是最好的方式,因为您可以随心所欲地启动任何终端,并且是最可定制的方式。
我从这个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
要为登录和 ssh 会话启用 tmux,您可以将其添加到 .bashrc 的末尾:
# enable tmux at login
PNAME="$(ps -o comm= $PPID)";
if [ $PNAME == "login" ] || [ $PNAME == "sshd" ] ; then
exec tmux
fi
该脚本查找 bash shell 的父进程。如果 bash 是从登录或从 ssh 启动的,它将执行 tmux。如果您希望它与 GUI 终端一起使用,您也可以在其中添加它。例如,如果你想在启动 Ubuntu 的 standard 时自动启动 tmux gnome-terminal
,你可以这样使用:
PNAME="$(ps -o comm= $PPID)";
if [ $PNAME == "login" ] || [ $PNAME == "sshd" ] || [ $PNAME == "gnome-terminal" ] ; then
exec tmux
fi
我已经在 Live Ubuntu Desktop 上测试了上述内容,之后我就可以登录了。这不应该破坏 GUI 登录,除非它调用 login 命令来登录。我不知道有一个 linux GUI 可以做到这一点。
在 xfce4 中(我正在运行 Fedora 24 XFCE spin,这很棒),我发现最简单的解决方案是编辑面板快捷方式以便它们运行:
xfce4-terminal -e tmux
相同的命令可用于替换键盘应用程序快捷方式。
我之前在我的 .bashrc 中插入了一个 if 语句,但它导致登录失败(只要输入了正确的密码,就会返回登录框)。
Thunar 的 Open Terminal Here 命令的命令略有不同。要更改该转到:
Thunar > 编辑 > 配置自定义操作... > 在此处打开终端 > 编辑按钮,然后替换:
exo-open --working-directory %f --launch TerminalEmulator
使用:xfce4-terminal --working-directory %f -e tmux
一个单线,还可以确保为 256 色正确设置终端类型:
[ -z "$TMUX" ] && export TERM=xterm-256color && exec tmux
怎么加
# 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