Мне нужно отправить стандартный ввод или код клавиши сразу после запуска программы.
Например
$ program | F3
решение1
Вам нужно будет определитьначинаетсятам.
Вы можете вставлять последовательности символов, отправленные вашим терминалом, при нажатии 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"