So senden Sie Standardeingaben durch eine Pipe

So senden Sie Standardeingaben durch eine Pipe

Ich muss direkt nach dem Programmstart eine Standardeingabe oder einen Tastencode senden.

Zum Beispiel

$ program | F3

Antwort1

Sie müssen definierenbeginntDort.

Sie können die Zeichenfolgen, die Ihr Terminal sendet, wenn Sie F3in den Eingabepuffer des Endgeräts drücken, einfügen.VorAusführen Ihres Programms mit TIOCSTI ioctl() auf einigen Systemen wie Linux:

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

Oder Sie können etwas wie verwenden, expectum Ihr Programm in einer gefälschten Terminalebene auszuführen, warten Sie, bis es eine Eingabeaufforderung ausgibt (oder einen Hinweis darauf, dass esgestartetbis zu dem Punkt, an dem Sie es erwarten) und senden Sie diese Ausgabe dann:

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

(hier wird eine >Eingabeaufforderung erwartet. Ersetzen Sie diese durch eine Zeichenfolge, die programausgegeben wird, wenn die Eingabe zum Lesen bereit ist.)

Sie können auch den Standardeingabeeingang durch eine Pipe ersetzen, aber wenn diese Anwendung Dinge wie F3Tastendrücke erwartet, handelt es sich höchstwahrscheinlich um eine interaktive Anwendung, und sie wird es wahrscheinlich nicht mögen, wenn der Standardeingabeeingang kein Terminal ist. Sie können es trotzdem jederzeit versuchen:

tput kf3 | program

Wenn jedoch programdie Ausgabe von gelesen wurde tput, wird das Dateiende angezeigt (es gibt nichts mehr zu lesen), was dazu führen kann, dass das Programm beendet wird. Mit:

{ tput kf3; cat; } | program

Wir senden die Ausgabe von kf3und catleiten dann alles, was Sie auf dem Terminal eingeben, an programweiter. Andererseits ist es unwahrscheinlich, dass es funktioniert, da die meisten programdas Terminal wahrscheinlich in einen Modus versetzen würden, in dem die Eingabe gesendet wird, sobald Sie tippen, und deaktivieren würden, echowas nicht mehr möglich ist, da seine Eingabe nicht das Terminal ist.

Sie könnten die gleiche Einstellung auch selbst vornehmen:

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

verwandte Informationen