我有一个带有以下代码的脚本:
#!/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
另一个不会退出,但现在不相关)。bash
tmux
将延迟更改为sleep 10
并运行脚本。等一会儿你就会看到它echo
-es 到你的当前的终端。接下来调用tmux ls
以查看是否留下了一个新的无用会话。您可以附加到它并验证echo
那里没有任何内容。
我无法
sleep
在我的基本会话中使用,因为它会使会话无法使用
您的脚本在前台运行时也是如此。后台工作怎么样?你tmux
根本不需要:
(sleep 20s; echo surprise) &
一般来说你能如果您有适当的权限,则可以写入另一个终端。以下是我在 Debian 中可以执行的操作。假设我想从会话 B 写入,因此文本在bash
会话 A 中可见。首先我需要知道stdout
A 的实际设备是什么:
readlink /proc/$pid_of_bash_A/fd/1
bash
由于$$
特殊参数,在 A 内部这变得更简单:
readlink /proc/$$/fd/1
输出是/dev/pts/3
我的情况。然后在会话B中:
echo Hello World! > /dev/pts/3