我希望我的默认bash shell直接进入tmux,而不是每次都必须键入tmux。

#1 楼

从Arch Wiki,每次登录shell时都启动tmux似乎有效。只需在别名前将以下bash代码行添加到.bashrc即可;其他外壳的代码非常相似:

[[ $TERM != "screen" ]] && exec tmux


评论


对我来说,这也需要[[$-!= * i *]] &&返回到不是无限循环(来自同一页)

–基思笑脸
13年4月14日在1:45

这是一个糟糕的解决方案,因为用户的.tmux.conf文件可能会将TERM设置为其他值。最好检查是否设置了TMUX变量。

– Kusalananda♦
16 Dec 30 '13:21

也可以确认这对zsh也有效。

–Telmo Trooper
20年6月8日,12:47

#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