Как отправить стандартный ввод через трубу

Мне нужно отправить стандартный ввод или код клавиатуры сразу после запуска программы.

Например

$ program | F3 

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

Вы можете вставить последовательности символов, отправленных вашим терминалом, когда вы нажимаете F3 в буфер ввода терминала, прежде чем запускать свою программу с помощью TIOCSTI ioctl () в некоторых системах, таких как Linux:

 { perl -le 'require "sys/ioctl.ph"; ioctl(STDIN, &TIOCSTI, $_) for split "","@ARGV"' "$(tput kf3)" program } 

Или вы можете использовать что-то вроде expect запуска вашей программы на поддельном терминальном уровне, дождавшись, когда она выведет какое-то приглашение (или любое указание на то, что оно запущено до того момента, когда вы его ожидаете), и отправьте этот вывод:

 expect -c 'spawn -noecho program; expect {>} {send [exec tput kf3]}; interact' 

(здесь ожидание > подскажите, замените на какую-то строку, что program выдает, когда она готова прочитать ввод).

Вы также можете заменить его stdin на канал, но если это приложение ожидает таких вещей, как нажатие клавиш F3 , это скорее всего интерактивное приложение, поэтому, вероятно, это не понравится, когда это stdin не является терминалом. Вы всегда можете попробовать все равно:

 tput kf3 | program 

Однако после того, как program прочитает вывод tput , он увидит конец файла (ничего более не прочитанного), что может привести к его завершению. С:

 { tput kf3; cat; } | program 

Мы отправляем вывод kf3 а затем используем cat для пересылки всего, что вы вводите на терминал для program . Опять же, это вряд ли будет работать, поскольку, скорее всего, program поместит терминал в режим, когда ввод будет отправлен, как только вы напечатаете и отключите echo которое он больше не может выполнять, поскольку его вход не является терминалом.

Вы можете и сделать то же самое:

 saved_settings=$(stty -g) stty -icanon -echo min 1 time 0 { tput kf3; cat; } | program stty "$saved_settings"