在bash脚本中使用调试程序分离tmux会话

在bash脚本中使用调试程序分离tmux会话,bash,session,scripting,tmux,Bash,Session,Scripting,Tmux,我有一个脚本,我想在其中启动两个程序,在单独的tmux会话中运行。我现在的剧本大致如下: !/bin/bash tmux new -s test1 'mono --debug program1.exe' tmux new -s test2 'python program2.py' 我遇到的问题是,这两个程序正在调试模式下运行,因此它们正在积极地向tmux会话输出信息。启动程序后,我无法控制在tmux会话中键入任何内容。但是,我可以使用Ctrl+bd方法手动分离会话。不过,我不知道如何在bash

我有一个脚本,我想在其中启动两个程序,在单独的tmux会话中运行。我现在的剧本大致如下:

!/bin/bash
tmux new -s test1 'mono --debug program1.exe'
tmux new -s test2 'python program2.py'
我遇到的问题是,这两个程序正在调试模式下运行,因此它们正在积极地向tmux会话输出信息。启动程序后,我无法控制在tmux会话中键入任何内容。但是,我可以使用
Ctrl+bd
方法手动分离会话。不过,我不知道如何在bash脚本中实现这一点

我找到了
tmux detach
命令,但由于我不确定在程序启动并输出调试信息后如何输入会话,因此我无法输入该命令


我还发现一篇帖子说有一个
-d
标志可以用于tmux,它将启动分离的会话,我希望我可以做一些类似
tmux new-d test1'mono--debug program1.exe'
的事情,但这似乎不起作用。它似乎在抱怨
-d
标志中的语法。

要启动两个单独的会话,每个会话运行一个程序或命令,而不附加,请尝试在
脚本中写入此内容。sh

#!/bin/bash

tmux \
    new \
        -d \
        -s test1 \
        'mono --debug program1.exe' \
    \; \
    new \
        -s test2 \
        -d \
        'python program2.py'
解释
  • \
    用于bash中的行继续,这是一种很好的做法,可以通过在自己的行中使用每个选项来中断一个原本很长的命令,以便更清楚地看到它
  • \
    允许我们将另一个tmux命令添加到原始tmux调用中,而不是从bash启动另一个tmux调用
  • -d
    以运行会话。如您所见,只要它位于
    new
  • new
    是别名,是
    newsession
例如,当您运行脚本时

$ ./script.sh
它悄悄地启动这些tmux会话。您可以检查它们是否存在:

$ tmux ls
test1: 1 windows (created Sun Mar 13 15:19:31 2016) [79x18]
test2: 1 windows (created Sun Mar 13 15:19:31 2016) [79x18]
并附加以查看它们,例如
test1

$ tmux attach -t test1

除了其他选项外,您只需将
-d
标志添加到每个
新的
命令

#!/bin/bash
tmux new -d -s test1 'mono --debug program1.exe'
tmux new -d -s test2 'python program2.py'
请注意,您现在有两个会话,可以使用
tmux attach-s test1
tmux attach-s test2
附加其中一个会话。在同一会话的单独窗口中运行每个命令可能更简单:


split window
替换
new window
,在同一窗口中的不同窗格中运行命令。

谢谢,这对我所需要的很有效。我猜在我的脑海中,我忽略了一个事实,即除了-d标志外,还需要-s标志。我的程序路径也有问题,因为我没有注意到它取决于脚本的位置,除非我指定了整个路径。有一件事我想知道是否可以执行新窗口或拆分窗口命令,但最终分离。就像现在一样,如果我在脚本末尾使用tmux attach-t test1尝试split window命令,我最终会看到两个程序都在运行的tmux窗口。相反,我希望看到一个新的航站楼窗口,或者更好的是什么都不要。该会话与您给出的第一个示例类似,但两个程序都在单独的会话中运行。如果没有,我可以返回到单独的会话,但我有点喜欢拆分窗口,因为您向我展示了这一点。每个
tmux
命令都会影响
tmux
服务器(管理会话)、给定的
tmux
会话和/或
tmux
客户端。此外,命令的操作取决于它是从
tmux
会话内部还是外部运行。例如,
newsession
命令既指示服务器创建新会话,又启动连接到该会话的新客户端。
-d
选项可防止启动新客户端。
attach
命令,如果从连接的会话外部运行,将启动新客户端并连接到会话;否则,它会将当前客户端切换到新会话;您可以创建一个新窗口,或者创建另一个窗口,并在连接到会话之前将其设置为当前窗口。啊,我的错误,我现在明白您的意思了。感谢您的澄清。感谢您在示例中如此清晰,并提供了语法方面的细节。我最终还是使用了另一个答案的代码,因为它看起来更具可读性,但我很感激您提供了一个与我想要的完全一致的答案。
tmux new -d -s test1 'mono --debug program1.exe'
tmux new-window 'python program2.py'
tmux attach -t test1