我如何设置我的默认外壳来启动tmux


Answers:


46

这似乎有效...

https://wiki.archlinux.org/index.php/Tmux#Start_tmux_on_every_shell_login

只需在别名之前将以下bash代码行添加到.bashrc中即可;其他shell的代码非常相似:

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

2
对我来说,这也必须[[ $- != *i* ]] && return不是一个无限循环(从同一页开始)
Keith Smiley 2013年

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

104

@StarNamer的回答通常是准确的,尽管我通常会进行以下测试,以确保(1)tmux存在于系统上;(2)我们位于交互式外壳中;以及(3)tmux不会尝试在其中运行本身:

if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  exec tmux
fi

参考文献


1
很好,我以前需要command过,但没有意识到它的存在。
Freedom_Ben 2015年

2
exec语句不允许您在不退出整个终端的情况下退出tmux!:|
Louis Maddox

5
@LouisMaddox:exec用一个新进程替换当前进程-在这种情况下,它用tmux替换bash登录shell,所以当tmux退出时,没有其他终端可退回:)
Mark K Cowan

1
@rjt是的,这是根据设计开始的新会话。如果您希望附加到现有的tmux会话,只需替换exec tmux为您喜欢的口味tmux attach
user7089

2
而不是exec tmux我使用它,exec tmux new-session -A -s main所以我将始终有一个名为main的会话并附加到该会话(而不是每次连接到远程计算机时都创建一个新会话),但它不会像tmux attach没有会话可用时那样崩溃(位于:unix.stackexchange.com/a/176885/256942
韦雷Haunschmid

16

添加一行

[ -z "$TMUX"  ] && { tmux attach || exec tmux new-session && exit;}

在您的bashrc文件中可能会完成这项工作。请注意,一旦分离或退出tmux,此行将退出ssh并终止连接。我喜欢这种配置,因为它可以保存击键来终止连接。但是,如果您不喜欢这种方式(我认为这种可能性很小),而是希望在终止后保留在登录外壳中,只需删除以下exit部分:

[ -z "$TMUX"  ] && { tmux attach || exec tmux new-session;}

另外请注意,你不应该换tmux attachexec,因为这将导致关闭连接时没有TMUX会话重视。


我已经将此行添加到我的.bashrc中,但是现在当我启动终端时,我会收到一些消息:/home/z/.tmux.conf:10:没有当前会话(该消息在第11、13、14行重复,15)。这些线路是喜欢的东西“设置默认命令‘EXEC庆典’,”和“设置默认末端‘屏幕256color’。
马特ģ

@MattG感觉到tmux配置文件有问题。
huangzonghao

5

chsh更改登录外壳的命令。请教man chsh


6
tmux不是外壳,而是像GNU屏幕这样的终端多路复用器。有趣的是,它确实-c根据手册页支持该选项,因此它可能像shell一样足以将其用作您的登录shell,但我怀疑它不能在所有情况下均正常运行,例如通过gdm / kdm进行图形登录。
Mikel

1
尽管这是明智的,并且得到了文档的支持,但它似乎破坏了通过SSH进行直接命令执行(类似于ssh $some_server echo foo)。
n.st

3
在Ubuntu上至少从1.8开始的tmux将自身添加到/etc/shells,因此它是有效的登录shell。
粘土人

2
这要求您default-shell将tmux 配置中的设置配置为指向实际的shell。
库萨兰达

4

我正在成功使用

case $- in *i*)
    [ -z "$TMUX" ] && exec tmux
esac

在我的.zshrc。如果您使用的是bash,请.bashrc改用它。


我也尝试将其设置tmux为默认外壳程序(chsh -s $(which tmux)),这似乎破坏了通过SSH直接执行命令的功能,例如,ssh $some_server echo foo不会产生任何输出。


2

转到终端偏好。 在此处输入图片说明

然后单击“命令”栏。 在此处输入图片说明

选中“运行自定义命令而不是我的卖单”,然后编写要在终端启动时执行的任何命令。


1

上面的响应都不对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 &
Daniel Chateau

1

除了@Louis Maddox的答案,我将执行tmux part;

(exec tmux attach || exec tmux new-session)

我用的exec sh -c 'tmux a || tmux',这(后看着你的答案)很可能会使如果TMUX无法启动任何理由不好的事情发生.....谢谢,我会用你从现在起:)
前标记考恩

1
tmux new -A -s mysession可能也会工作。
poolie

1

这是在我~/.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手册)。


1

您可以(到目前为止,现在应该)使用chsh命令将tmux设置为默认外壳,然后将以下内容添加到.tmux.conf

set-option -g default-shell /path/to/your/favourite/shell

只要记住在行尾修改路径即可。


1

我将广泛的检查与有条件的会话检查相结合,并进行了自己的尝试,以创建连接到或创建的默认会话。除非您不在另一个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


0

将此添加到您的 ~/.tmux.conf

set -g default-command /usr/local/bin/fish

1
我认为您误解了问题伴侣!;)
PhilT's

-3

正如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文档对于何时读取和执行哪个文件不是很准确。


2
您的第一段描述的是chsh功能!除非您的方法需要扎根并且容易出错。运行tmux.bash_login可能打破远程登录。
吉尔斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.