Wie schließe ich "weniger" von außen, ohne dass mein Terminal in Unordnung gerät?

366
Hubro

Ich schreibe ein Dienstprogramm, das automatisch lessals Unterbefehl mit seiner Ausgabe gestartet wird. Beim Schreiben der Ausgabe tritt manchmal ein Fehler auf, und ich möchte lessden Fehler automatisch schließen und den Fehler normal anzeigen. Unabhängig davon, welches Signal ich versuche, an den lessProzess zu senden, wird es entweder ignoriert oder "unrein" geschlossen, dh mein Terminal bleibt unbrauchbar. (Ich kann das Terminal jedoch durch Drücken von Ctrl+ Ckorrigieren und den Befehl (blind) schreiben stty sane.)

Ich habe alle „üblichen“ Signale versucht: SIGINT, SIGTERM, SIGQUITund SIGKILL. Die letzte funktionierte offensichtlich nicht, aber ich habe es trotzdem versucht. Ich kann nichts über Signale in den Manpages finden less.

Kann man lessvon außen sauber abfahren?

4
Sie können ein Fifo als Eingabe für weniger verwenden, um ein "q" zu schreiben, wenn Sie den Vorgang beenden möchten. Julian F. Weinert vor 7 Jahren 0
@ JulianF.Weinert Aber ich benutze schon das Stdin von less, um ihm Text einzugeben. Ich bin mir nicht sicher, wie viel weniger Eingaben von meiner Tastatur abgerufen werden, wenn sein Standardwert für etwas anderes verwendet wird ... Hubro vor 7 Jahren 0
Was ist, wenn Sie ein "q" füttern? Julian F. Weinert vor 7 Jahren 0

1 Antwort auf die Frage

1
meuh

Abhängig von den Jobsteuerungseinstellungen können Sie möglicherweise zuerst ein Programm kill -tstpan das lessProgramm ausgeben und dann ein kill -9. Das erste Signal wird von lesstty abgefangen und bewirkt, dass tty wiederhergestellt wird, bevor das Signal wieder an sich selbst ausgegeben wird, wodurch es normalerweise im Hintergrund pausiert. Wenn der Standard-Handler für SIGTSTP diese ignoriert, lesswird er jedoch einfach fortgesetzt und das Terminal erneut auf RAW gesetzt.

Sie können in Betracht ziehen, das Programm lessin einem separaten Terminal auszuführen, z. B. xterm -e sh -c "less /myfile"können Sie kill -9dies ohne Abklärung durchführen.

Sie können auch ausführen less --quit-on-intr(oder -K) und dann wird SIGINT sauber beendet. Dies wirkt sich jedoch auch auf Ihre normale Interaktion mit dem Ausgabestrom aus.

Ansonsten einfach stty sane; tput resetnach dem Killbefehl setzen.