Intereting Posts
Можно ли наложить какой-то мягкий предел на потребление памяти процессами? Использование TCP_DEFER_ACCEPT в реальном мире? Какие файлы конфигурации переопределяют / etc / default / locale? Firefox не может получить доступ к доменам, определенным в / etc / hosts, если Network Manager отключен от сети Как опросить для Xvfb, чтобы быть готовым? Какая графическая карта «лучше всего» в 3D на Linux? Минимальная Linux для виртуальной сетевой лаборатории не может sftp: возвращает 128 "является сервером sftp, запущенным" Интерактивная оболочка со средой, идентичной cron Можно ли использовать `type`, чтобы проверить, является ли произвольное имя допустимым именем команды? Почему установка переменной перед командой legal в bash? Как я могу заполнить свободное место на диске нулями, чтобы мой хост виртуализации мог перестать думать, что он используется? Список программного обеспечения, предустановленного в Linux Mint? Существует ли обратная команда разреза? Рассчитать средние значения за каждый день за несколько лет

Есть ли способ заставить скрипт 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