Я хотел бы написать несколько сценариев, которые бы открывали несколько панелей терминала в одном окне, например tmux или screen.

Лично я хорошо разбираюсь в tmux и использую его в течение многих лет, но другие разработчики в нашей команде не хотят ничего знать ни о нем, ни о других мультиплексорах экрана.

С этой целью я хотел бы написать сценарии, которые могут быть разделены на несколько областей в одном окне. Возможно ли это с прямым bash?

Мои цели состоят в том, чтобы

  • не требуйте node или что-то, что необходимо установить (например, blessed-contrib ), чтобы максимально упростить процесс.
  • напишите его, используя что-то предустановленное в большинстве дистрибутивов и совместимое с posix.
  • иметь одно окно терминала, которое разбито на панели, где каждая панель может быть запущенным процессом или командной строкой.
  • когда кто-то нажимает ctrl+c, он выходит из всех панелей и возвращается к одному терминалу.
4
Brad Parks 28 Окт 2019 в 14:23
1
Вы можете довольно легко обернуть tmux в простые функции оболочки, которые делают самые основные вещи, такие как разделение по горизонтали/вертикали, переключение в другое окно и т. д. Если вы пишете что-то с нуля, вы получаете что-то довольно тяжелое< /i>, которые вы должны поддерживать, и которым им придется учиться. Лучше основывать его на tmux с возможностью более плавного прекращения использования оболочек вашей оболочки.
 – 
Kusalananda
25 Окт 2019 в 15:22

1 ответ

Лучший ответ

Я думаю, можно с уверенностью сказать, что это невозможно сделать только с помощью bash. Вам понадобится либо более высокий язык программирования, такой как perl/python, либо управление экземпляром tmux с помощью скрипта.

Вот краткий обзор задействованной технологии:

  • Чтобы запустить программу в терминальной среде, которую она ожидает, вам необходимо создать псевдотерминал (pty) для его размещения.
  • pty создаются и управляются с помощью системных вызовов, таких как ioctl, и имеют довольно низкоуровневый API.
  • Чтобы сделать что-то вроде tmux, вам нужно будет постоянно читать управляющую сторону каждого pty, а затем соединять эти части вместе на терминале основной программы, используя специальный экранирующие коды терминала
  • Возможности терминала (т. е. escape-последовательности, поддерживаемые терминалом для позиционирования курсора, полужирного шрифта, цвета, подчеркивания и т. д.) имеют сотни вариаций, поэтому, если вам нужна какая-либо совместимость, вы захотите использовать библиотеку, например ncurses, чтобы помочь вам настроить дополнительные окна.

Есть несколько инструментов, которые позволяют bash вызывать ioctl, но я этого не делаю. думаю, что он может обрабатывать все вызовы, необходимые для выделения pty, и в любом случае это не стандартный инструмент.

Возможно, вы сможете обойти это, вручную создав узлы устройств pty но вам нужно будет работать как root, и это будет беспорядок.

Bash может найти различные escape-последовательности терминала из команды tput, и вы действительно можете написать bash-скрипты, которые отображают текстовые окна, но без ncurses это трудно сделать правильно и кросс-платформенно, и это займет массу времени. ваше время.

Короче говоря, я не думаю, что вы можете справиться с этим с помощью простых инструментов bash и posix.

Perl установлен почти на всех Unix-системах, и Perl может выполнять вызовы ioctl, так что да, это должно быть возможно написать на Perl даже без установки каких-либо дополнительных модулей. Однако, опять же, я ожидаю, что это займет слишком много времени, по крайней мере, без использования некоторых дополнительных вспомогательных модулей, таких как IO::Pty. и Проклятия. Но даже при всем этом предстоит много работы.

Я думаю, вам лучше всего попробовать скрипт tmux. Я не делал этого раньше, но этот пост выглядит как проект на несколько дней, а не проект на несколько недель и тонны обучения.

Если ваше основное возражение связано с необходимостью установки tmux, вы можете попробовать загрузить и скомпилировать статический двоичный файл tmux, а затем распространить его со своим скриптом. Статический двоичный файл не зависит от какой-либо библиотеки в системе и должен работать на любом современном ядре Linux с правильной архитектурой. Вы даже можете скомпилировать двоичные файлы для нескольких архитектур, а затем определить, какой двоичный файл использовать.

3
M Conrad 29 Окт 2019 в 10:45
Я никогда не думал о включении моего собственного двоичного файла tmux - хорошая идея... спасибо!
 – 
Brad Parks
29 Окт 2019 в 13:25