Answers:
这似乎有效...
https://wiki.archlinux.org/index.php/Tmux#Start_tmux_on_every_shell_login
只需在别名之前将以下bash代码行添加到.bashrc中即可;其他shell的代码非常相似:
[[ $TERM != "screen" ]] && exec tmux
TERM
用户的.tmux.conf
文件可能会将设置为其他值。最好检查是否TMUX
设置了变量。
@StarNamer的回答通常是准确的,尽管我通常会进行以下测试,以确保(1)tmux存在于系统上;(2)我们位于交互式外壳中;以及(3)tmux不会尝试在其中运行本身:
if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
exec tmux
fi
参考文献
command
检查命令是否存在-http://man7.org/linux/man-pages/man1/bash.1.html#SHELL_BUILTIN_COMMANDScommand
而不是which
检查命令是否存在-https: //unix.stackexchange.com/a/85250$PS1
检查交互shell - https://www.gnu.org/software/bash/manual/html_node/Is-this-Shell-Interactive_003f.html$TERM
环境变量“对于在tmux中运行的所有程序”的预期状态-http: //man7.org/linux/man-pages/man1/tmux.1.html#WINDOWS_AND_PANEScommand
过,但没有意识到它的存在。
exec
语句不允许您在不退出整个终端的情况下退出tmux!:|
exec
用一个新进程替换当前进程-在这种情况下,它用tmux替换bash登录shell,所以当tmux退出时,没有其他终端可退回:)
exec tmux
为您喜欢的口味tmux attach
exec tmux
我使用它,exec tmux new-session -A -s main
所以我将始终有一个名为main的会话并附加到该会话(而不是每次连接到远程计算机时都创建一个新会话),但它不会像tmux attach
没有会话可用时那样崩溃(位于:unix.stackexchange.com/a/176885/256942)
添加一行
[ -z "$TMUX" ] && { tmux attach || exec tmux new-session && exit;}
在您的bashrc文件中可能会完成这项工作。请注意,一旦分离或退出tmux,此行将退出ssh并终止连接。我喜欢这种配置,因为它可以保存击键来终止连接。但是,如果您不喜欢这种方式(我认为这种可能性很小),而是希望在终止后保留在登录外壳中,只需删除以下exit
部分:
[ -z "$TMUX" ] && { tmux attach || exec tmux new-session;}
另外请注意,你不应该换tmux attach
用exec
,因为这将导致关闭连接时没有TMUX会话重视。
上面的响应都不对exec tmux
我有用- 阻止我在不退出shell的情况下关闭tmux(无论它是使用Ctrl
+ T
还是从应用程序菜单中打开)。
我使用Linux Mint,它使您可以将某些热键映射到命令,并且(可能与某些映射不相吻合。)我在bash shell中启动了一些命令,例如Win
+ Alt
+ B
做一些复杂的bash -exec(vim)
语句来编辑我的.bashrc,使其像普通的shell一样工作。
在这种情况下,将tmux放在我的顶部之后,在这种情况下,tmux加载而不是vim .bashrc
。我将tmux执行行包装在另一个if语句中,检查它是否以交互模式运行。
if command -v tmux>/dev/null; then
if [ ! -z "$PS1" ]; then # unless shell not loaded interactively, run tmux
[[ ! $TERM =~ screen ]] && [ -z $TMUX ] && tmux
fi
fi
您可以将所有内容包装在一行上,但出于可读性考虑,我认为这很好。
[[ ! $TERM =~ screen ]] && [ -z $TMUX ] && exec tmux &
这是在我~/.profile
(我正在使用ksh93
)中:
if [[ -z "$TMUX" ]]; then
if tmux has-session 2>/dev/null; then
exec tmux attach
else
exec tmux
fi
fi
如果TMUX
环境变量未设置/为空,那么我们还没有进入tmux会话,所以...
如果tmux has-session
返回的退出状态为零(true),则有一个附加会话。附加到它。
如果没有,请创建一个新会话。
也可以tmux
用作您的登录外壳。但是,如果执行此操作,请确保将其设置default-shell
为~/.tmux.conf
文件中的实际shell (有关此信息,请参阅tmux手册)。
您可以(到目前为止,现在应该)使用chsh
命令将tmux设置为默认外壳,然后将以下内容添加到.tmux.conf
:
set-option -g default-shell /path/to/your/favourite/shell
只要记住在行尾修改路径即可。
我将广泛的检查与有条件的会话检查相结合,并进行了自己的尝试,以创建连接到或创建的默认会话。除非您不在另一个tmux会话中,否则将满足其他保护条件。
if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
tmux a -t default || exec tmux new -s default && exit;
fi
根据以下答案:
正如Mikel在其评论中已经指出的那样,将tmux用作登录shell可能会有副作用。但是tmux
,从字面上看,您可以设置默认外壳。用户的默认外壳程序在/ etc / passwd中定义。因此,您可以成为root用户并编辑/ etc / passwd,例如,sudo vi /etc/passwd
搜索以用户名开头的行。它可能以结尾:/bin/bash
。将/ bin / bash更改为/ usr / bin / tmux,现在tmux是您的默认登录Shell。
但是,不能保证不会造成任何问题!
可能更好的方法是不执行任何需要root特权的操作。我会尝试在我的家庭目录中创建一个名为.bash_login的文件,并从该文件中启动tmux:`echo“ tmux”>〜/ .bash_login。
这应该可以,但是您必须尝试找到我们自己,b / c bash文档对于何时读取和执行哪个文件不是很准确。
chsh
功能!除非您的方法需要扎根并且容易出错。运行tmux
从.bash_login
是更可能打破远程登录。
[[ $- != *i* ]] && return
不是一个无限循环(从同一页开始)