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

Mic*_*ant 128 shell bash terminal tmux bashrc

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

use*_*089 171

@StarNamer 的回答通常是准确的,但我通常会包含以下测试以确保 (1) tmux 存在于系统中,(2) 我们处于交互式 shell 中,以及 (3) tmux 不会尝试在其中运行本身:

if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  exec tmux
fi
Run Code Online (Sandbox Code Playgroud)

参考

  • 而不是`exec tmux`我使用`exec tmux new-session -A -s main`所以我总是有一个名为main的会话并附加到它(而不是每次连接到我的远程机器时创建一个新的)但是它如果没有可用的会话,不会像使用 `tmux attach` 那样崩溃(在这里找到:https://unix.stackexchange.com/a/176885/256942) (13认同)
  • @LouisMaddox:`exec` 用一个新进程替换当前进程 - 在这种情况下,它用 tmux 替换了 bash 登录 shell,因此当 tmux 退出时,没有其他终端可以回退到 :) (6认同)
  • 这个 `exec` 语句不会让你在不退出整个终端的情况下退出 tmux!:| (3认同)
  • 很好,我以前需要过“command”,但没有意识到它的存在。 (2认同)

Sta*_*mer 66

Arch wiki 的每次 shell 登录时启动 tmux似乎有效。只需将以下 bash 代码行添加到您.bashrc的别名之前;其他 shell 的代码非常相似:

[[ $TERM != "screen" ]] && exec tmux
Run Code Online (Sandbox Code Playgroud)

  • 这是一个糟糕的解决方案,因为 TERM 可能被用户的 .tmux.conf 文件设置为其他值。最好检查是否设置了 `TMUX` 变量。 (8认同)
  • 对我来说,这也需要 `[[ $- != *i* ]] && return` 不是无限循环(来自同一页面) (2认同)

hua*_*hao 31

添加一行,如

[ -z "$TMUX"  ] && { tmux attach || exec tmux new-session && exit;}
Run Code Online (Sandbox Code Playgroud)

在您的 bashrc 文件中可能会完成这项工作。请注意,一旦您分离或退出 tmux,此行将退出 ssh 并终止连接。我喜欢这种配置,因为它可以节省击键来终止连接。但是,如果您不喜欢这个(我认为这不太可能)并且宁愿在终止后留在登录 shell 中,只需删除该exit部分:

[ -z "$TMUX"  ] && { tmux attach || exec tmux new-session;}
Run Code Online (Sandbox Code Playgroud)

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


小智 8

chsh更改登录 shell 的命令。咨询man chsh

创建tmux您的登录 shell,但不要忘记首先配置default-shell设置tmux

示例~/.tmux.conf

set-option -g default-shell "/bin/bash"
Run Code Online (Sandbox Code Playgroud)

tmux在设置为登录 shell之前,您需要先对此进行测试。

  • `tmux` 不是一个 shell,它是一个像 GNU 屏幕一样的[终端多路复用器](http://tmux.sourceforge.net/)。有趣的是,根据[手册页](http://www.openbsd.org/cgi-bin/man.cgi?query=tmux&sektion=1),它确实支持“-c”选项,因此它可能像shell 足以将其用作登录 shell,但我怀疑它无法在所有情况下正常工作,例如通过 gdm/kdm 进行图形登录。 (7认同)
  • Ubuntu 上至少 1.8 版本的 tmux 将自身添加到 `/etc/shells` 中,因此它是一个有效的登录 shell。 (5认同)
  • 这需要您在 tmux 配置中配置“default-shell”设置以指向实际的 shell。 (5认同)
  • 尽管这是明智的并且得到了文档的支持,但它似乎破坏了通过 SSH 的直接命令执行(类似于 `ssh $some_server echo foo`)。 (2认同)

小智 7

转到终端首选项。 在此处输入图片说明

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

选中“运行自定义命令而不是我的销售”并编写您想在终端启动时执行的任何命令。


yos*_*row 6

我将广泛的检查与条件会话检查结合起来,并对其进行了自己的调整,以创建一个连接到或以其他方式创建的默认会话。除非您在另一个 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
Run Code Online (Sandbox Code Playgroud)

基于这些答案:

https://unix.stackexchange.com/a/306165/198110

https://unix.stackexchange.com/a/113768/198110


n.s*_*.st 5

我正在成功使用

case $- in *i*)
    [ -z "$TMUX" ] && exec tmux
esac
Run Code Online (Sandbox Code Playgroud)

在我的.zshrc. 如果您使用的是 bash,请将其放入您的.bashrc


我也只是尝试设置tmux为我的默认 shell ( chsh -s $(which tmux)) 并且它似乎破坏了通过 SSH 的直接命令执行,例如ssh $some_server echo foo不会产生任何输出。

  • @AhmadIsmail `$-` 包含当前的 shell 选项,如果 shell 是交互式的(即请求用户提示符,而不是直接执行命令),则包括 `i`。`case ... in *i*)` 是一种相当便携的方法,用于检查变量是否在任何地方包含字母 `i`(不需要分解 `expr` 或 `[[` 以及正则表达式来完成如此简单的事情)。 (2认同)