从 tmux 会话内部创建新的 tmux 会话

问题描述 投票:0回答:9

我正在编写一个 shell 脚本,用于创建/附加或切换到给定会话,具体取决于会话是否位于 tmux 内部以及会话是否存在。

除了需要在 tmux 会话中创建新 tmux 会话的情况外,一切都运行良好。

当我的脚本执行时

tmux new-session -s name
,我得到以下输出:

会话应小心嵌套,取消设置 $TMUX 以强制

我实际上不想嵌套会话,我的目标是创建另一个单独的会话并从 tmux 会话中切换到它

这可能吗?

tmux
9个回答
211
投票

最快的方法(假设您使用

ctrl-b
作为命令前缀)是:

ctrl-b :new

要创建一个新会话,然后

ctrl-b s

以交互方式选择并附加到会话。


46
投票

如何创建脚本

此脚本将检查会话是否存在。如果会话不存在,则创建新会话并附加到它。如果会话确实存在,则不会发生任何事情,我们会附加到该会话。请随意将“~/development”替换为项目名称。

$ touch ~/development && chmod +x ~/development

# ~/development

tmux has-session -t development
if [ $? != 0 ]
then
  tmux new-session -s development
fi
tmux attach -t development  

来自终端的新会话

让我们创建两个独立的会话,列出它们,附加到一个会话,然后在 tmux 中循环会话。

tmux new -s name -d
在 tmux 内部工作,因为我们正在创建一个新的分离会话。否则你会得到嵌套错误。

$ tmux new -s development -d
$ tmux new -s foo -d
$ tmux ls
> development: 1 windows (created Wed Jan 13 11:31:38 2016) [204x54]
> foo: 1 windows (created Wed Jan 13 11:31:38 2016) [204x54]
$ tmux attach -t
$ tmux ls
> development: 1 windows (created Wed Jan 13 11:31:38 2016) [204x54] (attached)
> foo: 1 windows (created Wed Jan 13 11:31:38 2016) [204x54]

来自 tmux 的新会话

我们现在位于目标会话内部,或者更称为“附加”到我们的目标会话。如果我们尝试在附加时创建新会话,则会导致嵌套错误。 $ tmux new -s bar > sessions should be nested with care, unset $TMUX to force

为了解决这个问题,我们创建一个新的分离会话。例如,

$ tmux new -s bar -d $ tmux ls > development: 1 windows (created Wed Jan 13 11:31:38 2016) [204x54] (attached) > foo: 1 windows (created Wed Jan 13 11:31:38 2016) [204x54] > bar: 1 windows (created Wed Jan 13 17:19:35 2016) [204x54]

循环(切换)会话

    Prefix
  • (
    上一期
  • Prefix
  • )
    下一场
注意:

Prefix 默认为

Ctrl-b
。您可以将
Prefix
绑定到
Ctrl-a
,并且在 Mac OSX 中,您可以将 Caps Lock 更改为 ctrl
system preferences > keyboard > modifier keys

在 tmux 内使用命令模式附加到会话

尝试附加到会话而不分离将导致错误。

$ tmux attach -t development > sessions should be nested with care, unset $TMUX to force

改为使用命令模式 
Prefix

:
,然后输入
attach -t session_name
并按 Enter 键。
    


29
投票

TMUX= tmux new-session -d -s name tmux switch-client -t name

第一行的 
TMUX=

是必需的,这样 tmux 就不会抛出

sessions should be nested with care, unset $TMUX to force
消息。
    


20
投票
tmux new -s sessionName

都可以通过按触发键(例如:

tmux
)然后按
ctrl-b
然后不带启动
:
部分的命令从
tmux
中启动。

因此,

ctrl-b :

后接

new -s sessionName
将完全按照您的要求进行操作,并为您的会话命名。它还会自动切换到新会话。
    


14
投票
unset TMUX

,这对我有用。

    


8
投票

bind-key N run-shell 'TMUX= tmux new-session -d \;切换客户端-n' 绑定键 C run-shell 'TMUX= tmux new-session -t $(tmux display-message -p #S) -s $(tmux display-message -p #S-clone) -d \;切换客户端-n \;显示消息“会话#S已克隆”'



3
投票

tmux switchc -t `tmux new -dP`

如何运作

要创建一个新会话并切换到它,从 insde tmux 会话并且不使用 tmux 命令,您需要分两步完成。

使用
    new-session
  1. 以分离方式创建会话
    -d
    ,使用
    -P
    打印出名称。捕获此输出。
    
    
  2. NEW_SESSION=`tmux new-session -dP`
使用输出通过 
    switch-client
  1. 将客户端(您的终端窗口)切换到不同的会话。使用
    -t
    将新会话作为目标。
    
    
  2. tmux switch-client -t $NEW_SESSION
单线

您可以创建一个单行代码来执行此操作:

tmux switch-client -t `tmux new-session -dP`

或简写:

tmux switchc -t `tmux new -dP`



0
投票
这里

,使用 Ctrl-b :new -s <name>



0
投票

zsh/zle

 函数 
tmx:

    当从命令行调用
  • tmx

    或使用绑定键(我的情况如下

    F4
    )时,它会调用
    fzf
    快速切换到可用的 tmux 会话,并在右侧自动完成和会话预览。 (该功能的灵感来自于

    https://waylonwalker.com/tmux-fzf-session-jump/

    ,另请参阅快速跳转到 tmux 会话。)

  • 当作为
  • tmux my-session

    调用时,它会附加到或创建一个新会话

    my-session
    
    

  • 它可以在现有会话内部和外部工作。如果在会话中调用,它将切换客户端。
  • function tmx { [ -n "$ZLE_STATE" ] && trap 'zle reset-prompt' EXIT local tmux item tmux="$(which tmux)" || return $? if [ -z "$1" ] ; then item="$($tmux list-sessions -F '#{session_name}' |\ fzf --header jump-to-session --preview "$tmux capture-pane -pt {}")" || return 2 else item="$1" fi ( # Restore the standard std* file descriptors for tmux. # https://unix.stackexchange.com/a/512979/22339 exec </dev/tty; exec <&1; if [ -z "$TMUX" ] ; then # Running insided tmux. $tmux new-session -As "$item" else # Attempt to create a new session in case there none with that name. $tmux new-session -ds "$item" 2>/dev/null || true $tmux switch-client -t "$item" fi ) } zle -N tmx bindkey '\eOS' tmx # Bind the function to F4.
© www.soinside.com 2019 - 2024. All rights reserved.