Скрипт Bash с разделенным терминальным окном: одна сторона для прогресса / подсказок, другая сторона для подробного вывода - PullRequest
0 голосов
/ 10 мая 2019

Возможно ли, чтобы bash-скрипт разделял окно терминала горизонтально в одной точке, чтобы левая сторона детализировала общий ход выполнения задач, а правая сторона содержала подробный вывод текущей выполняемой задачи?

screenshot

Я обнаружил, что некоторые люди ссылаются на nohup и screen в контексте разделения окна терминала, но я не знаю, как добиться этого в смысле сценария bash,или если это даже правильное направление для моих нужд.

В настоящее время у меня есть много длинных задач с длинным выводом, поэтому я отправляю вывод каждого из них в накопительный файл журнала, а несброс на экран.Затем, временно, вручную откройте новое окно терминала, чтобы использовать watch tail LogFile*, чтобы следить за происходящим.

Было бы здорово, если бы я мог автоматизировать этот процесс.

Обновить

Некоторые выводы.

Этот пост и его комментарии были очень полезны, чтобы установить, что вы можете запустить команду в одном окне и отправить ее вывод в другое на основе ее pts value.

Например, ls > /dev/pts/7 будет отображать вывод ls в окне терминала в pts / 7.

Все еще озадачен тем, как автоматизировать разбиениеэкран программно, и использовать его вместо нового окна.

1 Ответ

0 голосов
/ 11 мая 2019

Я получил рабочий пример с Terminator .

Запустите скрипт bash ниже в новом окне Terminator:

terminator --command="bash /path/to/script"

И как только мы приступим к этому, это будет хакерским решением, но для разделения экрана по командной строке в bash-скрипте я использовал xdotool для отправки привязок клавиш в Terminator.Вот так:

#!/bin/bash

    # send keybinding that splits screen vertically
    xdotool key Ctrl+Shift+E
    # Terminator now sets focus to the right side (the new split) by default, so send keybinding that returns the focus to our left side
    # sleep a tiny little bit first
    sleep 0.01
    xdotool key Alt+Left

    # now to send output to the right side, let's work out "where" the ride side is
        # use who to find the pts ids of all currently spanwed terminal windows
        # use tail to find the last line from who (which we assume is the terminal window we just split)
        # then grep to find just the number after pts/
        ## windowID=$(who | tail -n1 | grep -oP 'pts/\K[0-9]*')
        # updated this to fix bug where who does not return pts values
        # https://askubuntu.com/questions/1110203
        windowID=$(ps -u $USER -o tty | awk 'NR>1 && $1 != "?" {a[$0]++};END{for(val in a) print val}' | tail -n1 | grep -oP 'pts/\K[0-9]*')

    # now we can send output from commands to the right side split window by using its pseudo device id. for example:
    ls -lah >> /dev/pts/$windowID

exit
...