从 tmux 会话回显某些内容到基本会话

从 tmux 会话回显某些内容到基本会话

我有一个带有以下代码的脚本:

#!/bin/bash
tmux new-session -d bash
    sleep 1d
    echo 1 day passed
    tmux kill-session

AFAIU,回声将在 24 小时后出现在 tmux 会话的标准输出中,但不会出现在我的基本 Bash 会话(启动操作系统后的会话)中。

我如何确保 tmux 会话(当然是我的基本 Bash 会话之上的一层)的回声将打印在我的基本会话中?

目的是利用sleep时间阶段在另一个会话,但要获得其下所有命令的输出在我的会议。

当然,我不能在基本会话中使用睡眠,因为这会使会话无法使用或“昏昏欲睡”。

答案1

24 小时后,回声将出现在tmux会话的标准输出中

如果您引用tmux从脚本启动的会话,则事实并非如此。bash执行脚本的进程将等待tmux new-session -d bash退出,然后执行sleep 1d,依此类推。通知tmux new-session -d bash几乎立即退出,因为(新创建的会话中的-d另一个不会退出,但现在不相关)。bashtmux

将延迟更改为sleep 10并运行脚本。等一会儿你就会看到它echo-es 到你的当前的终端。接下来调用tmux ls以查看是否留下了一个新的无用会话。您可以附加到它并验证echo那里没有任何内容。


我无法sleep在我的基本会话中使用,因为它会使会话无法使用

您的脚本在前台运行时也是如此。后台工作怎么样?你tmux根本不需要:

(sleep 20s; echo surprise) &

一般来说你如果您有适当的权限,则可以写入另一个终端。以下是我在 Debian 中可以执行的操作。假设我想从会话 B 写入,因此文本在bash会话 A 中可见。首先我需要知道stdoutA 的实际设备是什么:

readlink /proc/$pid_of_bash_A/fd/1

bash由于$$特殊参数,在 A 内部这变得更简单:

readlink /proc/$$/fd/1

输出是/dev/pts/3我的情况。然后在会话B中:

echo Hello World! > /dev/pts/3

相关内容