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


105

我正在写一个shell脚本,该脚本创建/附加或切换到给定的会话,这取决于一个人是否在tmux内部以及该会话是否存在。

除了需要从tmux会话中创建一个新的tmux会话的情况以外,我一切工作都很好。

当我的脚本执行时tmux new-session -s name,我得到以下输出:

会话应谨慎嵌套,未设置$ TMUX即可

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

这可能吗?


2
供用户找到该问题的绝佳
0xSheepdog

Answers:


142

最快的方法(假设您ctrl-b用作命令前缀)是:

ctrl-b :new

要创建一个新的会话,然后

ctrl-b s

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


5
对于不在乎“会话应嵌套,未设置$ TMUX强制执行”的解决方案+1
Marcin Rogacki 2014年

3
然后您可以重命名会话:ctrl-b $
nha 2015年

21
Ctrl-b :new -s <name>为新会话命名。
艾因·托夫里

32

如何创建脚本

该脚本将检查会话是否存在。如果会话不存在,请创建新会话并附加到该会话。如果确实存在会话,则什么也不会发生,我们将附加到该会话。随时用项目名称替换`〜/ 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 ) 下届会议

注: PrefixCtrl-b默认。您可以绑定PrefixCtrl-aMac OSX ,并且可以将Caps Lock更改为ctrlsystem 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。


感谢您提供非常完整的答案,这一次就回答了我的几个问题!
mdekkers

24

使用这个对我有用:

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

TMUX=这样TMUX不会抛出第一线需要sessions should be nested with care, unset $TMUX to force的信息。


1
将第一行更改为以下内容后,我的脚本效果很好:TMUX=`tmux new-session -d -s name`
迈克尔·罗宾逊

17

所有你可以在你的终端中启动的命令,比如tmux new -s sessionName可以从内部启动tmux:按触发键(如ctrl-b当时):没有开始那么命令tmux的一部分。

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



7

在user2354696的建议下,我使用以下按键绑定来创建新会话或“克隆”现有会话

绑定键N运行外壳'TMUX = tmux new-session -d \; 切换客户端-n'
绑定键C运行外壳'TMUX = tmux new-session -t $(tmux display-message -p #S)-s $(tmux display-message -p#S-clone)-d \; switch-client -n \; 显示消息“会话#S已克隆”
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.