Làm cách nào để kiểm tra xem vỏ của tôi có chạy trong thiết bị đầu cuối không?


22

Tôi chỉ muốn thực hiện một số hành động nếu vỏ của tôi được "kết nối" với thiết bị đầu cuối, tức là chỉ khi đầu vào tiêu chuẩn của tôi đến từ đầu vào của thiết bị đầu cuối và đầu ra tiêu chuẩn của tôi (và lỗi tiêu chuẩn? Có lẽ điều đó không quan trọng) được in / lặp lại một thiết bị đầu cuối.

Làm thế nào tôi có thể làm điều đó, mà không cần dựa vào các chi tiết cụ thể của GNU / Linux (như /proc/self)?


Câu trả lời:


33

isattylà một chức năng để kiểm tra điều này-tcờ của testlệnh làm cho nó có thể truy cập được từ tập lệnh shell:

-t file_descriptor

Đúng nếu số mô tả tệp file_descriptor đang mở và được liên kết với một thiết bị đầu cuối. Sai nếu file_descriptor không phải là số mô tả tệp hợp lệ hoặc nếu số mô tả tệp file_descriptor không mở hoặc nếu nó mở nhưng không được liên kết với thiết bị đầu cuối.

Bạn có thể kiểm tra xem FD 0 (đầu vào tiêu chuẩn) có phải là TTY không:

test -t 0

Bạn có thể làm tương tự cho FD 1 và 2 để kiểm tra luồng đầu ra và lỗi hoặc tất cả chúng:

test -t 0 -a -t 1 -a -t 2

Lệnh trả về 0 (thành công) nếu các bộ mô tả được nối với một thiết bị đầu cuối và ngược lại là sai.

testcũng có sẵn dưới dạng [lệnh cho "kiểm tra khung":

 if [ -t 0 ] ; then ...

là một cách thành ngữ để viết điều kiện này.


8

Tôi tưởng tượng đây là một bản sao, nhưng tôi không thể tìm thấy nó. Sử dụng

[ -t 0 ]

[ -t 1 ]

để kiểm tra tương ứng liệu đầu vào và đầu ra tiêu chuẩn có được kết nối với một thiết bị đầu cuối hay không. man testcó các chi tiết.


7

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ó myscriptstdin 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 $TERMbiế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 ][ -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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.