我怎么知道tmux会话的名称?


13

最近,我开始使用tmux。我觉得很好,但是在理解此应用程序时仍然遇到问题。我的基本问题之一是:如何(从命令行)知道tmux我登录的会话的名称是什么?如果我登录了某个tmux会话,它将告诉我其名称。但是,如果我没有登录到tmux会话,它将不打印任何内容或出现某种错误。

Answers:


18

会话的名称存储在变量中#S,要在访问它,您可以

tmux display-message -p "#S"

如果要在其中使用它.tmux.conf,那就简单了#S。请注意,该-p选项将在stdout上打印消息,否则消息将显示在状态行中。

如果在会话内部调用了上面的命令,它将返回会话的名称。如果在任何会话外部调用它,它仍将返回上一个仍在运行的会话的名称。我找不到一个命令来检查一个会话是否在一个会话中,因此我不得不提出以下解决方案:

tmux list-sessions | sed -n '/(attached)/s/:.*//p'

tmux list-sessions显示所有会话,如果已连接,则显示(attached)在末尾。使用我们会抑制所有输出(选项-n),除非找到关键字(attached),在这一行中,我们删除了a之后的所有内容:,从而为我们保留了会话的名称。相对于,它在会话内外对我都有效tmux display-message -p "#S"

当然,只有在会话名称中没有:和没有时(attached),此方法才有效。

正如Chris Johnsen所评论的那样,一种检查是否在会话中的方法是查看其环境变量是否已设置:

[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"

1
即使它看起来正确,我也必须承认它对我不起作用。我有两个控制台,一个在控制台中,另一个在tmux会话之外tmux。当我键入两个命令时tmux display-message -p "#S",将打印相同的结果,并且两个命令的返回值相同。
e271p314 2014年

我看到相同的行为。查看我最新的答案以解决。
pfnuesel 2014年

4
您可能只需要检查一下TMUX环境变量(通常是为会话内的进程设置的,而不是在会话外进行设置的,这不是“万无一失”的方法,因为可能会设置或取消设置TMUX并使事情混乱,但应该相当可靠)。在kshbashzsh等中:[[ -n "${TMUX+set}" ]] && tmux display-message -p "#S"
Chris Johnsen

感谢您的评论。我认为这确实是一种更优雅,更强大的方法。我在回答中添加了您的评论。
pfnuesel 2014年

如果我同时在两个名称不同的tmux会话中怎么办?这样行吗?
Mihai Danila

0

看看这里,通过这篇文章,我了解到,区分tmux客户端的一件事是它们的tty但会话名称是tmux服务器属性,当我们从tmux客户端内部或外部查看会话名称时,它们是相同的。接下来,我们可以使用tmux info | head它显示客户端的pid和tty以及服务器的pid。

tmux info | grep $$ | grep -q `ps -p $$ -o tty=`

如果我们在tmux客户端内部,则以下命令返回值为0;如果在客户端外部运行,则以下命令返回值为非零tmux。如果从脚本运行它,请确保使用ppid而不是$$,因为tty与外壳程序进程相关联,而不是与您正在运行的脚本相关联。

一种简单的方法,但要知道我们是内部tmux客户还是外部客户的健壮性较低,是查看TERM环境变量。似乎在客户端外部显示为“ xterm”,但在客户端内部显示为“ screen”。但是,我发现第一种方法要好得多。


0

这是一个perl脚本;使它成为Shell脚本或Shell脚本函数是读者的一项练习。

#!/opt/local/bin/perl

use strict;
use warnings;

if (exists $ENV{'TMUX'}) {
    # session ID is the last element
    # /tmp/1s/ffkjhk76sdgn/T/tmux-771/default,16772,8
    my($id) = $ENV{'TMUX'};
    $id =~ s{^.*,(\d+)$}{$1};

    # get session name
    my($cmd) = q(tmux ls -F "#{session_name}: #{session_id}");
    open(IN, "$cmd |") || die qq([ERROR] Cannot open pipe from "$cmd" - $!\n);

    while (<IN>) {
        chomp;

        if (m{(^.*):\s+\$$id$}) {
            print "Session name: <$1>\n";
            exit 0;
        }
    }

    print "Unable to determine TMUX session name\n";
    exit 1;
}
else {
    print "Not in a TMUX session\n";

    exit 1;
}

这将在TMUX会话中产生以下输出:

<~> $ tmuxsessionname
Session name: <1>

<~> $ tmux rename-session "foobar"

<~> $ tmuxsessionname
Session name: <foobar>

在TMUX会话之外,它将产生以下内容:

<~> $ tmuxsessionname
Not in a TMUX session

您可以放弃这些print语句,如果要在Shell脚本或其他内容中使用退出代码,则只需使用退出代码。

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.