Juste une note supplémentaire en plus des bonnes réponses qui ont déjà été données. Notez que [ -t 0 ]
teste que le descripteur de fichier 0 est ouvert dans un fichier qui est un fichier de périphérique avec une discipline de ligne tty (généralement, cela se fait en vérifiant qu'un termio (s) inoffensif ioctl () réussit).
En outre, cela ne signifie pas nécessairement qu'il existe un terminal ou un émulateur de terminal (avec un véritable utilisateur tapant sur un clavier) à l'autre extrémité (bien que dans l'immense majorité des cas et probablement la plupart de ceux qui vous intéressent, c'est assez bon pour approximation).
Les dispositifs tty et pty peuvent également être utilisés pour le transfert de données ou comme mécanisme de communication interprocessus.
Par exemple, on pourrait faire:
(stty raw -echo; myscript) < /dev/ttyS0
Pour alimenter ce qui est reçu via RS232 myscript
.
echo test | ssh -tt host myscript
aurait myscript
stdin étant un périphérique pty (avec sshd
à l'autre extrémité, et finalement (à travers la connexion ssh) pas un terminal, mais un tuyau alimenté par echo
)
Pour vérifier en outre qu'il y a un terminal à l'autre extrémité de cette ligne RS232 ou pty, vous pouvez également vérifier qu'une $TERM
variable est définie et non vide ( [ -n "$TERM" ]
) et envoyer une séquence d'échappement de rapport d'état du périphérique sur ce fd et vérifier que vous recevez une réponse (en plus du [ -t 0 ]
et [ -n "$TERM" ]
).
printf >&0 '\e[5n'
Est répondu \e[0n
par la plupart des terminaux.
Maintenant, il y a plusieurs problèmes avec cela, donc je ne recommanderais pas de le faire, sauf dans le cas où vous voulez vérifier cela parce que vous voulez exécuter une application TUI visuelle (dans ce cas, vous feriez mieux d'utiliser des bibliothèques comme ncurses
, et au lieu du DSR, vous préférez envoyer une séquence d'échappement d'identification de périphérique pour interroger le type de terminal plus précisément que via $TERM
):
- Heureusement, dans la plupart des cas où stdin n'est pas un terminal, il aura été ouvert en mode lecture seule, ce qui entraînerait l'
printf
échec, mais si stdin est un périphérique tty ouvert en mode lecture + écriture, cela aura l'effet secondaire d'envoyer cette séquence à l'autre extrémité. Par exemple, dans notre exemple ssh ci-dessus, cela enverra en fait la séquence à un terminal (mais la réponse ne viendra pas sur stdin)
- Il est difficile de lire la réponse de manière fiable et portable. Vous devez modifier temporairement la discipline de ligne tty et lire un octet à la fois. Vous devrez également décider d'un délai d'expiration auquel, si la réponse n'est pas vue, vous abandonnez et décidez qu'il n'y a pas de terminal. Si vous voulez que les gens se connectent par satellite, cela signifie un long délai.
- La lecture à partir d'un terminal en arrière-plan suspendrait votre script avec un signal SIGTTIN.