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:
(stty raw -echo; myscript) < /dev/ttyS0
Um zu füttern, was über RS232 empfangen wird myscript
.
echo test | ssh -tt host myscript
wäre myscript
stdin ein pty gerät (mit sshd
am anderen ende und irgendwann (über die ssh verbindung) kein terminal sondern ein rohr gespeist durch echo
)
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" ]
).
printf >&0 '\e[5n'
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
:
- Glücklicherweise war stdin in den meisten Fällen, in denen es sich nicht um ein Terminal handelt, im schreibgeschützten Modus geöffnet
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).
- Es ist schwer, die Antwort zuverlässig und tragbar zu lesen. Sie müssten die tty-Zeilendisziplin vorübergehend ändern und jeweils ein Byte lesen. Sie müssen auch eine Zeitüberschreitung festlegen, bei der Sie aufgeben, wenn die Antwort nicht angezeigt wird, und entscheiden, dass kein Terminal vorhanden ist. Wenn Sie in Betracht ziehen möchten, dass sich Personen über Satellitenverbindungen einwählen, bedeutet dies eine lange Zeitüberschreitung.
- Wenn Sie im Hintergrund von einem Terminal aus lesen, wird Ihr Skript mit einem SIGTTIN-Signal angehalten.