ไม่มีค่าสำหรับ $ TERM และไม่ได้ระบุ -T


22

ฉันเพิ่งอัพเกรด (พร้อมapt-get dist-upgrade) กล่อง Kubuntu และ Lubuntu Linux ของฉันและตอนนี้ทุกครั้งที่ลงชื่อเข้าใช้หนึ่งในเครื่องเหล่านี้ฉันได้รับข้อความนี้:

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

นี่คือภาพหน้าจอของข้อความที่แน่นอน: tput: ไม่มีค่าสำหรับ $ TERM และไม่ระบุ -T

สิ่งนี้เกิดขึ้นทั้งกับเครื่อง Lubuntu และเครื่อง Kubuntu ของฉันและมันก็ไม่มีปัญหาจนกระทั่งหลังจากที่ฉันอัพเกรด ดังนั้นฉันสงสัยว่ามันไม่ใช่ข้อผิดพลาดของผู้ใช้

ฉันจะแก้ไขสิ่งนี้ได้อย่างไร

UPDATE

ฉันติดตามไฟล์นี้เป็นไฟล์. bashrc ของฉันซึ่งกำลังถูกเรียกโดยไฟล์. profile ของฉัน ถึงแม้ว่าความจริงที่ว่าไฟล์. bashrc ของฉันจะทำงานเมื่อฉันเข้าสู่ระบบ GUI ในขณะที่มันไม่ได้ก่อนที่ฉันจะอัพเกรดเป็นบิตแปลก และไม่ฉันยังไม่ได้แก้ไขไฟล์. bashrc หรือ. profile ของฉันเมื่อเร็ว ๆ นี้ นอกจากนี้ทุบตีไม่ใช่เปลือกเริ่มต้นของฉัน

ปัญหาคือฉันกำลังโทรtputในไฟล์. bashrc ของฉันเพื่อตั้งค่าตัวแปรเพื่อใช้ในการเพิ่มสีให้กับพรอมต์ แต่ในเวลา (ไม่เหมาะสม) เมื่อไฟล์. bashrc ของฉันเริ่มทำงาน$TERMไม่ได้ตั้งค่าไว้

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)

อัปเดตคำถาม:ฉันจะแก้ไขได้อย่างไร ฉันควรตั้ง$TERMตัวเองเหรอ? หรือฉันควรจะไม่ตั้งค่าตัวแปรเหล่านี้หาก$TERMไม่ได้ตั้งไว้?

อัพเดท 2

ทางออกหนึ่งที่ฉันพยายามคือตรวจสอบว่า$TERMได้ตั้งค่าไว้หรือไม่ แต่สิ่งนี้ดูเหมือนจะไม่ทำงาน ฉันยังคงได้รับข้อความแสดงข้อผิดพลาดเดียวกัน นี่คือรหัส:

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

เห็นได้ชัดว่า$TERM มีการตั้งค่า แต่tputก็ยังสรุปได้ว่ามันไม่ได้


1
ถ้าฉันไม่ผิดพลาด.profileทำงานโดยไม่คำนึงถึงเปลือกเริ่มต้น
Sergiy Kolodyazhnyy

@Serg แต่ในระหว่างการล็อกอินเชลล์ GUI? นอกจากนี้ฉันไม่เห็นปัญหานี้เสมอ
Sildoreth

ก็ใช่มันควรจะวิ่งตามที่ผู้ใช้เข้าสู่ระบบและนี่คือสิ่งที่คุณทำ
Sergiy Kolodyazhnyy

คำตอบ:


13

สิ่งที่ได้ผลที่สุดสำหรับฉันคือการตรวจสอบว่าเชลล์เป็นเชลล์แบบโต้ตอบหรือไม่ ผมตามแก้ปัญหาเกี่ยวกับการโพสต์อื่น ๆ ที่ unix.stackexchange: วิธีการตรวจสอบว่าเป็นเปลือกเข้าสู่ระบบ / โต้ตอบ / ชุด

ดังนั้นรหัสสำหรับการแก้ปัญหาคือ:

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

อ่านั่นเป็นทางออกที่สง่างาม :)
Gunnar Hjalmarsson

2
ถ้านี่คือใน.bashrcฉันพบว่ามันน่าแปลกใจ ค่าเริ่มต้น.bashrcประกอบด้วย: # If not running interactively, don't do anything case $- in *i*) ;; *) return;;ดังนั้นไม่ควรใช้การตั้งค่าของคุณเว้นแต่จะมีการโต้ตอบ
muru

@muru ไฟล์. bashrc ของฉันไม่มีค่าเริ่มต้นมาก :)
Sildoreth

แต่คุณทำอย่างนั้น? ใน.bashrc?
jjmerelo

ฉันคิดว่าถ้าคุณวางไว้ที่ด้านบนของไฟล์ของคุณมันสะอาดกว่า: [[ $- == *i* ]] || returnRef: ( askubuntu.com/a/1070182/362122 )
Klik

9

ถ้าคุณทำเช่นนี้

if tty -s
then
    : # your tput commands
fi

มันจะแก้ไขปัญหาของคุณ หากไม่มีอ็อพชัน -s tty จะแสดง tty ของคุณหรือเขียนว่า "ไม่ใช่ tty"


คำอธิบายของttyจากหน้าคู่มือคือ "พิมพ์ชื่อไฟล์ของเครื่องที่เชื่อมต่อกับอินพุตมาตรฐาน" หาก stdin ของสคริปต์ของคุณเป็นไพพ์การทดสอบนี้จะล้มเหลวเนื่องจากโปรแกรมของคุณหยุดพิมพ์สีในเอาต์พุตเพียงเพราะอินพุตนั้นมาจากไพพ์ บางทีtest -t 1(เป็นภาษาอังกฤษ: "stdout เชื่อมต่อกับเทอร์มินัลหรือไม่?") เป็นสิ่งที่คุณต้องการจริงหรือ วิธีการที่คุณจะได้รับสีเท่านั้นlessถ้าการส่งออกเป็นไปขั้วและคุณจะไม่เห็นรหัสขั้วแปลกถ้าคุณเปลี่ยนเส้นทางออกไปยังไฟล์หรือท่อมันผ่านการพูด
TheDudeAbides

6

สำหรับฉันเพิ่ม

export TERM=xterm

จะ/etc/profileเป็นสิ่งเดียวที่แก้ปัญหา ที่จริงแล้วข้อผิดพลาดนั้นให้คำแนะนำแก่เรา:No value for $TERM


4

[ สถานการณ์ต่าง ๆ แต่เครื่องมือค้นหานำฉันมาที่นี่ก่อน]

เมื่อ " tput: ไม่มีค่าสำหรับ $ TERM และไม่มีการระบุ -T " เกิดขึ้นในคอนเทนเนอร์Docker (สำหรับฉันเมื่อเปิดการเรียกเชลล์zshdocker exec -it <container> zsh (-i สำหรับการโต้ตอบ)) วิธีเดียวที่จะแก้ไขปัญหานี้คือการตั้งค่าตัวแปร เหมือนENV TERM xterm-256colorใน Dockerfile สำหรับภาพนี้

วิธีการเช่นRUN export TERM=xterm-256color หรือRUN echo "export TERM=xterm-256color" >> ~/.zshrcไม่ประสบความสำเร็จ ค่าอื่น ๆ สำหรับ TERM ก็เป็นไปได้เช่นกัน


3

ลองเปิดเทอร์มินัล (ไม่สำคัญว่าจะเป็น tty1 แบบใด) และเรียกใช้บรรทัดนี้

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

คุณจะเห็นตัวเลือกเทอร์มินัลอีมูเลเตอร์เริ่มต้นสำหรับหน้าต่าง x เลือกหนึ่งรายการโดยเลือกหมายเลขแล้วรีบูตหลังจากคุณทำเสร็จแล้ว

$ sudo update-alternatives --config x-terminal-emulator
มี 6 ตัวเลือกสำหรับ x-terminal-emulator ทางเลือก (ให้ / usr / bin / x-terminal-emulator)

  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:  

เมื่อฉันลองทำสิ่งนี้จะบอกฉันว่า "มีทางเลือกเดียวในกลุ่มลิงก์ x-terminal-emulator [... ] ไม่มีอะไรให้ตั้งค่า" นี่คือบนเครื่อง Kubuntu ของฉัน
Sildoreth

ลองติดตั้งอีกจำลอง terminal ตัวอย่างgnome-terminalหรือsakura
Sergiy Kolodyazhnyy

ฉันมีปัญหาเดียวกันทั้งหมด sakuraผมได้เลือก อย่างไรก็ตามดูเหมือนว่าจะมีปัญหากับเครื่องห่อหุ้มของ gnome; ถ้าเป็นเช่นนั้นทำไมไม่แก้ไข
jjmerelo

มันไม่ได้แก้ไขปัญหาจริง
jjmerelo

2
@jjmerelo ตามที่ OP เปิดเผยในคำตอบของเขาเขามีบรรทัดในไฟล์. bashrc ซึ่งทำให้เกิดข้อผิดพลาด เครื่องห่อเทอร์มินัล Gnome ไม่ควรเป็นปัญหา ตอนแรกฉันเดาว่าตัวแปร $ TERM ไม่ได้ถูกตั้งค่าซึ่งเป็นผู้ใช้คนอื่นคือ Gunnar ที่ถูกกล่าวถึงในคำตอบของเขา
Sergiy Kolodyazhnyy

1

กล่องโต้ตอบข้อผิดพลาดเกิดจากการแก้ไขข้อผิดพลาด # 678421ดังนั้นจึงเป็นความผิดของฉัน ;) มันจะบอกคุณเกี่ยวกับข้อผิดพลาดอันเนื่องมาจากคำสั่งบางอย่างในหนึ่งในไฟล์การกำหนดค่าของคุณ หากคุณเลื่อนไปด้านบนคุณสามารถดูไฟล์ที่ทำให้เกิดข้อความแสดงข้อผิดพลาด

อาจเป็นคำตอบของ Serg ก็เพียงพอที่จะกำจัดกล่องโต้ตอบคำเตือน

แก้ไข:

ต้องการเพิ่มสองสิ่งเนื่องจากคำถามที่อัปเดต

ไม่เหมือนกับก่อนหน้า/usr/sbin/lightdm-sessionนี้ตอนนี้ทำงานภายใต้ bash (ก่อนหน้านี้ sh) นั่นเป็นเหตุผลที่การจัดหาของ~/.profileผลลัพธ์ในการจัดหา~/.profile ~/.bashrcอาจหมายความว่าเนื้อหาเริ่มต้นของ~/.profileควรมีการเปลี่ยนแปลง

สิ่งที่ง่ายที่สุดที่คุณสามารถทำได้เพื่อแก้ไขก็คือตามที่คุณแนะนำให้โทรหา tput เฉพาะเมื่อมีการตั้งค่า $ TERM


ฉันลองตรวจสอบว่ามีการตั้งค่า $ TERM แล้วแต่ไม่ได้ผล
Sildoreth

@Sildoreth: คุณช่วยแสดงให้เราเห็นรหัสที่แน่นอนสำหรับการทำเช่นนั้น? (โปรดแก้ไขคำถามของคุณอีกครั้ง)
Gunnar Hjalmarsson

เพิ่มคำถามแล้ว
Sildoreth

@Sildoreth: เห็นมัน อาจเป็นเพราะ tput ถูกเรียกใน subprocesses (เพียงเดา) อย่างไรก็ตามคุณพบวิธีที่ดีในการจัดการกับมัน
Gunnar Hjalmarsson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.