Rileva se in esecuzione in un terminale virtuale?


12

Mi piacerebbe autologin per tty1il login e poi usare vlockper bloccarlo.

Come posso rilevare da Bash se il terminale corrente è un terminale virtuale della console (ad esempio tty1), in modo da poter inserire la vlocklinea .bash_profilee farla funzionare solo se eseguo l'accesso tty1?


1
Penso che dovresti cambiare il titolo in "Rileva se in esecuzione in un terminale virtuale" perché ttypuò essere frainteso per significare rilevare se la shell corrente è connessa a un dispositivo pseudo-terminale.
Joseph R.,

@JosephR. Grazie per averlo sottolineato, risolto
kiri il

@JosephR: brutta chiamata. Un dispositivo pseudo-terminale è p  ty, non tty. Per tornare al titolo originale.
Incnis Mrsi,

Risposte:


14

È possibile utilizzare ttyper ottenere il nome del terminale virtuale corrente, quindi testarlo con caseun'istruzione:

#!/bin/sh

case $(tty) in /dev/tty[0-9]*)
    vlock ;;
esac

Ancora meglio, invece di supporre che tutte le shell di login del terminale siano tty.
Kiri,

1
Non è necessario escludere X: se lo script è in esecuzione in un emulatore di terminale in X, ttymostrerà lo pseudoterminale dell'emulatore di terminale, non il terminale fisico su cui X è in esecuzione.
Gilles 'SO- smetti di essere malvagio' il

5

È generalmente sufficiente testare semplicemente STDIN (FD0):

[ -t 0 ] && echo "TTY available" || echo "No TTY available"

OK, perché .bash_profileviene chiamato sulle shell di accesso e il normale accesso alla GUI non ha un terminale, quindi l'unica shell di accesso al terminale dovrebbe essere una tty. Buona scoperta
kiri,

1
Se questo frammento fosse incluso in uno script più grande con lo stdin reindirizzato da un file, segnalerebbe che non è disponibile alcun TTY anche se eseguito da un VT.
Joseph R.,

1
@JosephR Corretto. Il valore è spesso con crono atlavori per evitare errori quando gli script assumono input interattivi.
JRFerguson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.