我对如何启动 tmux 有点困惑。当我启动我的终端(当前的 gnome-terminal)时,我希望 tmux 能够启动并运行。
我目前通过在 .zshenv 中调用“tmux”来执行此操作(有点像 bash 中的 .bashrc)。这确实会启动 tmux,但有一些令人讨厌的副作用。首先,按 Ctrl-D 退出 shell,只会杀死 tmux,而没有 tmux 的 gnome-terminal 仍在运行。再按一次 Ctrl-D 也会杀死它。其次,当通过 ssh 进入具有此设置的框时,我会得到第二个嵌套的 tmux 实例。我不希望 tmux 在 ssh 时再次启动。
这是正确的方法吗?通常应该如何启动 tmux?
答案1
从 启动任何东西都.zshenv
绝对是错误的方法。 的每个实例都会执行此文件zsh
,即使在运行脚本时也是如此。 用于.zshrc
应该在交互式 shell 中完成的事情,以及.profile
(或.zprofile
,如果您已将 zsh 设置为您的登录 shell)用于应该在登录时完成的事情。
如果您想在每个终端中使用 tmux,请直接在终端下启动 tmux,例如gnome-terminal -e tmux
(更改您的 GUI 启动器以传递这些参数)。您甚至可以传递参数-e
(但要小心引用),例如gnome-termminal -e 'tmux -s ~/.alternate.tmux.conf'
。
如果你还想在通过 ssh 登录时启动 tmux,则必须从 启动它~/.profile
。仅当登录 shell 的父进程是 时才执行此操作sshd
:
parent_process_name=$(ps -o comm= -p $PPID`)
case ${parent_process_name##*/} in
sshd) type tmux >/dev/null 2>/dev/null && exec tmux;;
esac
通过 ssh 启动 tmux 的另一种方法是从环境中获取会话名称。这样您就可以附加到现有会话。最简单的方法是在服务器端编写一个小脚本,例如~/bin/tmux-login-session
:
#!/bin/sh
if tmux has-session -t "$1"; then
exec tmux attach-session -t "$1"
else
. ~/.profile
exec tmux new-session -s "$1"
fi
然后使用如下 ssh 命令:
ssh -t hostname.example.com bin/tmux-login-session SESSION_NAME
答案2
以下是如何设置 tmux 以使用gnome 终端:
- 启动 gnome-terminal
- 菜单 > 编辑 > 配置文件首选项 > 标题和命令(选项卡)
- 查看运行自定义命令而不是我的 shell
- 填充自定义命令和tmux
这些说明适用于我在 Ubuntu 11.04 上的工作。等效说明应该适用于任何 Linux 版本的 gnome-terminal。
答案3
在终端执行以下命令即可获得tmux每次启动时运行gnome 终端:
gconftool --type string --set /apps/gnome-terminal/profiles/Default/custom_command "tmux"
gconftool --type bool --set /apps/gnome-terminal/profiles/Default/use_custom_command "true"
这些命令集使 gnome-terminal 在终端启动时启动 tmux。
- 当您退出 tmux 时,这将导致 gnome-terminal 退出。
- 由于它是一个 gnome 终端设置,它不会干扰 ssh 或登录。
- 此外,您可以使用固定在桌面上的 gnome-terminal 的所有快捷方式,并在运行 tmux 的情况下从命令行启动它,因此您不需要为此行为创建自定义快捷方式。
答案4
在终端选项中将其添加为自定义命令 -
bash -c 'tmux attach || tmux new'
这将尝试连接到任何现有的 tmux 会话。如果不存在,它将启动一个新会话并连接到它。