Saya ingin melakukan beberapa tindakan hanya jika shell saya "terhubung" ke terminal, yaitu hanya jika input standar saya berasal dari input terminal dan output standar saya (dan kesalahan standar? Mungkin itu tidak masalah) akan dicetak / digema ke terminal.
Bagaimana saya bisa melakukan itu, tanpa mengandalkan spesifik GNU / Linux (seperti /proc/self
) secara langsung?
command-line
terminal
einpoklum - mengembalikan Monica
sumber
sumber
Jawaban:
isatty
adalah fungsi untuk memeriksa ini , dan-t
flagtest
perintah membuatnya dapat diakses dari skrip shell:Anda dapat memeriksa apakah FD 0 (input standar) adalah TTY dengan:
Anda dapat melakukan hal yang sama untuk FD 1 dan 2 untuk memeriksa aliran output dan kesalahan, atau semuanya:
Perintah mengembalikan 0 (berhasil) jika deskriptor dihubungkan ke terminal, dan salah jika tidak.
test
juga tersedia sebagai[
perintah untuk "uji kurung":adalah cara idiomatis untuk menulis persyaratan ini.
sumber
Saya membayangkan ini adalah duplikat, tetapi saya tidak dapat menemukannya. Menggunakan
dan
untuk menguji masing-masing apakah input dan output standar terhubung ke terminal.
man test
memiliki detail.sumber
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:
Untuk memberi makan apa yang diterima melalui RS232
myscript
.akan memiliki
myscript
stdin menjadi perangkat pty (dengansshd
di ujung lainnya, dan akhirnya (di koneksi ssh) bukan terminal, tetapi pipa yang diumpankan olehecho
)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" ]
).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
):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)sumber