Ich möchte nur dann eine Aktion ausführen, wenn meine Shell mit einem Terminal "verbunden" ist, dh nur dann, wenn meine Standardeingabe von der Eingabe eines Terminals stammt und meine Standardausgabe (und mein Standardfehler? Vielleicht spielt das keine Rolle) gedruckt wird ein Terminal.
Wie kann ich das tun, ohne mich /proc/self
direkt auf GNU / Linux-Besonderheiten (wie ) zu verlassen?
command-line
terminal
einpoklum - Monica wieder einsetzen
quelle
quelle
Antworten:
isatty
ist eine Funktion, um dies zu überprüfen , und das-t
Flag destest
Befehls macht dies über ein Shell-Skript zugänglich:Sie können überprüfen, ob FD 0 (Standardeingabe) ein TTY ist:
Sie können das Gleiche für FDs 1 und 2 tun, um die Ausgabe- und Fehlerströme oder alle zu überprüfen:
Der Befehl gibt 0 zurück (erfolgreich), wenn die Deskriptoren an ein Terminal angeschlossen sind, und ist ansonsten falsch.
test
steht auch als[
Befehl für einen "Bracket-Test" zur Verfügung:ist eine idiomatische Möglichkeit, diese Bedingung zu schreiben.
quelle
Ich stelle mir vor, dass dies ein Duplikat ist, aber ich kann es nicht finden. Verwenden
und
um jeweils zu testen, ob Standardeingang und -ausgang an eine Klemme angeschlossen sind.
man test
hat die Details.quelle
Nur eine zusätzliche Anmerkung zu den bereits gegebenen guten Antworten. Beachten Sie, dass
[ -t 0 ]
überprüft wird, ob der Dateideskriptor 0 geöffnet ist. Dies ist eine Gerätedatei mit einer strengen Disziplin (in der Regel wird überprüft, ob ein harmloser Termio (s) ioctl () erfolgreich ist).Das bedeutet auch nicht, dass es am anderen Ende ein Terminal oder einen Terminal-Emulator gibt (mit einem echten Benutzer, der auf einer Tastatur tippt) (obwohl dies in den meisten Fällen und wahrscheinlich auch in den meisten Fällen, die Sie interessieren, gut genug ist) Annäherung).
tty- und pty-Geräte können auch zur Datenübertragung oder als prozessübergreifender Kommunikationsmechanismus verwendet werden.
Zum Beispiel könnte man tun:
Um zu füttern, was über RS232 empfangen wird
myscript
.wäre
myscript
stdin ein pty gerät (mitsshd
am anderen ende und irgendwann (über die ssh verbindung) kein terminal sondern ein rohr gespeist durchecho
)Um weiter zu überprüfen, ob sich am anderen Ende der RS232-Leitung oder des Pty ein Terminal befindet, können Sie auch überprüfen, ob eine
$TERM
Variable gesetzt und nicht leer ist ([ -n "$TERM" ]
), und eine Escape-Sequenz für den Gerätestatusbericht über dieses FD senden und den Empfang überprüfen eine Antwort (zusätzlich zu[ -t 0 ]
und[ -n "$TERM" ]
).Wird
\e[0n
von den meisten Terminals mit einem beantwortet .Nun gibt es mehrere Probleme mit diesem, so würde ich nicht tun , dass außer im Fall empfehlen , wo Sie überprüfen möchten, weil Sie eine visuelle TUI Anwendung ausgeführt werden soll (in diesem Fall, würden Sie besser dran , Bibliotheken wie
ncurses
, und anstatt des DSR möchten Sie lieber eine Geräteidentifikations-Escape-Sequenz senden, um den Terminaltyp genauer als über abzufragen$TERM
:printf
, was zu einem Fehlschlagen führen würde. Wenn stdin jedoch ein im Lese- / Schreibmodus geöffnetes tty-Gerät ist, hat dies den Nebeneffekt diese Sequenz an das andere Ende zu senden. Beispiel: In unserem obigen SSH-Beispiel wird die Sequenz tatsächlich an ein Terminal gesendet (aber die Antwort kommt nicht auf stdin).quelle