Мне удалось это сделать
echo -n " команда "> / dev / tty1
Появляются буквы, и курсор перемещается, но они «призраки» - если вы нажмете Enter, ничего не произойдет (они не в stdin).
Редактировать:
В середине скриншота ниже вы видите, почему я вижу использование этого. (Строка с красной надписью, прямо под строкой с желтой надписью.) Как и сейчас, вы на самом деле не «редактируете» текст заметки; Вас просто попросят написать новый текст, который заменит текст заметки, которую вы (не совсем) редактируете. Таким образом, я подумал, что это можно исправить, просто вставив старый текст в tty: если пользователь нажимает ввод, никакие изменения не производятся. (Эта программа на Perl / MySQL, но я подумал, что было бы интереснее попросить общее решение, чем «как мне это сделать на Perl».)
Изменить 2:
Вот код Perl, который использует код C ниже (работает точно так, как задумано), а также новый снимок экрана - надеюсь, это прояснит все без сомнения :) Опять же, посмотрите на середину снимка экрана, где производится редактирование к тексту заметки - на этот раз старый текст есть, например, если вы просто хотите исправить опечатку, вам не придется перепечатывать весь текст заметки.
my $edit_note_text = $edit_note_data[2];
print BOLD, RED, " new text: ", RESET;
system("writevt /dev/tty \"$edit_note_text\"");
my $new_text = <$in>;
$new_text = fix_input($new_text);
my $set_text = "UPDATE notes SET note = \"$new_text\" WHERE id = $edit_note_id";
$db->do($set_text);
Ответы:
Я только что нашел небольшую C-программу под названием,
writevt
которая делает свое дело. Получить исходный код здесь . Для компиляцииgcc
просто удалите следующие строки:Обновление . Команда теперь является частью консольных инструментов , поэтому доступна в более поздних системах, если в вашем дистрибутиве вместо консольных инструментов не используется kbd , и в этом случае вы можете скомпилировать ее из исходного кода. (гораздо более свежая версия, никаких изменений не требуется).
Использование:
Обратите внимание, что по какой-то причине вы должны использовать
'\r'
(или'\x0D'
) вместо'\n'
(или'\x0A'
) для отправки возврата.источник
progname
и_
и закомментировать несколько вызовов функцийmain()
_()
Функция обычно является признаком использования gettext . Кажется, немного излишним для такого простого фрагмента демонстрационного кода, но я полагаю, это не повредит.writevt.c
здесь (на github.com/ grawity ) ; Похоже, это по сути та же самая программа.Терминал удваивается как две вещи: устройство ввода (например, клавиатура) и устройство отображения (например, монитор). Когда вы читаете с терминала, вы получаете то, что исходит от устройства ввода. Когда вы пишете в терминал, данные поступают на устройство отображения.
Не существует общего способа принудительного ввода данных в терминал. В этом нет необходимости. Если вам нужно взаимодействовать с программой, для которой требуется терминал, используйте специальный эмулятор терминала, такой как Expect или Empty , или программируемую оболочку терминала, такую как Screen или Tmux . Вы можете принудительно ввести ввод в консоль Linux с помощью ioctl . Вы можете принудительно ввести ввод в эмулятор терминала X11 с помощью таких инструментов, как xdotool или xmacro .
источник
screen
илиtmux
и используйте ихstuff
(screen) илиsend-key
(tmux) команду или их функцию вставки буфера.screen
илиtmux
)?screen -X stuff 'note version one'
.По крайней мере, Linux и BSD имеют ioctl TIOCSTI для отправки символов обратно в буфер ввода терминала (до ограничения [4096 символов в Linux]):
Скомпилируйте и назовите это так:
отодвинуть символы обратно на какой-нибудь tty.
И в Perl:
Изменить : теперь я понимаю, что это тот же ioctl, что и в решении writevt . Комментарий и название команды вводят в заблуждение, поскольку TIOCSTI работает для любого терминала, а не только для VT.
источник
У меня есть более полная демонстрация по переполнению стека .
В Python вы можете сделать:
Это предполагает простое
"command"
значениеls -la
и использование пути tty, указанного в OP.источник