Supondo que você quer dizer terminais virtuais do Linux, existe o VT_OPENQRY
ioctl()
para obter o terminal virtual gratuito primeiro (como usado por openvt
, por exemplo), mas você precisaria de um arquivo descritor para um dispositivo de console para isso já. Alternativamente, você poderia fazer (como root):
comm -23 <(printf '%s\n' /dev/tty[1-9]*) \
<(lsof -Fn /dev/tty[1-9]* | sed -n 's/^n//p' | sort -u)
Que você poderia generalizar para outros tipos de dispositivos tty, como os seriais.
Isso seria mais robusto na medida em que consideraria apenas esses caminhos de dispositivos e não teria problemas com nomes de arquivos com operadores regexp ou novas linhas, mas como em sua abordagem, isso não funcionaria corretamente se os dispositivos tty fossem abertos por qualquer outro caminho que os /dev/ttyxx
.
Outra abordagem seria confiar nos números dos dispositivos em vez de no caminho canônico .
Com o GNU stat
:
find -L /proc/[1-9]*/fd/. ! -name . -prune -type c -exec stat -Lc '%t %T' {} + |
awk '$1 == "4" {seen[$2]}
END {
for (i=1; i<=63; i++)
if (!(sprintf("%x", i) in seen))
print "/dev/tty" i
}'