#1 楼
从Arch Wiki,每次登录shell时都启动tmux似乎有效。只需在别名前将以下bash代码行添加到.bashrc
即可;其他外壳的代码非常相似:[[ $TERM != "screen" ]] && exec tmux
#2 楼
@StarNamer的回答通常是准确的,尽管我通常会进行以下测试,以确保(1)系统上存在tmux,(2)我们位于交互式外壳中,并且(3)tmux不会尝试在其中运行本身:if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
exec tmux
fi
参考文献
使用bash的
command
检查命令是否存在-http:/ /man7.org/linux/man-pages/man1/bash.1.html#SHELL_BUILTIN_COMMANDS 为什么要使用
command
而不是which
来检查命令的存在-https://unix.stackexchange .com / a / 85250 使用
$PS1
检查交互式外壳-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_PANES 评论
很好,我之前需要命令,但没有意识到它的存在。
– Freedom_Ben
15年6月21日,0:25
此exec语句不允许您不退出整个终端就退出tmux! :|
–路易丝·马多克斯(Louis Maddox)
15年8月2日在20:43
@LouisMaddox:exec用一个新进程替换当前进程-在这种情况下,它用tmux替换bash登录shell,因此当tmux退出时,没有其他终端可以退回到:)
– Mark K Cowan
2015年12月8日,12:21
@rjt是的,这是根据设计开始的新会话。如果您希望附加到现有的tmux会话,只需将exec tmux替换为您喜欢的tmux附加风格
–user7089
19-2-20在12:54
我使用exec tmux new-session -A -s main而不是exec tmux,所以我将始终有一个名为main的会话并附加到该会话(而不是每次连接到远程计算机时都创建一个新会话),但是它不会崩溃在没有可用会话的情况下使用tmux Attach(可在此处找到:unix.stackexchange.com/a/176885/256942)
– Verena Haunschmid
19年8月13日在8:55
#3 楼
在bashrc文件中添加诸如[ -z "$TMUX" ] && { tmux attach || exec tmux new-session && exit;}
这样的行可能会完成这项工作。请注意,一旦分离或退出tmux,此行将退出ssh并终止连接。我喜欢这种配置,因为它可以保存击键来终止连接。但是,如果您不喜欢这种情况(我认为这种可能性很小),而是希望在终止后保留在登录外壳中,只需删除
exit
部分:[ -z "$TMUX" ] && { tmux attach || exec tmux new-session;}
另请注意,您不应将
tmux attach
包裹在exec
上,因为当没有tmux会话要连接时,这将导致连接关闭。评论
我已经将此行添加到我的.bashrc中,但是现在当我启动终端时,我收到一些消息:/home/z/.tmux.conf:10:没有当前会话(该消息在第11、13、14行重复,15)。这些行是“设置默认命令“ exec bash””和“设置默认终端“ screen-256color”之类的东西。
– Matt G
19年2月3日在2:40
@MattG感觉tmux配置文件有问题。
– huangzonghao
19年2月3日在18:40
#4 楼
转到终端设置。,然后单击“命令”栏。
检查“运行自定义命令而不是我的出售”,并在终端启动时编写要执行的任何命令。
#5 楼
我将广泛的检查与有条件的会话检查相结合,并进行了自己的尝试,以创建连接到或创建的默认会话。除非您不在另一个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
基于以下答案:
https:// unix.stackexchange.com/a/306165/198110
https://unix.stackexchange.com/a/113768/198110
#6 楼
有命令chsh
可以更改登录shell。请咨询man chsh
。评论
tmux不是外壳,而是像GNU屏幕一样的终端多路复用器。有趣的是,它确实根据手册页支持-c选项,因此它可能像shell一样足以将其用作您的登录shell,但我怀疑它在所有情况下都无法正常工作,例如通过gdm / kdm进行图形登录。
– Mikel
2012年7月20日15:32
尽管这是明智的,并得到了文档的支持,但它似乎破坏了通过SSH的直接命令执行(类似于ssh $ some_server echo foo之类的东西)。
–n.st
2014年5月11日下午2:11
在Ubuntu上至少从1.8开始的tmux将自身添加到/ etc / shells中,因此它是有效的登录shell。
– Claytron
15年3月26日在17:14
这要求您在tmux配置中将default-shell设置配置为指向实际的shell。
– Kusalananda♦
17年1月14日,13:35
#7 楼
我已经在我的.zshrc
中成功使用了case $- in *i*)
[ -z "$TMUX" ] && exec tmux
esac
。如果您使用的是bash,请改为将其放入您的
.bashrc
中。例如tmux
将不会产生任何输出。#8 楼
添加到@Louis Maddox的答案中,我将使用以下命令执行tmux部分:(exec tmux attach || exec tmux new-session)
评论
我使用exec sh -c'tmux a || tmux',(在查看您的答案之后)如果tmux由于任何原因而无法启动,可能会导致不好的事情发生……..谢谢,我从现在开始使用您的:)
– Mark K Cowan
2015年12月8日,12:22
tmux new -A -s mysession也可能起作用。
–池
16年4月22日在1:16
#9 楼
上面的响应对我都不起作用-exec tmux
阻止我关闭tmux而不退出外壳(无论是通过Ctrl
+ T
还是从应用程序菜单打开)。我使用Linux Mint,它可以让您映射某些命令的热键,以及(可能有些犹豫。)我在bash shell中启动了一些命令,例如
Win
+ Alt
+ B
执行某种复杂的bash -exec(vim)
语句来编辑我的.bashrc,因此它的作用类似于常规的shell。在这种情况下,将tmux放置在我的.bashrc
的顶部,然后在这种情况下加载而不是vim。我将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 =〜屏幕]] && [-z $ TMUX] && exec tmux&
–丹尼尔城堡
2015年10月6日20:21
#10 楼
这是在我的~/.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
作为您的登录Shell。但是,如果执行此操作,请确保将default-shell
设置为~/.tmux.conf
文件中的实际外壳(有关此信息,请参阅tmux手册)。#11 楼
您可以(并且现在可能应该)使用chsh
命令将tmux设置为默认外壳,然后将以下内容添加到.tmux.conf
中:set-option -g default-shell /path/to/your/favourite/shell
只记得修改路径在该行的末尾。
#12 楼
将此添加到您的~/.tmux.conf
set -g default-command /usr/local/bin/fish
评论
我认为您误解了问题伴侣! ;)
– PhilT
17年5月6日在5:29
#13 楼
默认情况下,这会使tmux在用户的所有新外壳上打开cmd='[ $TERM == screen ] || exec tmux'
echo -e "$cmd\n$(cat ~/.bashrc)" > ~/.bashrc
评论
这仅是对八年前的公认答案的重写—从那时起,已经发布了更好的答案。
– G-Man说“恢复莫妮卡”
20 Mar 6 '20 at 7:50
#14 楼
以下解决方案基于给定的解决方案。这是对它们的改进,并解决了一些问题。如果使用的是DE并尝试使用“右键单击>在终端中打开”,则它将在当前位置打开。 br />
如果您有多个客户端会发生什么?
在以下解决方案中:
first client always use session named default0
second client always use session named default1
third client always use session named default2
....
如果您单击右键>在终端中打开”并且不存在任何会话,则它将在给定目录中打开新会话。
如果您“右键单击>在终端中打开”并且存在会话,则它将附加,然后将cd粘贴到$ PWD。 br />
function tmux-as-default-terminal () {
# If we are not inside tmux session
if command -v tmux &> /dev/null && [ -n "$PS1" ] && [ -z "$TMUX" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]]
then
notmuxsession=$(tmux list-clients | wc -l)
if tmux has-session -t default${notmuxsession}
then
tmux send-keys -t default${notmuxsession}:0.0 "^U"
tmux send-keys -t default${notmuxsession}:0.0 "cd $PWD &> /dev/null" ENTER
tmux send-keys -t default${notmuxsession}:0.0 "^L"
tmux attach-session -t default${notmuxsession}:0.0
else
tmux new-session -s default${notmuxsession} -c $PWD
fi
fi
}
tmux-as-default-terminal
PS在此发布之前,我已经测试了此代码几天。但是,如果您发现任何错误并有任何改进的想法,请告诉我。
#15 楼
正如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的功能!除非您的方法需要扎根且容易出错。从.bash_login运行tmux更有可能破坏远程登录。
–吉尔斯'所以-不再是邪恶的'
2012年7月20日在23:10
评论
对我来说,这也需要[[$-!= * i *]] &&返回到不是无限循环(来自同一页)
–基思笑脸
13年4月14日在1:45
这是一个糟糕的解决方案,因为用户的.tmux.conf文件可能会将TERM设置为其他值。最好检查是否设置了TMUX变量。
– Kusalananda♦
16 Dec 30 '13:21
也可以确认这对zsh也有效。
–Telmo Trooper
20年6月8日,12:47