
У меня есть скрипт с таким кодом:
#!/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
stdout сеанса
Если вы ссылаетесь на tmux
сеанс, который вы запускаете из скрипта, то это не так. bash
Процесс, выполняющий скрипт, будет ждать tmux new-session -d bash
выхода, затем он выполнится sleep 1d
и т. д. Примечание tmux new-session -d bash
завершается почти немедленно из-за -d
(другой bash
внутри вновь созданного tmux
сеанса не завершается, но сейчас это не имеет значения).
Измените задержку на sleep 10
и запустите скрипт. Подождите немного и вы увидите его echo
-es на свойтекущийтерминал. Затем вызовите tmux ls
, чтобы увидеть, что остался новый бесполезный сеанс. Вы можете подключиться к нему и убедиться, что echo
там ничего не было -ed.
Я не могу использовать его
sleep
в своей базовой сессии, так как это сделает сессию непригодной для использования.
Так же делает ваш скрипт, работая на переднем плане. А как насчет фоновой работы? Вам tmux
вообще не нужно:
(sleep 20s; echo surprise) &
В общем, выможетпишите на другой терминал, если только у вас есть соответствующие разрешения. Вот что я могу сделать в своем Debian. Допустим, я хочу писать из сеанса B, чтобы текст был виден в bash
сеансе A. Сначала мне нужно узнать, какое устройство stdout
на самом деле является устройством A:
readlink /proc/$pid_of_bash_A/fd/1
Изнутри bash
А это проще благодаря $$
специальному параметру:
readlink /proc/$$/fd/1
Вывод /dev/pts/3
в моем случае. Затем в сеансе B:
echo Hello World! > /dev/pts/3