Tôi đang sử dụng loại thiết bị đầu cuối nào?


51

Tôi đã thử nghiệm điều này với cả Ubuntu 12.04 và Debian 7. Khi tôi làm

echo $TERM

tôi có

xterm

Nhưng nếu tôi sử dụng menu thả xuống "trợ giúp"> "về" thì nó báo gnome terminal 3.4.1.1.

Điều này có nghĩa là tôi đang sử dụng chỉ gnome-terminal? Hay chỉ là xterm? Hoặc gnome-terminal là một phần mở rộng của xterm? Tôi bối rối.

Câu trả lời:


49

Để làm gì $TERM?

Các $TERMbiến là để sử dụng bởi các ứng dụng để tận dụng khả năng của thiết bị đầu cuối đó.

Ví dụ: nếu một chương trình muốn hiển thị văn bản màu, trước tiên nó phải tìm hiểu xem thiết bị đầu cuối bạn đang sử dụng có hỗ trợ văn bản màu hay không, và nếu có, làm thế nào để làm văn bản màu.

Cách thức hoạt động này là hệ thống giữ một thư viện các thiết bị đầu cuối đã biết và khả năng của chúng. Trên hầu hết các hệ thống, đây là /usr/share/terminfo(cũng có termcap, nhưng nó không được sử dụng nhiều nữa).

Vì vậy, giả sử bạn có một chương trình muốn hiển thị văn bản màu đỏ. Về cơ bản, nó thực hiện một cuộc gọi đến thư viện terminfo có nội dung " cung cấp cho tôi chuỗi byte tôi phải gửi cho văn bản màu đỏ cho thiết bị đầu cuối xterm ". Sau đó, nó chỉ cần lấy các byte và in chúng ra.
Bạn có thể thử điều này bằng cách làm tput setf 4; echo hi. Điều này sẽ có được setfkhả năng terminfo và truyền cho nó một tham số 4, đó là màu bạn muốn.


Tại sao thiết bị đầu cuối gnome nói về chính nó:

Bây giờ hãy nói rằng bạn có một số trình giả lập thiết bị đầu cuối mới sáng bóng vừa được phát hành và thư viện terminfo của hệ thống chưa có định nghĩa cho nó. Khi ứng dụng của bạn tìm kiếm cách thực hiện một cái gì đó, nó sẽ thất bại vì thiết bị đầu cuối không được biết đến.

Cách thiết bị đầu cuối của bạn có được điều này là bằng cách nói dối về việc đó là ai. Vì vậy, thiết bị đầu cuối gnome của bạn đang nói " Tôi là xterm ".

Xterm là một thiết bị đầu cuối rất cơ bản đã có từ thời X11, và do đó hầu hết các trình giả lập thiết bị đầu cuối đều hỗ trợ những gì nó hỗ trợ. Vì vậy, bởi thiết bị đầu cuối gnome nói rằng đó là một xterm, nhiều khả năng nó có một định nghĩa trong thư viện terminfo.

Nhược điểm của việc nói dối về loại thiết bị đầu cuối của bạn là thiết bị đầu cuối thực sự có thể hỗ trợ nhiều hơn xterm (ví dụ, nhiều thiết bị đầu cuối mới hỗ trợ 256 màu, trong khi các thiết bị đầu cuối cũ chỉ hỗ trợ 16). Vì vậy, bạn có một sự đánh đổi, có được nhiều tính năng hơn hoặc có nhiều khả năng tương thích hơn. Hầu hết các thiết bị đầu cuối sẽ chọn để tương thích nhiều hơn, và do đó chọn quảng cáo chính họ như xterm.

Nếu bạn muốn ghi đè lên điều này, nhiều thiết bị đầu cuối sẽ cung cấp một số cách cấu hình hành vi. Nhưng bạn cũng có thể làm export TERM=gnome-terminal.


4
Đề xuất ai đó xuất $ TERM thực sự có vẻ như xát muối vào vết thương hở ...
jasonwryan

1
vâng Tôi đoán rằng các nhà phát triển của trái gnome-terminal $TERMthiết lập để xtermcho một lý do chính đáng
mulllhausen

4
@mulllhausen Lý do đó được giải thích rõ trong câu trả lời của tôi ...
Patrick

27

Biến TERMmôi trường chỉ ra loại thiết bị đầu cuối , không phải ứng dụng thiết bị đầu cuối . TERMcó một mục đích cụ thể: nó cho các ứng dụng chạy trong thiết bị đầu cuối đó cách tương tác với thiết bị đầu cuối.

Các ứng dụng tương tác với các thiết bị đầu cuối bằng cách viết các chuỗi thoát - chuỗi các ký tự bao gồm các ký tự không thể in được và có các hiệu ứng như di chuyển con trỏ, xóa một phần màn hình, thay đổi màu hiện tại, v.v. bộ trình tự thoát. Do đó, hệ điều hành duy trì một cơ sở dữ liệu về các loại thiết bị đầu cuối và đặc điểm của chúng. Cơ sở dữ liệu truyền thống là termcap (NỀN TẢNG NỀN TẢNG); nhiều hệ thống và ứng dụng hiện đại đã chuyển sang terminfo . Cả hai cơ sở dữ liệu được lập chỉ mục theo tên của loại thiết bị đầu cuối và các ứng dụng truy vấn chúng bằng tên loại thiết bị đầu cuối từ các TERMbiến môi trường.

Ngày nay, hầu hết các thiết bị đầu cuối sử dụng một bộ trình tự thoát tiêu chuẩn với một vài bộ tiện ích mở rộng phổ biến, vì vậy bạn sẽ không thấy nhiều giá trị khác nhau TERM. Hầu hết các trình giả lập thiết bị đầu cuối GUI tương thích với xterm , thiết bị đầu cuối X truyền thống (vẫn được sử dụng và duy trì).

Trình giả lập thiết bị đầu cuối khác với xterm có thể thêm mục nhập riêng vào cơ sở dữ liệu đầu cuối dưới tên riêng của chúng. Tuy nhiên, điều này không phù hợp với vỏ từ xa. Một chương trình chạy trên máy A nhưng đang hiển thị trên máy B, chẳng hạn vì được khởi chạy qua ssh từ B đến A, cần truy vấn cơ sở dữ liệu đầu cuối trên máy A. Các phương thức đăng nhập từ xa như ssh mang theo TERMbiến môi trường, nhưng điều này chỉ hữu ích khi cơ sở dữ liệu đầu cuối của B cũng có một mục nhập cho người dùng giá trị trên A. Do đó, nhiều trình giả lập thiết bị đầu cuối dính vào TERM=xtermkhá phổ biến.

Sự khác biệt giữa các thiết bị đầu cuối theo và lớn không đến từ cách các ứng dụng tương tác với chúng, mà bằng cách các thiết bị đầu cuối tương tác với người dùng và phù hợp với môi trường của chúng. Ví dụ: Gnome Terminal có vẻ tốt trên Gnome và cung cấp các tab và các chi tiết khác; Konsole có vẻ tốt trên KDE và cung cấp các tab và các chi tiết khác; urxvt có một yêu cầu bộ nhớ nhỏ; Console2 chạy trên Windows; màn hình và tmux cung cấp các phiên có thể được gắn vào các thiết bị đầu cuối cha mẹ khác nhau; vân vân Vì không có tính năng nào trong số này tạo ra sự khác biệt cho các ứng dụng chạy trong thiết bị đầu cuối, nên hầu hết các trình giả lập thiết bị đầu cuối đều sử dụng TERM=xterm.

Để tìm ra thiết bị đầu cuối nào đang chạy nó, hãy nhìn vào cha của shell:

ps -p$PPID

Chạy ps -p$PPIDdường như không cho tôi biết tôi đang chạy thiết bị đầu cuối nào. Hoặc ít nhất là không theo cách tôi hiểu. Bạn có một ví dụ đầu ra / phản hồi?
dùng3731622

@user Đầu ra là một loạt các số và chữ viết tắt khó hiểu theo sau là một dòng lệnh. Trong hầu hết các trường hợp, dòng lệnh là trình khởi động trình giả lập thiết bị đầu cuối trong đó trình bao đang chạy.
Gilles 'SO- ngừng trở thành ác quỷ'

12

Biến môi trường TERM không có nghĩa là thiết bị đầu cuối bạn đang sử dụng.

Trích dẫn gnu.org :

Biến môi trường TERM chứa mã định danh cho các khả năng của cửa sổ văn bản. Bạn có thể nhận được một danh sách chi tiết về các khả năng này bằng cách sử dụng lệnh> 'infocmp', sử dụng 'man 5 terminfo' làm tài liệu tham khảo.

Khi tạo văn bản với các chỉ thị màu được nhúng, trình thông báo sẽ nhìn vào biến TERM. Cửa sổ văn bản ngày nay thường hỗ trợ ít nhất 8 màu. Tuy nhiên, thông thường, cửa sổ văn bản hỗ trợ 16 màu trở lên, mặc dù biến TERM được đặt thành định danh chỉ biểu thị 8 màu được hỗ trợ. Có thể đáng để đặt biến TERM thành một giá trị khác trong những trường hợp sau:

xterm trong hầu hết các trường hợp được xây dựng với sự hỗ trợ cho 16 màu. Nó cũng có thể được xây dựng với sự hỗ trợ cho 88 hoặc 256 màu (nhưng không phải cả hai). Bạn có thể thử đặt TERM thành xterm-16color, xterm-88color hoặc xterm-256color. rxvt

rxvt thường được xây dựng với sự hỗ trợ cho 16 màu. Bạn có thể thử đặt TERM thành rxvt-16color. konsole

konsole cũng thường được xây dựng với sự hỗ trợ cho 16 màu. Bạn có thể thử đặt TERM thành konsole-16color hoặc xterm-16color.

Sau khi thiết lập TERM, bạn có thể xác minh nó bằng cách gọi 'dircat --color = test' và xem liệu đầu ra có giống bản đồ màu hợp lý hay không. Biến môi trường TERM chứa mã định danh cho các khả năng của cửa sổ văn bản. Bạn có thể nhận được một danh sách chi tiết về các khả năng này bằng cách sử dụng lệnh 'infocmp', sử dụng 'man 5 terminfo' làm tài liệu tham khảo.

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.