Je veux effectuer une action uniquement si mon shell est "connecté" à un terminal, c'est-à-dire uniquement si mon entrée standard provient de l'entrée d'un terminal et que ma sortie standard (et l'erreur standard? Peut-être que cela n'a pas d'importance) est imprimée / répercutée sur un terminal.
Comment puis-je faire cela, sans compter /proc/self
directement sur les spécificités GNU / Linux (comme )?
command-line
terminal
einpoklum - réintégrer Monica
la source
la source
Réponses:
isatty
est une fonction pour vérifier cela , et le-t
drapeau de latest
commande le rend accessible à partir d'un script shell:Vous pouvez vérifier si FD 0 (entrée standard) est un ATS avec:
Vous pouvez faire de même pour les FD 1 et 2 pour vérifier les flux de sortie et d'erreur, ou tous:
La commande retourne 0 (réussit) si les descripteurs sont connectés à un terminal et est fausse sinon.
test
est également disponible comme[
commande pour un "test de parenthèse":est une façon idiomatique d'écrire ce conditionnel.
la source
J'imagine que c'est un doublon, mais je ne le trouve pas. Utilisation
et
pour tester respectivement si l'entrée et la sortie standard sont connectées à une borne.
man test
a les détails.la source
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:
Pour alimenter ce qui est reçu via RS232
myscript
.aurait
myscript
stdin étant un périphérique pty (avecsshd
à l'autre extrémité, et finalement (à travers la connexion ssh) pas un terminal, mais un tuyau alimenté parecho
)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" ]
).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
):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)la source