Intereting Posts
Восстановление информации секционирования с блочных устройств Выполнить команду для каждой записи в файле Ошибка при входе на сервер NIS с помощью графического интерфейса рабочего стола переменная alter awk, основанная на совпадении внутри awk Как я должен обрабатывать shebang при написании моей собственной оболочки? Почему команда `users` возвращает разных пользователей в зависимости от того, ssh я или открываю новый терминал? В чем смысл этого тестового выражения Где находится apache / tmp? Почему корневой вывод bash окрашен, но `sudo ls` нет? Схема раздела для установки Debian Как создать нового пользователя, но с уже существующим домашним каталогом? Как восстановить clobbered LD_LIBRARY_PATH на Ubuntu Linux 16.04? где второй жесткий диск в моей CentOS? Исполняемые файлы в / usr / bin не отображаются для разрешенных пользователей Получите Sudoers через LDAP. (SUSE Linux Enterprise Server 12)

Есть ли способ заставить скрипт Bash ввести определенное нажатие клавиши?

Есть ли способ сделать скрипт bash ввести определенное нажатие клавиши? То, что я пытаюсь сделать здесь, – это скрипт, который будет запускать Ctrl + B для выхода из tmux .

EDIT: Я вижу, что несколько человек говорят, что лучше использовать командную программу. Что делать, если я хотел отредактировать текстовый файл (в данном случае файл bash_aliases) с помощью сценария bash?

Если вы хотите взаимодействовать с tmux в скрипте, вы хотите использовать tmux ... tmux-command . Подобно:

 tmux kill-session 

Чтобы выйти из текущего сеанса.

 tmux kill-server 

Выйти из сервера (убивает все сеансы).

 tmux detach-client 

для отсоединения клиента (выход, но вы можете снова подключиться).

Вы можете использовать xdotool для отправки нажатий клавиш, если это действительно необходимо.

 xdotool search "Konsole" windowactivate --sync key --clearmodifiers ctrl+b 

Чтобы ответить на вопрос в названии.

Способ имитации нажатия клавиши в терминале осуществляется через TIOCSTI

Например:

 insert() { perl -le 'require "sys/ioctl.ph"; ioctl(STDIN, &TIOCSTI, $_) or die "$!\n" for split "", join " ", @ARGV' "$@" } 

Однако в случае tmux , если вы это сделаете:

 insert $'\02' 

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

Решение будет заключаться в следующем:

 insert $'\02' < "$(tmux lsc -F '#{client_tty}' -t '' | head -n 1)" 

Где:

 tmux lsc -F '#{client_tty}' -t '' 

сообщает о терминалах (терминалах), подключенных к текущему сеансу.

Но на современных Linux-системах это не сработает (вы получите сообщение об ошибке « Операция не допускается» ), поскольку по соображениям безопасности TIOCSTI ioctl может быть выдан только вашему управляющему терминалу (и управляющий терминал оболочки, интерпретирующий скрипт в области tmux будет tmux панели).

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

Вы можете легко закрыть tmux, выполнив:

 pkill -term tmux 

Это отправит tmux: «Пожалуйста, закройте себя»

Еще один полезный * NIX-инструмент для автоматизации взаимодействия с терминальными программами – Expect:

http://www.nist.gov/el/msid/expect.cfm