¿Detectar si se ejecuta en una terminal virtual?

12

Me gustaría iniciar sesión automáticamente al tty1iniciar sesión y luego usarlo vlockpara bloquearlo.

¿Cómo puedo detectar desde Bash si el terminal actual es un terminal virtual de consola (p tty1. Ej. ), Para poder poner la vlocklínea .bash_profiley hacer que se ejecute solo si me conecto tty1?

kiri
fuente
1
Creo que debería cambiar el título a "Detectar si se ejecuta en un terminal virtual" porque ttypuede malinterpretarse para significar detectar si el shell actual está conectado a un dispositivo pseudo-terminal.
Joseph R.
@JosephR. Gracias por señalarlo, arreglado
kiri
@JosephR: mala llamada. Un dispositivo pseudo-terminal es p  ty, no tty. A punto de volver al título original.
Incnis Mrsi

Respuestas:

14

Puede usar ttypara obtener el nombre del terminal virtual actual y luego probarlo con una casedeclaración:

#!/bin/sh

case $(tty) in /dev/tty[0-9]*)
    vlock ;;
esac
Gilles 'SO- deja de ser malvado'
fuente
Aún mejor, en lugar de asumir que todos los shells de inicio de sesión de terminal son ttys.
kiri
1
No es necesario excluir X: si el script se ejecuta en un emulador de terminal bajo X, ttymostrará el pseudoterminal del emulador de terminal, no el terminal físico en el que X se está ejecutando.
Gilles 'SO- deja de ser malvado'
5

Generalmente es suficiente simplemente probar STDIN (FD0):

[ -t 0 ] && echo "TTY available" || echo "No TTY available"
JRFerguson
fuente
OK, porque .bash_profilese llama en los shells de inicio de sesión y el inicio de sesión normal de la GUI no tiene un terminal, por lo que el único shell de inicio de sesión del terminal debe ser un tty. Buen hallazgo
kiri
1
Si este fragmento se incluyera en un script más grande que tuviera su stdin redirigido desde un archivo, informaría que no hay TTY disponible incluso si se ejecuta desde un VT.
Joseph R.
1
@JosephR Correcto. El valor es a menudo con crono attrabajos para evitar fallas cuando los scripts asumen entradas interactivas.
JRFerguson