Hanya catatan tambahan di atas jawaban baik yang telah diberikan. Catat itu[ -t 0 ]
pengujian bahwa deskriptor file 0 adalah file terbuka yang merupakan file perangkat dengan disiplin garis tty (biasanya, itu dilakukan dengan memeriksa bahwa termo (s) ioctl () yang berhasil () berhasil).
Juga, itu tidak selalu berarti ada terminal atau terminal emulator (dengan pengguna nyata mengetik pada keyboard) di ujung yang lain (meskipun dalam sebagian besar kasus dan mungkin sebagian besar yang Anda pedulikan, itu cukup bagus dan perkiraan).
perangkat tty dan pty juga dapat digunakan untuk transfer data atau sebagai mekanisme komunikasi antarproses.
Misalnya, seseorang dapat melakukan:
(stty raw -echo; myscript) < /dev/ttyS0
Untuk memberi makan apa yang diterima melalui RS232 myscript
.
echo test | ssh -tt host myscript
akan memiliki myscript
stdin menjadi perangkat pty (dengansshd
di ujung lainnya, dan akhirnya (di koneksi ssh) bukan terminal, tetapi pipa yang diumpankan oleh echo
)
Untuk memeriksa lebih lanjut bahwa ada terminal di ujung RS232 atau pty yang lain, Anda juga dapat memeriksa bahwa suatu $TERM
variabel disetel dan tidak kosong ( [ -n "$TERM" ]
) dan mengirimkan urutan keluar Laporan Status Perangkat melalui fd itu dan memeriksa bahwa Anda menerima tanggapan (selain [ -t 0 ]
dan [ -n "$TERM" ]
).
printf >&0 '\e[5n'
Dijawab dengan a \e[0n
oleh sebagian besar terminal.
Sekarang ada beberapa masalah dengan itu, jadi saya tidak akan merekomendasikan melakukan itu kecuali dalam kasus di mana Anda ingin memeriksa itu karena Anda ingin menjalankan aplikasi TUI visual (dalam hal ini, Anda akan lebih baik menggunakan perpustakaan seperti ncurses
, dan alih-alih DSR, Anda lebih suka mengirim urutan pelarian identifikasi perangkat untuk menanyakan jenis terminal lebih tepatnya daripada melalui $TERM
):
- Untungnya, dalam kebanyakan kasus di mana stdin bukan terminal, itu akan terbuka dalam mode read-only yang akan menyebabkan itu
printf
gagal, tetapi dalam kasus stdin adalah perangkat tty yang terbuka dalam mode baca + tulis, yang akan memiliki efek samping mengirim urutan itu ke ujung yang lain. Sebagai contoh dalam contoh ssh kami di atas, itu sebenarnya akan mengirim urutan ke terminal (tetapi jawabannya tidak akan datang pada stdin)
- Sulit untuk membaca jawabannya dengan andal dan mudah dibawa. Anda perlu mengubah disiplin tty line sementara dan membaca satu byte pada satu waktu. Anda juga harus memutuskan batas waktu di mana jika balasan tidak terlihat, Anda menyerah dan memutuskan tidak ada terminal. Jika Anda ingin mempertimbangkan orang-orang memutar melalui koneksi satelit, itu berarti waktu tunggu yang lama.
- Membaca dari terminal ketika di latar belakang akan menangguhkan skrip Anda dengan sinyal SIGTTIN.