Quiero realizar alguna acción solo si mi shell está "conectado" a un terminal, es decir, solo si mi entrada estándar proviene de la entrada de un terminal y mi salida estándar (¿y error estándar? Quizás eso no importa) se imprime / repite una terminal
¿Cómo puedo hacer eso, sin depender /proc/self
directamente de los detalles de GNU / Linux (como )?
command-line
terminal
einpoklum - reinstalar a Monica
fuente
fuente
Respuestas:
isatty
es una función para verificar esto , y la-t
bandera deltest
comando lo hace accesible desde un script de shell:Puede verificar si FD 0 (entrada estándar) es un TTY con:
Puede hacer lo mismo para los FD 1 y 2 para verificar los flujos de salida y error, o todos ellos:
El comando devuelve 0 (tiene éxito) si los descriptores están conectados a una terminal y, de lo contrario, es falso.
test
también está disponible como[
comando para una "prueba de soporte":es una forma idiomática de escribir este condicional.
fuente
Me imagino que esto es un duplicado, pero no puedo encontrarlo. Utilizar
y
para probar respectivamente si la entrada y la salida estándar están conectadas a un terminal.
man test
Tiene los detalles.fuente
Solo una nota adicional sobre las buenas respuestas que ya se han dado. Tenga en cuenta que
[ -t 0 ]
prueba que el descriptor de archivo 0 está abierto, un archivo que es un archivo de dispositivo con una disciplina de línea tty (por lo general, esto se realiza al verificar que un termio (s) inofensivo ioctl () tenga éxito).Además, eso no significa necesariamente que haya un terminal o emulador de terminal (con un usuario real escribiendo en un teclado) en el otro extremo (aunque en la inmensa mayoría de los casos y probablemente en la mayoría de los que le interesan, eso es bastante bueno y aproximación).
Los dispositivos tty y pty también se pueden usar para la transferencia de datos o como un mecanismo de comunicación entre procesos.
Por ejemplo, uno podría hacer:
Para alimentar lo recibido a través de RS232 a
myscript
.tendría
myscript
stdin siendo un dispositivo pty (consshd
el otro extremo, y eventualmente (a través de la conexión ssh) no un terminal, sino una tubería alimentada porecho
)Para verificar aún más que hay un terminal en el otro extremo de esa línea o pty RS232, también puede verificar que una
$TERM
variable esté configurada y no vacía ([ -n "$TERM" ]
) y enviar una secuencia de escape del Informe de estado del dispositivo sobre ese fd y verificar que reciba una respuesta (además de la[ -t 0 ]
y[ -n "$TERM" ]
).Se responde con un
\e[0n
por la mayoría de las terminales.Ahora hay varios problemas con eso, por lo que no recomendaría hacerlo, excepto en el caso en que desee verificar eso porque desea ejecutar una aplicación visual TUI (en cuyo caso, sería mejor usar bibliotecas como
ncurses
, y en lugar del DSR, preferiría enviar una secuencia de escape de identificación del dispositivo para consultar el tipo de terminal con mayor precisión que a través de$TERM
):printf
fallara, pero en caso de que stdin sea un dispositivo tty abierto en modo de lectura + escritura, tendrá el efecto secundario de enviar esa secuencia al otro extremo. Por ejemplo, en nuestro ejemplo ssh anterior, eso enviará la secuencia a un terminal (pero la respuesta no llegará en stdin)fuente