Không có giá trị cho $ TATE và không -T được chỉ định


22

Gần đây tôi đã nâng cấp (với apt-get dist-upgrade) các hộp Kubfox và Lubfox Linux của mình và bây giờ mỗi lần tôi đăng nhập vào một trong những máy này, tôi nhận được thông báo này:

tput: No value for $TERM and no -T specified

Đây là một ảnh chụp màn hình của thông điệp chính xác: tput: Không có giá trị cho $ TATE và không -T được chỉ định

Điều này đã xảy ra trên cả máy LubFi của tôi và máy Kubfox và nó không phải là vấn đề cho đến khi tôi nâng cấp; Vì vậy, tôi nghi ngờ rằng đó không phải là lỗi người dùng.

Làm thế nào tôi có thể sửa lỗi này?

CẬP NHẬT

Tôi đã theo dõi điều này xuống tệp .bashrc, tệp này được gọi bởi tệp .profile của tôi. Mặc dù vậy, thực tế là tệp .bashrc của tôi bây giờ chạy khi tôi đăng nhập GUI trong khi trước khi tôi nâng cấp thì hơi lạ. Và không, tôi đã không sửa đổi tệp .bashrc hoặc .profile của tôi gần đây. Ngoài ra, bash không phải là vỏ mặc định của tôi.

Vấn đề là tôi đang gọi tputtrong tệp .bashrc của mình để thiết lập các biến để sử dụng trong việc thêm màu vào dấu nhắc. Nhưng tại thời điểm (không phù hợp) khi tệp .bashrc của tôi bây giờ được chạy, $TERMkhông được đặt.

fgRed=$(tput setaf 1)     ; fgGreen=$(tput setaf 2)  ; fgBlue=$(tput setaf 4)
fgMagenta=$(tput setaf 5) ; fgYellow=$(tput setaf 3) ; fgCyan=$(tput setaf 6)
fgWhite=$(tput setaf 7)   ; fgBlack=$(tput setaf 0)
bgRed=$(tput setab 1)     ; bgGreen=$(tput setab 2)  ; bgBlue=$(tput setab 4)
bgMagenta=$(tput setab 5) ; bgYellow=$(tput setab 3) ; bgCyan=$(tput setab 6)
bgWhite=$(tput setab 7)   ; bgBlack=$(tput setab 0)

Câu hỏi cập nhật: Làm thế nào tôi nên sửa lỗi này? Tôi có nên đặt $TERMmình? Hoặc tôi chỉ không nên đặt các biến này nếu $TERMkhông được đặt?

CẬP NHẬT 2

Một giải pháp tôi đã thử là kiểm tra xem $TERMđã được đặt chưa. Nhưng điều này dường như không hoạt động; Tôi vẫn nhận được thông báo lỗi tương tự. Đây là mã:

if [ ! "$TERM" = "" ]; then
  #Do stuff here
fi

Vì vậy, rõ ràng $TERM đã được thiết lập, nhưng tputvẫn kết luận là không.


1
Nếu tôi không nhầm .profilechạy bất kể vỏ mặc định
Sergiy Kolodyazhnyy

@Serg nhưng trong quá trình đăng nhập GUI GUI? Ngoài ra, tôi đã không luôn luôn nhìn thấy vấn đề này.
Sildoreth 4/03/2015

Chà, đúng vậy, nó nên được chạy khi người dùng đăng nhập và đây chính xác là những gì bạn đang làm
Sergiy Kolodyazhnyy

Câu trả lời:


13

Điều cuối cùng làm việc cho tôi là kiểm tra xem vỏ có phải là vỏ tương tác hay không. Tôi dựa trên giải pháp cho bài đăng khác này tại unix.stackexchange: Cách kiểm tra xem shell có đăng nhập / tương tác / đợt hay không .

Vì vậy, mã cho giải pháp là:

if [[ $- == *i* ]]; then
  fgRed=$(tput setaf 1)     ; fgGreen=$(tput setaf 2)  ; fgBlue=$(tput setaf 4)
  fgMagenta=$(tput setaf 5) ; fgYellow=$(tput setaf 3) ; fgCyan=$(tput setaf 6)
  fgWhite=$(tput setaf 7)   ; fgBlack=$(tput setaf 0)
  bgRed=$(tput setab 1)     ; bgGreen=$(tput setab 2)  ; bgBlue=$(tput setab 4)
  bgMagenta=$(tput setab 5) ; bgYellow=$(tput setab 3) ; bgCyan=$(tput setab 6)
  bgWhite=$(tput setab 7)   ; bgBlack=$(tput setab 0)
fi

Aha, đó là một giải pháp tao nhã. :)
Gunnar Hjalmarsson

2
Nếu điều này là trong .bashrc, tôi thấy nó đáng ngạc nhiên. Mặc định .bashrcchứa : # If not running interactively, don't do anything case $- in *i*) ;; *) return;;, vì vậy cài đặt của bạn không nên được áp dụng trừ khi tương tác.
muru

@muru Tệp .bashrc của tôi không mặc định. :)
Sildoreth

Nhưng bạn đã làm điều đó ở đâu? trong .bashrc?
jjmerelo 14/03/2015

Tôi nghĩ rằng nếu bạn đặt cái này ở đầu tập tin của bạn thì nó sẽ sạch hơn: [[ $- == *i* ]] || returnRef: ( askubfox.com/a/1070182/362122 )
Klik

9

Nếu bạn làm điều này

if tty -s
then
    : # your tput commands
fi

Nó sẽ khắc phục vấn đề của bạn. Nếu không có tùy chọn -s, tty sẽ hiển thị tty của bạn hoặc viết "không phải là tty"


Mô tả ttytừ trang hướng dẫn của nó là "in tên tệp của thiết bị đầu cuối được kết nối với đầu vào tiêu chuẩn." Nếu stdin của tập lệnh của bạn là một đường ống, thử nghiệm này sẽ thất bại, do hậu quả là chương trình của bạn dừng in màu trong đầu ra của nó chỉ vì đầu vào của nó đến từ một đường ống. Có lẽ test -t 1(bằng tiếng Anh: "thiết bị xuất chuẩn được kết nối với thiết bị đầu cuối?") Là những gì bạn thực sự muốn? Bằng cách đó bạn sẽ có được màu sắc chỉ nếu đầu ra được đi đến một thiết bị đầu cuối, và bạn sẽ không thấy mã terminal lạ nếu bạn chuyển hướng sản lượng của nó vào một tập tin hoặc ống thông qua, nói, less.
TheDude Abides

6

Đối với tôi, thêm

export TERM=xterm

để /etc/profilelà điều duy nhất mà giải quyết được vấn đề. Trên thực tế, lỗi đã cho chúng tôi một gợi ý:No value for $TERM


4

[ Kịch bản khác nhau, nhưng công cụ tìm kiếm dẫn tôi đến đây trước]

Khi xảy ra lỗi " tput: Không có giá trị cho $ TERM và không được chỉ định " trong bộ chứa Docker (đối với tôi, khi mở trình gọi shell zshdocker exec -it <container> zsh (-i để tương tác)), cách duy nhất để khắc phục điều này là đặt biến Giống như ENV TERM xterm-256colortrong Dockerfile cho hình ảnh này.

Phương pháp tiếp cận như RUN export TERM=xterm-256color hoặc RUN echo "export TERM=xterm-256color" >> ~/.zshrckhông thành công. Các giá trị khác cho HẠN cũng có thể.


3

Hãy thử mở terminal (không quan trọng, thậm chí tty1 sẽ làm gì) và chạy dòng này

sudo update-alternatives --config x-terminal-emulator

Bạn sẽ được lựa chọn trình giả lập thiết bị đầu cuối mặc định cho cửa sổ x. Chọn một bằng cách chọn số và khởi động lại sau khi bạn hoàn thành.

$ sudo update-thay thế --config x-terminal-giả lập
Có 6 lựa chọn cho trình giả lập x-terminal-giả lập (cung cấp / usr / bin / x-terminal-giả lập).

  Selection    Path                             Priority   Status
------------------------------------------------------------
  0            /usr/bin/gnome-terminal.wrapper   40        auto mode
  1            /usr/bin/gnome-terminal.wrapper   40        manual mode
  2            /usr/bin/koi8rxterm               20        manual mode
* 3            /usr/bin/lxterm                   30        manual mode
  4            /usr/bin/sakura                   40        manual mode
  5            /usr/bin/uxterm                   20        manual mode
  6            /usr/bin/xterm                    20        manual mode

Press enter to keep the current choice[*], or type selection number:  

Khi tôi thử điều này, nó sẽ cho tôi biết "Chỉ có một lựa chọn duy nhất trong nhóm liên kết x-terminal-giả lập [...] Không có gì để cấu hình". Đây là trên máy Kubfox của tôi.
Sildoreth 4/03/2015

Hãy thử cài đặt một trình giả lập thiết bị đầu cuối khác, ví dụ gnome-terminalhoặcsakura
Sergiy Kolodyazhnyy

Tôi đã có cùng vấn đề y hệt. Tôi đã chọn sakura. Tuy nhiên, điều này dường như là một vấn đề với trình bao bọc thiết bị đầu cuối gnome; Nếu vậy, tại sao không sửa nó?
jjmerelo 14/03/2015

Nó không khắc phục vấn đề, thực sự.
jjmerelo 14/03/2015

2
@jjmerelo Vì OP sau đó đã tiết lộ trong câu trả lời của mình, anh ta có các dòng trong tệp .bashrc của mình, điều này đã gây ra lỗi. Trình bao bọc thiết bị đầu cuối Gnome không phải là vấn đề. Tôi đoán ban đầu là biến $ TERM không được đặt, đó là một người dùng khác, Gunnar, được đề cập trong câu trả lời của anh ấy.
Sergiy Kolodyazhnyy

1

Hộp thoại báo lỗi là do sửa lỗi # 678421 , vì vậy đó là lỗi của tôi. ;) Nó cho bạn biết về các lỗi do một số lệnh trong một trong các tệp cấu hình của bạn. Nếu bạn cuộn lên trên cùng, bạn có thể thấy tệp nào gây ra thông báo lỗi.

Có thể câu trả lời của Serg là đủ để thoát khỏi hộp thoại cảnh báo.

Chỉnh sửa:

Muốn thêm một vài điều do câu hỏi cập nhật.

Không giống như trước đây, /usr/sbin/lightdm-sessionbây giờ được chạy dưới bash (trước đây là sh). Đó là lý do tại sao nó tìm nguồn cung ứng ~/.profilekết quả trong ~/.profiletìm nguồn cung ứng ~/.bashrc. Có thể điều này có nghĩa là nội dung mặc định của~/.profile phải được thay đổi.

Cách dễ nhất bạn có thể làm để khắc phục nó là, như bạn đã đề xuất, chỉ gọi điện thoại nếu $ TERM được đặt.


Tôi đã thử kiểm tra xem $ TERM đã được đặt chưa, nhưng có vẻ như nó không hoạt động.
Sildoreth 4/03/2015

@Sildoreth: Bạn có thể vui lòng chỉ cho chúng tôi mã chính xác để làm như vậy không? (Vui lòng chỉnh sửa lại câu hỏi của bạn.)
Gunnar Hjalmarsson

thêm vào câu hỏi
Sildoreth

@Sildoreth: Thấy rồi. Có lẽ đó là vì thông số được gọi trong các quy trình con. (Chỉ là một phỏng đoán.) Dù sao, bạn đã tìm thấy một cách tốt đẹp để đối phó với nó.
Gunnar Hjalmarsson
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.