我正在编写一个 shell 脚本,它创建/附加或切换到给定的会话,这取决于一个是否在 tmux 内部并且会话存在。
除了需要从 tmux 会话中创建新的 tmux 会话的情况外,我的一切工作都很好。
当我的脚本执行tmux new-session -s name
时,我得到以下输出:
会话应小心嵌套,取消设置 $TMUX 以强制
我实际上并不想嵌套会话,我的目标是创建另一个单独的会话并从 tmux session 中切换到它。
这可能吗?
我正在编写一个 shell 脚本,它创建/附加或切换到给定的会话,这取决于一个是否在 tmux 内部并且会话存在。
除了需要从 tmux 会话中创建新的 tmux 会话的情况外,我的一切工作都很好。
当我的脚本执行tmux new-session -s name
时,我得到以下输出:
会话应小心嵌套,取消设置 $TMUX 以强制
我实际上并不想嵌套会话,我的目标是创建另一个单独的会话并从 tmux session 中切换到它。
这可能吗?
最快的方法(假设您ctrl-b
用作命令前缀)是:
ctrl-b :new
要创建一个新会话,然后
ctrl-b s
以交互方式选择并附加到会话。
此脚本将检查会话是否存在。如果会话不存在,则创建新会话并附加到它。如果会话确实存在,则不会发生任何事情,我们会附加到该会话。随意将 `~/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 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,在 Mac OSX 中您可以将 Caps Lock 更改为 ctrlsystem preferences > keyboard > modifier keys
尝试在不分离的情况下附加到会话将导致错误。
$ tmux attach -t development
> sessions should be nested with care, unset $TMUX to force
而是使用命令模式Prefix
:
,然后键入attach -t session_name
并按 Enter。
使用它对我有用:
TMUX= tmux new-session -d -s name
tmux switch-client -t name
第一TMUX=
行的 是必需的,因此 tmux 不会抛出sessions should be nested with care, unset $TMUX to force
消息。
您可以在终端中启动的所有命令,例如tmux new -s sessionName
可以tmux
通过按下触发键(例如:)从内部启动,ctrl-b
然后:
是没有启动tmux
部分的命令。
因此,ctrl-b :
随后new -s sessionName
将完全按照您的意愿行事,并为您的会话命名。它还会自动切换到新会话。
你可以unset TMUX
先试试,这对我有用。
在 user2354696 的建议下,我使用以下键绑定来创建新会话或“克隆”现有会话
bind-key N run-shell 'TMUX= tmux new-session -d \; 切换客户端-n' bind-key C run-shell 'TMUX= tmux new-session -t $(tmux display-message -p #S) -s $(tmux display-message -p #S-clone) -d \; 切换客户端-n \; 显示消息“会话#S克隆”'