Chỉ cần một ghi chú thêm trên đầu câu trả lời tốt đã được đưa ra. Lưu ý rằng[ -t 0 ]
các kiểm tra rằng bộ mô tả tệp 0 đang mở một tệp là tệp thiết bị có kỷ luật dòng tty (thông thường, điều đó được thực hiện bằng cách kiểm tra xem một thuật ngữ vô hại ioctl () thành công).
Ngoài ra, điều đó không nhất thiết có nghĩa là có một trình giả lập thiết bị đầu cuối hoặc thiết bị đầu cuối (với một người dùng thực sự gõ trên bàn phím) ở đầu bên kia (mặc dù trong phần lớn các trường hợp và có lẽ hầu hết những người bạn quan tâm, điều đó đủ tốt xấp xỉ).
Các thiết bị tty và pty cũng có thể được sử dụng để truyền dữ liệu hoặc như một cơ chế giao tiếp giữa các quá trình.
Chẳng hạn, người ta có thể làm:
(stty raw -echo; myscript) < /dev/ttyS0
Để cung cấp những gì nhận được qua RS232 đến myscript
.
echo test | ssh -tt host myscript
sẽ có myscript
stdin là một thiết bị pty ( sshd
ở đầu kia, và cuối cùng (qua kết nối ssh) không phải là một thiết bị đầu cuối, mà là một đường ống được cung cấp bởiecho
)
Để kiểm tra thêm rằng có một thiết bị đầu cuối ở đầu kia của dòng RS232 hoặc pty đó không, bạn cũng có thể kiểm tra xem một $TERM
biến được đặt và không trống ( [ -n "$TERM" ]
) và gửi chuỗi thoát Báo cáo trạng thái thiết bị qua fd đó và kiểm tra xem bạn có nhận được không một phản ứng (ngoài [ -t 0 ]
và [ -n "$TERM" ]
).
printf >&0 '\e[5n'
Được trả lời với một \e[0n
bởi hầu hết các thiết bị đầu cuối.
Bây giờ có một số vấn đề với điều đó, vì vậy tôi không khuyên bạn nên làm điều đó ngoại trừ trong trường hợp bạn muốn kiểm tra xem vì bạn muốn chạy ứng dụng TUI trực quan (trong trường hợp đó, bạn nên sử dụng các thư viện như ncurses
, và thay vì DSR, bạn muốn gửi một chuỗi thoát nhận dạng thiết bị để truy vấn loại thiết bị đầu cuối chính xác hơn thông qua $TERM
):
- Rất may, trong hầu hết các trường hợp stdin không phải là thiết bị đầu cuối, nó sẽ được mở ở chế độ chỉ đọc, điều này sẽ gây ra điều đó
printf
không thành công, nhưng trong trường hợp stdin là một thiết bị tty mở ở chế độ đọc + ghi, sẽ có tác dụng phụ gửi chuỗi đó đến đầu kia. Ví dụ trong ví dụ ssh của chúng tôi ở trên, điều đó thực sự sẽ gửi chuỗi đến một thiết bị đầu cuối (nhưng câu trả lời sẽ không xuất hiện trên stdin)
- Thật khó để đọc câu trả lời một cách đáng tin cậy và hợp lý. Bạn cần tạm thời thay đổi kỷ luật dòng tty và đọc từng byte một. Bạn cũng cần quyết định thời gian chờ mà nếu không thấy câu trả lời, bạn từ bỏ và quyết định không có thiết bị đầu cuối. Nếu bạn muốn xem xét mọi người quay số qua các kết nối vệ tinh, điều đó có nghĩa là thời gian chờ lâu.
- Đọc từ thiết bị đầu cuối khi ở chế độ nền sẽ tạm dừng tập lệnh của bạn với tín hiệu SIGTTIN.