ฉันใช้ขั้วประเภทใด


51

ฉันได้ทดสอบสิ่งนี้กับทั้ง Ubuntu 12.04 และ Debian 7 เมื่อฉันทำ

echo $TERM

ฉันเข้าใจ

xterm

แต่ถ้าผมใช้แบบเลื่อนลงเมนู "ความช่วยเหลือ"> "เกี่ยวกับ" gnome terminal 3.4.1.1จากนั้นก็กล่าวว่า

นี่แปลว่าฉันกำลังใช้เพียงแค่ gnome-terminal หรือไม่? หรือเพียงแค่ xterm หรือ gnome-terminal เป็นส่วนขยายของ xterm หรือไม่? ฉันสับสน

คำตอบ:


49

มี$TERMไว้เพื่ออะไร

$TERMตัวแปรสำหรับการใช้งานโดยการใช้งานจะใช้ประโยชน์จากความสามารถของสถานีว่า

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

วิธีการทำงานคือระบบเก็บไลบรารีของเทอร์มินัลที่รู้จักและความสามารถของพวกเขา ในระบบส่วนใหญ่ที่อยู่ในนี้/usr/share/terminfo(นอกจากนี้ยังมี termcap แต่เป็นมรดกที่ไม่ได้ใช้อีกมาก)

ดังนั้นสมมติว่าคุณมีโปรแกรมที่ต้องการแสดงข้อความสีแดง มันทำให้การเรียกไปยังไลบรารี terminfo ที่บอกว่า " ให้ลำดับของไบต์ที่ฉันต้องส่งสำหรับข้อความสีแดงสำหรับเทอร์มินัล xterm " จากนั้นมันก็ใช้ไบต์และพิมพ์ออกมา คุณสามารถลองด้วยตัวเองโดยการทำ
tput setf 4; echo hiสิ่งนี้จะได้รับsetfความสามารถ terminfo และส่งผ่านพารามิเตอร์4ซึ่งเป็นสีที่คุณต้องการ


ทำไมเทอร์มินอล gnome ถึงตัวของมันเอง:

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

วิธีที่เครื่องของคุณไปถึงจุดนี้คือการโกหกว่าใครเป็นใคร ดังนั้นเทอร์มินอล gnome ของคุณจึงพูดว่า " ฉันคือ xterm "

Xterm เป็นเทอร์มินัลพื้นฐานที่มีมาตั้งแต่รุ่งอรุณของ X11 และเทอร์มินัลอีมูเลเตอร์ส่วนใหญ่สนับสนุนสิ่งที่มันรองรับ ดังนั้นโดยเทอร์มินอล gnome ที่บอกว่าเป็น xterm มีแนวโน้มที่จะมีคำจำกัดความในไลบรารี terminfo มากกว่า

ข้อเสียของการโกหกเกี่ยวกับประเภทเครื่องของคุณคือเครื่องอาจรองรับมากกว่า xterm อย่างมาก (ตัวอย่างเช่นเครื่องใหม่หลายเครื่องรองรับ 256 สีในขณะที่เครื่องเก่ารองรับเฉพาะเครื่อง 16) ดังนั้นคุณจะมีการแลกเปลี่ยนรับคุณสมบัติเพิ่มเติมหรือมีความเข้ากันได้มากขึ้น xtermอาคารส่วนใหญ่จะเลือกสำหรับการทำงานร่วมกันมากขึ้นและทำให้เลือกที่จะโฆษณาตัวเองว่าเป็น

หากคุณต้องการแทนที่สิ่งนี้เทอร์มินัลจำนวนมากจะเสนอวิธีกำหนดค่าลักษณะการทำงานบางอย่าง export TERM=gnome-terminalแต่คุณยังสามารถเพียงแค่ทำ


4
แนะนำคนที่ส่งออก $ ลงทุนจริงๆดูเหมือนว่าถูเกลือลงแผลเปิด ...
jasonwryan

1
ใช่. ฉันคาดเดาว่านักพัฒนาซ้าย gnome-ขั้ว$TERMตั้งค่าที่จะxtermหาเหตุผลที่ดี
mulllhausen

4
@mulllhausen เหตุผลที่จะอธิบายได้ดีในคำตอบของฉัน ...
แพทริค

27

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

แอปพลิเคชันโต้ตอบกับเทอร์มินัลโดยการเขียน escape sequences - ลำดับของอักขระที่มีอักขระที่ไม่สามารถพิมพ์ได้และมีเอฟเฟกต์เช่นการเลื่อนเคอร์เซอร์การลบส่วนหนึ่งของหน้าจอการเปลี่ยนสีปัจจุบัน ฯลฯ ในสมัยก่อน ชุดลำดับหนี ดังนั้นระบบปฏิบัติการรักษาฐานข้อมูลของประเภทอาคารและลักษณะของพวกเขา ฐานข้อมูลดั้งเดิมคือtermcap (“ TERMinal CAPabilities”); ระบบที่ทันสมัยจำนวนมากและการใช้งานได้เปลี่ยนterminfo ฐานข้อมูลทั้งสองถูกทำดัชนีโดยใช้ชื่อประเภทเทอร์มินัลและแอปพลิเคชันสอบถามโดยใช้ชื่อประเภทอาคารจากTERMตัวแปรสภาพแวดล้อม

ปัจจุบันอาคารส่วนใหญ่ใช้ชุดมาตรฐานของลำดับหนีTERMด้วยชุดร่วมกันไม่กี่ของนามสกุลดังนั้นคุณจะไม่เห็นค่าที่แตกต่างของ ตัวเลียนแบบเทอร์มินัล GUI ส่วนใหญ่เข้ากันได้กับxtermซึ่งเป็นเทอร์มินัล X ดั้งเดิม (ซึ่งยังคงใช้และบำรุงรักษาอยู่)

เทอร์มินัลอีมูเลเตอร์ที่แตกต่างจาก xterm อาจเพิ่มรายการของตนเองลงในฐานข้อมูลเทอร์มินัลภายใต้ชื่อของตนเอง อย่างไรก็ตามสิ่งนี้ไม่สามารถใช้กับเชลล์ระยะไกลได้ดี โปรแกรมที่รันบนเครื่อง A แต่ที่แสดงบนเครื่อง B ตัวอย่างเช่นเนื่องจากมันถูกเรียกใช้ผ่าน ssh จาก B ถึง A จำเป็นต้องค้นหาฐานข้อมูลเทอร์มินัลบนเครื่อง A. วิธีการเข้าสู่ระบบระยะไกลเช่น ssh นำไปใช้กับTERMตัวแปรสภาพแวดล้อม สิ่งนี้มีประโยชน์เฉพาะเมื่อฐานข้อมูลเทอร์มินัลของ B มีรายการสำหรับผู้ใช้ค่าบน A. ด้วยดังนั้นเทอร์มินัลอีมูเลเตอร์จำนวนมากจะติดTERM=xtermอยู่ซึ่งเป็นที่รู้จักในระดับสากล

ความแตกต่างระหว่างเทอร์มินัลโดยและขนาดใหญ่ไม่ได้มาจากวิธีที่แอปพลิเคชันโต้ตอบกับพวกเขา แต่โดยที่เทอร์มินัลโต้ตอบกับผู้ใช้และเหมาะสมกับสภาพแวดล้อมของพวกเขา ตัวอย่างเช่นเทอร์มินัล Gnome ดูดีบน Gnome และให้แท็บและสิ่งอื่น ๆ Konsole ดูดีใน KDE และให้แท็บและสิ่งอื่น ๆ urxvt มีข้อกำหนดหน่วยความจำขนาดเล็ก Console2 ทำงานบน Windows; screen และ tmux จัดเตรียมเซสชันที่สามารถเชื่อมต่อกับเทอร์มินัลพาเรนต์ที่แตกต่างกัน และอื่น ๆ TERM=xtermเนื่องจากไม่มีคุณสมบัติเหล่านี้สร้างความแตกต่างเพื่อการใช้งานที่ทำงานอยู่ในสถานีส่วนใหญ่เลียนแบบขั้วใช้

ในการค้นหาว่าเทอร์มินัลเชลล์ใดรันอยู่ให้ดูที่พาเรนต์ของเชลล์:

ps -p$PPID

การวิ่งps -p$PPIDดูเหมือนจะไม่บอกฉันว่าฉันกำลังวิ่งอะไรอยู่ หรืออย่างน้อยก็ไม่ใช่ในแบบที่ฉันเข้าใจ คุณมีตัวอย่างเอาต์พุต / การตอบกลับหรือไม่?
user3731622

@user ผลลัพธ์เป็นจำนวนตัวเลขและตัวย่อที่มีความลับตามด้วยบรรทัดคำสั่ง ภายใต้สถานการณ์ส่วนใหญ่บรรทัดคำสั่งคือบรรทัดที่เริ่มต้นโปรแกรมจำลองเทอร์มินัลที่เชลล์ทำงานอยู่
Gilles 'หยุดความชั่วร้าย'

12

ตัวแปรสภาวะแวดล้อม TERM ไม่ได้หมายถึงเทอร์มินัลที่คุณใช้

การอ้างอิง gnu.org :

TERM ตัวแปรสภาพแวดล้อมมีตัวระบุสำหรับความสามารถของหน้าต่างข้อความ คุณสามารถรับรายการโดยละเอียดของความสามารถในการใช้งานเหล่านี้โดยใช้คำสั่ง> 'infocmp' โดยใช้ 'man 5 terminfo' เป็นข้อมูลอ้างอิง

เมื่อสร้างข้อความที่มีคำสั่งสีฝังตัว msgcat จะดูที่ตัวแปร TERM หน้าต่างข้อความในปัจจุบันรองรับอย่างน้อย 8 สี อย่างไรก็ตามบ่อยครั้งที่หน้าต่างข้อความรองรับ 16 สีขึ้นไปแม้ว่าตัวแปร TERM จะถูกตั้งค่าเป็นตัวระบุที่แสดงถึงสีที่รองรับเพียง 8 สีเท่านั้น มันอาจคุ้มค่าที่จะตั้งค่าตัวแปร TERM ให้เป็นค่าอื่นในกรณีเหล่านี้:

xtermเป็นกรณีส่วนใหญ่ที่สร้างขึ้นด้วยการสนับสนุนสำหรับ 16 สี มันสามารถสร้างด้วยการรองรับ 88 หรือ 256 สี (แต่ไม่ใช่ทั้งคู่) คุณสามารถลองตั้งค่า TERM เป็น xterm-16color, xterm-88color หรือ xterm-256color rxvt

rxvtมักจะถูกสร้างขึ้นด้วยการสนับสนุนสำหรับ 16 สี คุณสามารถลองตั้ง TERM เป็น rxvt-16color konsole

konsoleก็มักจะถูกสร้างขึ้นด้วยการสนับสนุนสำหรับ 16 สี คุณสามารถลองตั้งค่า TERM เป็น konsole-16color หรือ xterm-16color

หลังจากตั้งค่า TERM แล้วคุณสามารถตรวจสอบได้โดยเรียกใช้ 'msgcat --color = test' และดูว่าเอาต์พุตดูเหมือนแผนที่สีที่สมเหตุสมผลหรือไม่ TERM ตัวแปรสภาพแวดล้อมมีตัวระบุสำหรับความสามารถของหน้าต่างข้อความ คุณสามารถรับรายการโดยละเอียดของความสามารถในการใช้งานเหล่านี้โดยใช้คำสั่ง 'infocmp' โดยใช้ 'man 5 terminfo' เป็นข้อมูลอ้างอิง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.