В режиме ввода tty по умолчанию используется линейный ввод, поэтому вы ничего не увидите, пока не выведете
перевод строки.
Я предлагаю использовать strace для отладки такого поведения. Таким образом, вы можете увидеть системный вызов и, например, посмотреть, заблокированы ли вы при чтении, ожидая большего ввода и т. Д.
Когда вы не используете '</ dev / tty0', это работает, верно?
По сути, вы хотите повторить характер. Если вы делаете следующее: </p>
shell = PTY.spawn 'env TERM=ansi COLUMNS=63 LINES=21 sh -i'
shell[1].puts("cat\nasdf")
s = shell[0].read(16)
puts s
И вы выполняете процесс, используя:
strace -ff -o test.log -e trace=read,write ./testr.rb
В выводе вы увидите asdf дважды.
Но если вы посмотрите на код strace, то увидите, что подпроцесс cat записывает asdf только один раз, а его родительский процесс, то есть оболочка, никогда не записывает asdf.
Так почему же есть два вывода asdf? Потому что слой tty делает локальное эхо. Так что, когда вы вводите что-то в shell, оно отправляется на pty и драйвер pty:
- Запишите это на рабскую сторону псевдотерминала
- Отдает его на главную сторону.
Так что же происходит, когда вы делаете sh -i </dev/tty0
? Символы, поступающие с клавиатуры, выводятся в / dev / tty0, а не на вывод оболочки.
Оболочка не генерирует эхо, слой tty есть, поэтому вы хотите выполнить следующее (примите это за псевдокод, я не компетентен в ruby):
# Emulate terminal behavior with pty
shell = PTY.spawn 'env TERM=ansi COLUMNS=63 LINES=21 sh -i'
keyboard = open(/dev/tty0)
input = keyboard.read()
shell[1].write(input)
puts shell[0].read(...)
Теперь, если вам нужно что-то интерактивное, вам нужно будет настроить / dev / tty0 в необработанном режиме и использовать команду select, чтобы узнать, когда вы можете читать без блокировки и когда есть данные, доступные для вывода.
Для настройки tty в режиме raw вы можете попробовать использовать
stty -F /dev/tty0 -cooked