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

Mic*_*son 91 tmux

我正在编写一个shell脚本来创建/附加或切换到给定的会话,具体取决于是否在tmux中并且会话存在.

除了需要在tmux会话中创建新的tmux会话的情况之外,我已经完成了所有工作.

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

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

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

这可能吗?

小智 121

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

ctrl-b :new
Run Code Online (Sandbox Code Playgroud)

那么,要创建一个新会话

ctrl-b s
Run Code Online (Sandbox Code Playgroud)

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

  • 并且`Ctrl-b:new -s <name>`为新会话命名. (16认同)
  • 解决方案+1不关心"会话应该小心嵌套,取消设置$ TMUX强制" (5认同)
  • 然后你可以重命名你的会话:`ctrl-b $` (3认同)

Yon*_*onk 26

如何创建脚本

此脚本将检查会话是否存在.如果会话不存在,请创建新会话并附加到该会话.如果会话确实存在,则没有任何反应,我们会附加到该会话 随意用项目名称替换`〜/ 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  
Run Code Online (Sandbox Code Playgroud)

来自终端的新会议

让我们创建两个分离的会话,列出它们,附加到一个,然后从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]
Run Code Online (Sandbox Code Playgroud)

来自tmux的新会话

我们现在都在里面或更好地称为连接到我们的目标会话.如果我们尝试在附加时创建新会话,则会导致嵌套错误.

$ tmux new -s bar
> sessions should be nested with care, unset $TMUX to force
Run Code Online (Sandbox Code Playgroud)

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

$ 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]
Run Code Online (Sandbox Code Playgroud)

循环(切换)会话

  • Prefix ( 上一届会议
  • Prefix ) 下届会议

注: PrefixCtrl-b默认.您可以绑定PrefixCtrl-aMac OSX并在Mac OSX中将Caps Lock更改为ctrlsystem preferences > keyboard > modifier keys

在tmux内部使用命令模式连接到会话

尝试在不分离的情况下附加到会话将导致错误.

$ tmux attach -t development
> sessions should be nested with care, unset $TMUX to force
Run Code Online (Sandbox Code Playgroud)

而是使用命令模式Prefix :然后键入attach -t session_name并按Enter键.

  • 感谢您的非常完整的回答,这一下子回答了我的一些问题! (2认同)

小智 23

使用这个对我有用:

TMUX= tmux new-session -d -s name
tmux switch-client -t name
Run Code Online (Sandbox Code Playgroud)

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


Mor*_*ock 15

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

因此,ctrl-b :接下来new -s sessionName将完成您想要的操作,并为您的会话命名.它还会自动切换到新会话.


Xia*_*nyu 7

你可以unset TMUX先试试,这对我有用.


rob*_*ord 7

长话短说

tmux switchc -t `tmux new -dP`
Run Code Online (Sandbox Code Playgroud)

怎么运行的

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

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

单线

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

tmux switch-client -t `tmux new-session -dP`
Run Code Online (Sandbox Code Playgroud)

或简写为:

tmux switchc -t `tmux new -dP`
Run Code Online (Sandbox Code Playgroud)

  • 这是对已接受答案的一个很好的变体 (2认同)

小智 5

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

bind-key N run-shell 'TMUX= tmux new-session -d \; switch-client -n'
bind-key C run-shell 'TMUX= tmux new-session -t $(tmux display-message -p #S) -s $(tmux display-message -p #S-clone) -d \; switch-client -n \; display-message "session #S cloned"'