Zaten verilen iyi cevapların üstüne sadece bir not. Not o [ -t 0 ]
dosya tanıtıcı 0 açık bir (zararsız termio (ler) ioctl () başarılı olduğunu kontrol ederek yapılır tipik) bir tty çizgi disiplin olan bir cihazdır dosyasıdır bir dosyadır testler.
Ayrıca, bu mutlaka diğer ucunda bir terminal veya terminal emülatörü (klavyeye yazarak gerçek bir kullanıcı ile) olduğu anlamına gelmez (çoğu durumda ve muhtemelen umursadığınızların çoğunda olsa da, bu yeterince iyi bir yaklaşım).
tty ve pty aygıtları ayrıca veri aktarımı için veya işlemler arası iletişim mekanizması olarak da kullanılabilir.
Örneğin, bir yapabilirdi:
(stty raw -echo; myscript) < /dev/ttyS0
RS232’den alınanları beslemek için myscript
.
echo test | ssh -tt host myscript
olurdu myscript
sitesindeki Stdin bir Pty cihaz olarak (ile sshd
() SSH bağlantısı üzerinden bir uç, sonunda, diğer ucunda, ve ancak ile beslenen bir boru echo
)
RS232 hattının veya ucunun diğer ucunda bir terminal olduğunu kontrol etmek için, bir $TERM
değişkenin ayarlanıp boş olmadığını ( [ -n "$TERM" ]
) kontrol edebilir ve bu fd üzerinden bir Aygıt Durum Raporu kaçış dizisi gönderebilir ve aldığınızı kontrol edebilirsiniz. (ek olarak bir cevap [ -t 0 ]
ve [ -n "$TERM" ]
).
printf >&0 '\e[5n'
\e[0n
Çoğu terminal tarafından bir ile yanıtlanır .
Ben bunu tavsiye değildir bu yüzden Şimdi bu bazı sorunlar vardır o kontrol etmek istediğiniz durumlar dışında bu sen bu durumda, sizin gibi kütüphaneleri kullanarak daha iyi olurdu (görsel TUI uygulamayı çalıştırmak istiyor çünkü ncurses
, ve DSR yerine, terminal türünü en doğru şekilde sorgulamak için bir cihaz tanımlama kaçış dizisi göndermeyi tercih edersiniz $TERM
):
- Neyse ki, stdin'in bir terminal olmadığı çoğu durumda, salt okunur modda açık olacaktı, bu
printf
başarısızlığa neden olacaktı , ancak stdin, okuma + yazma modunda açık olan ve yan etkiye sahip bir tty cihazı ise bu diziyi diğer uca gönderme. Örneğin, yukarıdaki ssh örneğimizde, bu aslında diziyi bir terminale gönderir (ancak cevap stdin'e gelmeyecektir)
- Cevabı güvenilir ve taşınabilir bir şekilde okumak zor. Tty line disiplinini geçici olarak değiştirmeniz ve bir seferde bir byte okumanız gerekir. Ayrıca, eğer cevap görünmezse, pes edip terminal olmadığına karar vermeniz gereken bir zaman aşımına karar vermeniz gerekecektir. İnsanları uydu üzerinden bağlantı üzerinden çevirmeyi düşünmek istiyorsanız, bu uzun bir zaman aşımı demektir.
- Arka planda iken bir terminalden okumak, scriptinizi bir SIGTTIN sinyali ile askıya alacaktır.