Trường hợp mặc định biến môi trường TERM được đặt ở đâu?


26

Khi tôi mở một cửa sổ đầu cuối với trình giả lập Terminal Gnome trong GUI của máy tính để bàn, biến môi trường TERM của vỏ mặc định là giá trị xterm.

Nếu tôi sử dụng CTL+ ALT+ F1để chuyển sang cửa sổ TTY của bàn điều khiển và echo $TERMgiá trị được đặt thành linux.

Động lực của tôi để hỏi là trong ~/.bashrctập tin của tôi, một biến được sử dụng để xác định xem vỏ màu được cung cấp hay chỉ đơn sắc kiểu cũ tốt.

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color) color_prompt=yes;;
esac

Trong cả vỏ giao diện điều khiển và vỏ giả lập Gnome Terminal nếu tôi gõ

export TERM=xterm-color
source /.bashrc

cả hai vỏ đều chuyển sang chế độ màu (điều mà tôi muốn xảy ra luôn ở cả hai).

Các TERMgiá trị mặc định được đặt ở đâu vui lòng và đâu là nơi tốt nhất để thay đổi mặc định của chúng, nếu có thể? Dường như không có gì trong GUI giả lập thiết bị đầu cuối để chọn hoặc đặt giá trị TERM mặc định.

Tôi đã xem xét chỉ thêm dòng export TERM=xterm-colorvào đầu ~/.bashrctệp của mình nhưng bản năng ruột của tôi nói rằng đây không phải là giải pháp tốt nhất và các tìm kiếm Google của tôi chưa đưa tôi đến một câu trả lời hay.

Tôi đang chạy Ubuntu 15.04 Desktop Edition (Dựa trên Debian).


Câu trả lời:


17

Ở nhiều nơi, tùy

Trên các thiết bị đầu cuối ảo và thiết bị đầu cuối thực, TERMbiến môi trường được thiết lập bởi chương trình xâu chuỗi loginvà được kế thừa tất cả các đường dẫn đến vỏ tương tác thực thi khi đã đăng nhập. Trường hợp, chính xác, điều này xảy ra khác nhau tùy theo hệ thống, và theo loại thiết bị đầu cuối.

Các thiết bị đầu cuối thực, nối tiếp, có thể khác nhau về loại, tùy theo những gì ở đầu kia của dây. Vì vậy, thông thường gettychương trình được gọi với một đối số chỉ định loại thiết bị đầu cuối hoặc được truyền TERMchương trình từ dữ liệu cấu hình dịch vụ của người quản lý dịch vụ.

  • Trên initcác hệ thống van Smoorenburg , người ta có thể thấy điều này trong /etc/inittabcác mục, sẽ đọc một cái gì đó dọc theo dòng

    S0: 3: hồi sinh: / sbin / agetty ttyS0 9600 vt100-nav
    Đối số cuối cùng agettytrong dòng đó vt100-nav, là loại thiết bị đầu cuối được đặt cho /dev/ttyS0. Vì vậy, /etc/inittabnơi để thay đổi loại thiết bị đầu cuối cho thiết bị đầu cuối thực trên các hệ thống như vậy.
  • Trên các hệ thống systemd, người ta có thể thấy điều này trong /usr/lib/systemd/system/serial-getty@.servicetệp đơn vị ( /lib/systemd/system/serial-getty@.servicetrên các hệ thống chưa hợp nhất), đọc

    Môi trường = HẠN = vt100
    thiết lập TERMbiến trong môi trường truyền vào agetty. Tệp đơn vị dịch vụ này là nơi thay đổi loại thiết bị đầu cuối cho thiết bị đầu cuối thực trên các hệ thống đó. Lưu ý rằng nó áp dụng cho tất cả các thiết bị đầu cuối thực sự sử dụng mẫu đơn vị dịch vụ này. (Để thay đổi nó chỉ cho các thiết bị đầu cuối riêng lẻ, người ta phải khởi tạo thủ công mẫu.)
  • Trên các BSD, initlấy loại thiết bị đầu cuối từ trường thứ ba của mỗi mục nhập của thiết bị đầu cuối trong /etc/ttyscơ sở dữ liệu và đặt TERMtừ loại đó trong môi trường mà nó thực thi getty. Vì vậy, /etc/ttysnơi người ta thay đổi loại thiết bị đầu cuối cho thiết bị đầu cuối thực trên BSD.

Các thiết bị đầu cuối ảo Kernel, như bạn đã lưu ý, có một loại cố định. Không giống như NetBSD, có thể thay đổi loại thiết bị đầu cuối ảo hạt nhân một cách nhanh chóng, Linux và các BSD khác có một loại thiết bị đầu cuối cố định duy nhất được triển khai trong chương trình mô phỏng thiết bị đầu cuối tích hợp của hạt nhân. Trên Linux, kiểu đó khớp với linuxcơ sở dữ liệu terminfo. (Mô phỏng thiết bị đầu cuối kernel của FreeBSD là một xtermtập hợp con giới hạn kể từ phiên bản 9.)

  • Trên các hệ thống sử dụng mingettyhoặc vc-get-tty(từ gói nosh), chương trình "biết" rằng nó chỉ có thể nói chuyện với một thiết bị đầu cuối ảo và chúng gắn kết các loại thiết bị đầu cuối ảo "đã biết" phù hợp với hệ điều hành mà chương trình được biên dịch.
  • Trên các hệ thống systemd, người ta có thể thấy điều này trong /usr/lib/systemd/system/getty@.servicetệp đơn vị ( /lib/systemd/system/getty@.servicetrên các hệ thống chưa hợp nhất), đọc

    Môi trường = TERM = linux
    thiết lập TERMbiến trong môi trường truyền vào agetty.

Đối với thiết bị đầu cuối ảo kernel, người ta không thay đổi loại thiết bị đầu cuối. Rốt cuộc, chương trình giả lập thiết bị đầu cuối trong kernel không thay đổi. Nó là không chính xác để thay đổi loại. Cụ thể, điều này sẽ làm hỏng con trỏ / chỉnh sửa nhận dạng chuỗi CSI. Các linuxchuỗi CSI gửi bởi mô phỏng thiết bị Linux kernel là khác nhau cho xtermhay vt100chuỗi CSI gửi bởi các chương trình mô phỏng thiết bị GUI trong chế độ Tháng Mười Hai VT.

Trình giả lập thiết bị đầu cuối GUI của bạn là một trong nhiều chương trình, từ SSH đến screen, sử dụng thiết bị đầu cuối giả. Kiểu thiết bị đầu cuối phụ thuộc vào chương trình giả lập thiết bị đầu cuối nào đang chạy ở phía chính của thiết bị đầu cuối giả và cách cấu hình. Hầu hết các trình giả lập thiết bị đầu cuối GUI sẽ khởi động chương trình ở phía nô lệ với một TERMbiến có giá trị khớp với mô phỏng đầu cuối của chúng ở phía chính. Các chương trình như máy chủ SSH sẽ cố gắng "chuyển qua" loại thiết bị đầu cuối nằm ở đầu máy khách của kết nối. Thông thường có một số tùy chọn menu hoặc cấu hình để chọn trong số các mô phỏng đầu cuối.

Bàn tay nắm chặt

Cách đúng để phát hiện khả năng màu sắc là không gắn cứng danh sách các loại thiết bị đầu cuối trong tập lệnh của bạn. Có rất nhiều loại thiết bị đầu cuối hỗ trợ màu sắc.

Cách đúng đắn là xem xét termcap / terminfo nói gì về loại thiết bị đầu cuối của bạn.

màu = 0
nếu tham số Co> / dev / null 2> & 1
sau đó
    kiểm tra "` tput Co` "-gt 2 && color = 1
màu sắc thông số> / dev / null 2> & 1
sau đó
    kiểm tra "` tput colors` "-gt 2 && color = 1
fi

đọc thêm

  • Jonathan de Boyne Pollard (2018). TERM. Hướng dẫn nosh . Phần mềm.

Phần sau tồn tại trong .bashrc mặc định trong Debian jessie : [ -x /usr/bin/tput ] && /usr/bin/tput setaf 1 >&/dev/null && color_prompt=yes. (ncurses 5.9)
thom_nic

2
Cũng tput Cotrả về "khả năng terminfo không xác định" trong Jessie và Xenial. tput colorstput setaf 1cả hai dường như làm việc mặc dù tôi thừa nhận tôi không hiểu tại sao .
thom_nic

2

Vui lòng xem https://askubfox.com/a/614714/398785 để biết câu trả lời chi tiết của tôi về lý do tại sao tôi nghĩ TERM=xterm-colorlà cách tiếp cận sai và Ubuntu đã .bashrclỗi thời. Tôi khuyên bạn nên đi cùng TERM=xterm-256color(đó là mặc định kể từ gnome-terminal 3.16, nhưng cũng an toàn khi sử dụng với các gnome-terminal cũ hơn) và điều chỉnh cho .bashrcphù hợp.


1
+1 cho liên kết của bạn. Đề nghị nhỏ; câu sau đây có thể gây nhầm lẫn (lần đầu tiên tôi có ấn tượng rằng bạn đang nói rằng việc sử dụng .bashrclà lỗi thời). ".Bashrc của Ubuntu đã lỗi thời."
IsaacS

@IsaacS Bạn có gợi ý nào để cải thiện nó không? Ví dụ, thay thế "lỗi thời" bằng trợ giúp "lỗi thời"?
egmont

1
Dường như điều đó xterm-256colorlàm htopxáo trộn bố cục của nó như thế này trong Ubuntu 18.04.
Ngừng làm hại

@OrangeDog Trong trình giả lập thiết bị đầu cuối nào? Câu hỏi này ở đây và do đó, câu trả lời của tôi tập trung vào Terminal Gnome, trong khi trang bạn liên kết hiển thị Konsole. Lỗi này có vẻ như trình giả lập thiết bị đầu cuối chưa hỗ trợ trình tự thoát REP mà các ncurs bắt đầu sử dụng vào khoảng thời gian đó. VTE (Gnome Terminal) đã thêm hỗ trợ cho nó trong Ubuntu 18.04, rất có thể là Konsole thì không. Tôi nghi ngờ rằng nhận xét của bạn với sự phá vỡ htop là hợp lệ cho Konsole nhưng không phải cho Terminal Gnome.
egmont

@egmont không thể nói cho vấn đề ban đầu, nhưng tôi nhận được kết quả tương tự với thiết bị đầu cuối của WSL (bất kể đó là gì).
Ngừng làm hại Monica
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.