Mendeteksi jika berjalan di terminal virtual?

12

Saya ingin autologin ke tty1pada login dan kemudian menggunakan vlockuntuk menguncinya.

Bagaimana saya bisa mendeteksi dari Bash jika terminal saat ini adalah terminal virtual konsol (mis. tty1), Sehingga saya bisa meletakkan vlockgaris .bash_profiledan menjalankannya hanya jika masuk melalui tty1?

kiri
sumber
1
Saya pikir Anda harus mengubah judul menjadi "Deteksi jika berjalan di terminal virtual" karena ttydapat disalahpahami berarti mendeteksi jika shell saat ini terhubung ke perangkat pseudo-terminal.
Joseph R.
@ JosephephR. Terima kasih telah menunjukkannya, diperbaiki
kiri
@ JosephephR: panggilan buruk. Perangkat pseudo-terminal adalah p  ty, bukan tty. Akan kembali ke judul asli.
Incnis Mrsi

Jawaban:

14

Anda dapat menggunakan ttyuntuk mendapatkan nama terminal virtual saat ini, kemudian mengujinya dengan casepernyataan:

#!/bin/sh

case $(tty) in /dev/tty[0-9]*)
    vlock ;;
esac
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Bahkan lebih baik, daripada mengasumsikan semua shell login terminal adalah ttys.
kiri
1
Tidak perlu mengecualikan X: jika skrip berjalan di emulator terminal di bawah X, ttyakan menunjukkan pseudoterminal terminal emulator, bukan terminal fisik yang dijalankan X.
Gilles 'SANGAT berhenti menjadi jahat'
5

Secara umum cukup dengan hanya menguji STDIN (FD0):

[ -t 0 ] && echo "TTY available" || echo "No TTY available"
JRFerguson
sumber
OK, karena .bash_profiledipanggil pada shell login dan GUI login normal tidak memiliki terminal, jadi satu-satunya shell login terminal adalah tty. Good find
kiri
1
Jika potongan ini dimasukkan dalam skrip yang lebih besar yang stdinnya diarahkan dari file, itu akan melaporkan bahwa tidak ada TTY tersedia bahkan jika dijalankan dari VT.
Joseph R.
1
@ Joseph benar. Nilai sering dengan cronatau atpekerjaan untuk menghindari kegagalan ketika skrip menerima input interaktif.
JRFerguson