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

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

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

Например

$ 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"

Связанный контент