Detectar se estiver executando em um terminal virtual?

12

Eu gostaria de autologin para tty1no login e então usar vlockpara travá-lo.

Como posso detectar no Bash se o terminal atual é um terminal virtual do console (por exemplo tty1), para que eu possa colocar a vlocklinha .bash_profilee executá-la somente se estiver efetuando login tty1?

kiri
fonte
1
Eu acho que você deve alterar o título para "Detectar se estiver executando em um terminal virtual" porque ttypode ser mal interpretado como detectar se o shell atual está conectado a um dispositivo pseudo-terminal.
Joseph R.
@JosephR. Obrigado por apontar isso, fixa
kiri
@ JosephphR: chamada ruim. Um dispositivo pseudo-terminal é p  ty, não tty. Prestes a reverter para o título original.
Incnis MRSI
Relacionados: unix.stackexchange.com/questions/16387/...
Incnis MRSI

Respostas:

14

Você pode usar ttypara obter o nome do terminal virtual atual e testá-lo com uma caseinstrução:

#!/bin/sh

case $(tty) in /dev/tty[0-9]*)
    vlock ;;
esac
Gilles 'SO- parar de ser mau'
fonte
Melhor ainda, em vez de assumir que todos os shells de login do terminal são ttys.
quer
1
Não é necessário excluir o X: se o script estiver sendo executado em um emulador de terminal no X, ttymostrará o pseudoterminal do emulador de terminal, não o terminal físico no qual o X está sendo executado.
Gilles 'SO- stop be evil'
5

Geralmente é suficiente simplesmente testar STDIN (FD0):

[ -t 0 ] && echo "TTY available" || echo "No TTY available"
JRFerguson
fonte
OK, porque .bash_profileé chamado nos shells de login e o login normal da GUI não possui um terminal, portanto, o único shell de login do terminal deve ser um tty. Boa localização
kiri
1
Se esse trecho fosse incluído em um script maior que tivesse seu stdin redirecionado de um arquivo, ele relataria que nenhum TTY está disponível, mesmo que seja executado a partir de um VT.
Joseph R.
1
@JosephR Correct. O valor geralmente é com cronou atjobs para evitar falhas quando os scripts assumem entrada interativa.
JRFerguson