ตัวแปรสภาพแวดล้อม TERM จะเริ่มต้นที่ใด


26

เมื่อเปิดหน้าต่าง terminal กับจำลอง GNOME xtermร์มินัลในเดสก์ท็กุยเปลือกสภาพแวดล้อมการลงทุนค่าเริ่มต้นของตัวแปรค่า

หากฉันใช้CTL+ ALT+ F1เพื่อสลับไปยังหน้าต่างคอนโซล TTY และค่าที่มีการตั้งค่าecho $TERMlinux

แรงจูงใจในการถามของฉันคือภายใน~/.bashrcตัวแปรของฉันมีการใช้ตัวแปรเพื่อพิจารณาว่ามีการจัดให้มีเปลือกสีหรือขาวดำแบบเก่าที่ดี

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

ในทั้งคอนโซลเชลล์และเชลล์จำลองของ Gnome Terminal หากฉันพิมพ์

export TERM=xterm-color
source /.bashrc

กระสุนทั้งสองเปลี่ยนเป็นโหมดสี (สิ่งที่ฉันต้องการให้เกิดขึ้นเสมอในทั้งสอง)

TERMกรุณาตั้งค่าเริ่มต้นไว้ที่ไหนและที่ไหนดีที่สุดในการเปลี่ยนค่าเริ่มต้นหากเป็นไปได้? ดูเหมือนจะไม่มีอะไรใน GUI ตัวจำลองเทอร์มินัลเพื่อเลือกหรือตั้งค่า TERM เริ่มต้น

ฉันได้พิจารณาเพียงแค่เพิ่มบรรทัดexport TERM=xterm-colorลงที่ด้านบนของ~/.bashrcไฟล์ของฉันแต่สัญชาตญาณของฉันบอกว่านี่ไม่ใช่ทางออกที่ดีที่สุดและการค้นหา Google ของฉันยังไม่ได้นำฉันไปสู่คำตอบที่ดี

ฉันใช้ Ubuntu 15.04 Desktop Edition (อิงเดเบียน)


เกี่ยวข้อง: unix.stackexchange.com/questions/9957/…
thom_nic

คำตอบ:


17

ในสถานที่มากมายขึ้นอยู่กับ

บนเทอร์มินัลเสมือนและเทอร์มินัลจริงTERMตัวแปรสภาพแวดล้อมถูกตั้งค่าโดยโปรแกรมที่เชื่อมโยงกับloginและได้รับสืบทอดมาตลอดจนถึงเชลล์เชิงโต้ตอบที่ดำเนินการเมื่อมีการเข้าสู่ระบบ โดยที่สิ่งนี้เกิดขึ้นได้อย่างหลากหลายจากระบบหนึ่งไปอีกระบบหนึ่งและตามชนิดของเทอร์มินัล

เทอร์มินัลแบบอนุกรมและอนุกรมที่แท้จริงอาจแตกต่างกันไปตามชนิดของสายไฟ ดังนั้นโดยทั่วไปแล้วgettyโปรแกรมจะถูกเรียกใช้พร้อมกับอาร์กิวเมนต์ที่ระบุประเภทของเทอร์มินัลหรือถูกส่งผ่านTERMโปรแกรมจากข้อมูลการกำหนดค่าบริการของผู้จัดการบริการ

  • สำหรับinitระบบvan Smoorenburg เราสามารถเห็นสิ่งนี้ได้ใน/etc/inittabรายการซึ่งจะอ่านบางสิ่งตามบรรทัดของ

    S0: 3: respawn: / sbin / agetty ttyS0 9600 vt100-nav
    อาร์กิวเมนต์สุดท้ายที่จะagettyอยู่ในแนวเดียวกันที่เป็นชุดสำหรับประเภทอาคารvt100-nav /dev/ttyS0ดังนั้น/etc/inittabที่จะเปลี่ยนประเภทอาคารสำหรับเทอร์มินัลจริงในระบบดังกล่าว
  • บนระบบ systemd เราสามารถเห็นสิ่งนี้ได้ใน/usr/lib/systemd/system/serial-getty@.serviceไฟล์หน่วย ( /lib/systemd/system/serial-getty@.serviceในระบบที่ไม่ได้ผสาน) ซึ่งอ่านได้

    สิ่งแวดล้อม = = ระยะ vt100
    การตั้งค่าตัวแปรในสภาพแวดล้อมที่ส่งผ่านไปTERM agettyไฟล์หน่วยบริการนี้จะทำการเปลี่ยนประเภทเทอร์มินัลสำหรับเทอร์มินัลจริงในระบบดังกล่าว โปรดทราบว่ามันใช้กับเทอร์มินัลจริงทั้งหมดที่ใช้เทมเพลตหน่วยบริการนี้ (หากต้องการเปลี่ยนเฉพาะเทอร์มินัลแต่ละเครื่องคุณต้องสร้างเทมเพลตด้วยตนเอง)
  • บน BSD initใช้ชนิดเทอร์มินัลจากฟิลด์ที่สามของรายการของเทอร์มินัลแต่ละรายการใน/etc/ttysฐานข้อมูลและตั้งค่าTERMจากในสภาพแวดล้อมที่ดำเนินการgettyด้วย ดังนั้น/etc/ttysที่หนึ่งเปลี่ยนประเภทอาคารสำหรับอาคารที่แท้จริงใน BSDs

เคอร์เนลเทอร์มินัลเสมือนดังที่คุณได้บันทึกไว้มีชนิดคงที่ ซึ่งแตกต่างจาก NetBSD ซึ่งสามารถเปลี่ยนแปลงประเภทเทอร์มินัลเคอร์เนลเสมือนได้ทันที Linux และ BSD อื่น ๆ มีประเภทเทอร์มินัลคงที่เดียวที่ใช้ในโปรแกรมการจำลองเทอร์มินัลของเคอร์เนล บน Linux ประเภทนั้นจะจับคู่linuxจากฐานข้อมูล terminfo (การจำลองเทอร์มินัลของเคอร์เนล FreeBSD เป็นxtermเซ็ตย่อยจำกัดตั้งแต่เวอร์ชัน 9)

  • บนระบบที่ใช้mingettyหรือvc-get-tty(จากแพ็คเกจ nosh) โปรแกรม "รู้" ว่าสามารถพูดคุยกับเทอร์มินัลเสมือนเท่านั้นและพวกเขาทำการเชื่อมต่อประเภทเทอร์มินัลเสมือน "รู้จัก" ที่เหมาะสมกับระบบปฏิบัติการที่โปรแกรมรวบรวมไว้
  • บนระบบ systemd เราสามารถเห็นสิ่งนี้ได้ใน/usr/lib/systemd/system/getty@.serviceไฟล์หน่วย ( /lib/systemd/system/getty@.serviceในระบบที่ไม่ได้ผสาน) ซึ่งอ่านได้

    สิ่งแวดล้อม = = ระยะลินุกซ์
    การตั้งค่าตัวแปรในสภาพแวดล้อมที่ส่งผ่านไปTERMagetty

สำหรับเทอร์มินัลเสมือนเคอร์เนลไม่มีการเปลี่ยนแปลงประเภทอาคาร โปรแกรมเทอร์มินัลอีมูเลเตอร์ในเคอร์เนลจะไม่เปลี่ยนแปลงหลังจากทั้งหมด มันเป็นความไม่ถูกต้องในการเปลี่ยนประเภท โดยเฉพาะอย่างยิ่งสิ่งนี้จะทำให้การรับรู้ลำดับเคอร์เซอร์ / แก้ไขคีย์ CSI linuxลำดับ CSI ส่งโดยลินุกซ์เคอร์เนลจำลอง terminal จะแตกต่างกันไปxtermหรือvt100ลำดับ CSI ส่งโดย GUI โปรแกรมจำลอง terminal ในโหมดธันวาคม VT

GUI เทอร์มินัลอีมูเลเตอร์ของคุณเป็นหนึ่งในหลาย ๆ โปรแกรมตั้งแต่ SSH dæmonถึงscreenที่ใช้เทอร์มินัลหลอก ชนิดของเทอร์มินัลนั้นขึ้นอยู่กับโปรแกรมเทอร์มินัลอีมูเลเตอร์ที่ทำงานบนฝั่งต้นแบบของสถานีหลอกและวิธีการกำหนดค่า ตัวเลียนแบบเทอร์มินัล GUI ส่วนใหญ่จะเริ่มโปรแกรมบนฝั่งทาสด้วยTERMตัวแปรที่มีค่าตรงกับการจำลองเทอร์มินัลบนฝั่งต้นแบบ โปรแกรมเช่นเซิร์ฟเวอร์ SSH จะพยายาม "ผ่าน" ประเภทอาคารที่อยู่ในปลายลูกค้าของการเชื่อมต่อ โดยปกติจะมีเมนูหรือตัวเลือกการกำหนดค่าบางอย่างให้เลือกระหว่างการจำลองเทอร์มินัล

มือที่จับ

วิธีที่ถูกต้องในการตรวจสอบความสามารถของสีนั้นไม่ใช่การเขียนรายการประเภทเทอร์มินัลในสคริปต์ของคุณ มีเทอร์มินัลมากมายที่รองรับสีมากมาย

วิธีที่ถูกต้องคือดูว่า termcap / terminfo พูดถึงประเภทเทอร์มินัลของคุณอย่างไร

color = 0
if tput Co> / dev / null 2> & 1
แล้วก็
    ทดสอบ "` tput Co` "-gt 2 && color = 1
elif tput colours> / dev / null 2> & 1
แล้วก็
    ทดสอบ "` tput colors` "-gt 2 && color = 1
Fi

อ่านเพิ่มเติม

  • Jonathan de Boyne Pollard (2018) TERM. Nosh คู่มือ โปรแกรม

ต่อไปนี้จะมีอยู่ใน .bashrc ค่าเริ่มต้นใน Debian [ -x /usr/bin/tput ] && /usr/bin/tput setaf 1 >&/dev/null && color_prompt=yesjessie: (ncurses 5.9)
thom_nic

2
นอกจากนี้ยังมีtput Coผลตอบแทน "ความสามารถในการ terminfo ไม่ทราบ" ในเจสซีและ Xenial tput colorsและtput setaf 1ทั้งสองดูเหมือนจะทำงาน แต่ผมยอมรับว่าผมไม่เข้าใจว่าทำไม
thom_nic

2

โปรดดู/ubuntu//a/614714/398785สำหรับคำตอบโดยละเอียดเกี่ยวกับสาเหตุที่ฉันคิดว่าTERM=xterm-colorวิธีการที่ไม่ถูกต้องและอูบุนตู.bashrcล้าสมัยแล้ว ฉันขอแนะนำให้คุณใช้กับTERM=xterm-256color(ซึ่งเป็นค่าเริ่มต้นตั้งแต่ gnome-terminal 3.16 แต่ยังปลอดภัยที่จะใช้กับ gnome-terminal ที่เก่ากว่า) และปรับให้.bashrcเหมาะสม


1
+1 สำหรับลิงก์ของคุณ ข้อเสนอแนะเล็ก ๆ น้อย ๆ ประโยคต่อไปนี้อาจทำให้สับสน (ก่อนอื่นฉันรู้สึกว่าคุณกำลังบอกว่าการใช้.bashrcนั้นล้าสมัยแล้ว) ".bashrc ของ Ubuntu ล้าสมัยแล้ว"
IsaacS

@IsaacS คุณมีข้อเสนอแนะวิธีการปรับปรุงหรือไม่ เช่นจะแทนที่ "ล้าสมัย" ด้วยความช่วยเหลือ "ล้าสมัย"?
egmont

1
ดูเหมือนว่าจะxterm-256colorทำให้htopรูปแบบเช่นนี้ใน Ubuntu 18.04 มีความยุ่ง
หยุดทำร้ายโมนิก้า

@OrangeDog เครื่องมือจำลองเทอร์มินัลไหน? คำถามนี้ตรงนี้และการตอบกลับของฉันมุ่งเน้นไปที่เทอร์มินัล GNOME ในขณะที่หน้าเว็บที่คุณลิงค์แสดง Konsole ข้อผิดพลาดดูเหมือนว่าเทอร์มินัลอีมูเลเตอร์ยังไม่รองรับลำดับการหลบหลีก REP ซึ่ง ncurses เริ่มใช้ในช่วงเวลานั้น VTE (เทอร์มินัล GNOME) ได้เพิ่มการรองรับใน Ubuntu 18.04 แล้วโอกาสที่ Konsole จะไม่มี ฉันสงสัยว่าความคิดเห็นของคุณที่มีความแตกแยก htop นั้นถูกต้องสำหรับ Konsole แต่ไม่ใช่สำหรับ GNOME Terminal
egmont

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