Shell-Skript reagiert auf Tastendruck

8

Ich habe ein Shell-Skript, das im Wesentlichen so etwas wie

sagt %Vor%

Das ist alles gut und gut, aber mir ist gerade klar geworden, dass das Drücken von ENTER in dieser Situation ein ernstes Problem darstellt. Was ich brauche ist, dass das Skript reagiert, wenn eine Taste gedrückt wird, ohne Enter zu drücken.

Gibt es eine Möglichkeit, diese Funktionalität in einem Shell-Skript zu erreichen?

    
j0h 03.06.2014, 13:07
quelle

5 Antworten

14
%Vor%

Erwarte nur einen Buchstaben (und warte nicht auf das Einreichen) und sei still (schreibe diesen Brief nicht zurück).

    
pacholik 03.06.2014, 13:12
quelle
5

Also ist das letzte Arbeits-Snippet das folgende:

%Vor%     
Donald Derek 02.06.2015 18:25
quelle
3

Eine andere Art, es auf nicht blockierende Weise zu tun (nicht sicher, ob es das ist, was Sie wollen). Sie können stty verwenden, um die minimale Lesezeit auf 0 zu setzen. (Etwas gefährlich, wenn sty sane nicht verwendet wird)

%Vor%

Dann mach einfach deine Schleife wie normal. Keine Notwendigkeit für -r.

%Vor%

WICHTIG! Wenn Sie mit der Nichtblockierung fertig sind, müssen Sie daran denken, stty mit

wieder auf normal zu stellen %Vor%

Wenn Sie nicht in der Lage sind, etwas auf dem Terminal zu sehen, und es scheint zu hängen.

Sie werden wahrscheinlich eine Falle für ctrl-C einfügen wollen, so als ob das Skript beendet wäre, bevor Sie stty wieder auf normal stellen. Sie werden nichts sehen können, was Sie tippen und es wird angezeigt, dass das Terminal eingefroren ist.

%Vor%

P.S Sie können auch eine Schlafanweisung in Ihr Skript schreiben, damit Sie nicht Ihre gesamte CPU verbrauchen, da diese nur so schnell wie möglich läuft.

%Vor%

P.S.S. Es scheint, dass das Problem mit dem Hängen nur dann war, wenn ich -echo benutzt habe, wie ich es gewohnt bin, so dass es wahrscheinlich nicht gebraucht wird. Ich werde es aber in der Antwort lassen, da es immer noch gut ist, stty auf seinen Standardwert zurückzusetzen, um zukünftige Probleme zu vermeiden. Sie können -echo verwenden, wenn Sie nicht möchten, dass Ihre Eingabe auf dem Bildschirm erscheint.

    
user3442743 03.06.2014 13:52
quelle
2

Sie können diese Funktion getkey verwenden:

%Vor%

In den Terminaleinstellungen wird vorübergehend der "kanonische Modus" deaktiviert ( stty -icanon ) gibt dann die Eingabe von "head" (eine eingebaute Shell) mit der Option -c1 zurück, die ein Byte der Standardeingabe zurückgibt. Wenn Sie das "stty -icanon" nicht einschließen, dann gibt das Skript den Buchstaben der gedrückten Taste wieder und wartet dann auf RETURN (nicht was wir wollen). Sowohl "head" als auch "stty" sind Shell-eingebaute Befehle. Es ist wichtig, die alten Terminaleinstellungen nach dem Tastendruck zu speichern und wiederherzustellen.

Dann kann getkey () in Kombination mit einer " case / esac " -Anweisung zur interaktiven Ein-Schlüssel-Auswahl aus einer Liste von Einträgen verwendet werden: Beispiel:

%Vor%

Diese getkey()/case-esac -Kombination kann verwendet werden, um viele Shell-Skripte interaktiv zu machen. Ich hoffe, das hilft.

    
Ian Forsyth 17.12.2017 23:39
quelle
1

Ich habe eine Möglichkeit, dies in meinem Projekt zu tun: Ссылка

Es liest immer einen Schlüssel, wenn key_readonce aufgerufen wird. Für spezielle Schlüssel würde eine spezielle Parsing-Schleife laufen, um sie auch analysieren zu können.

Dies ist der entscheidende Teil davon:

%Vor%     
konsolebox 03.06.2014 13:19
quelle

Tags und Links