มีตัวแปรสภาพแวดล้อมบ้างไหม?
ใช่. มันเป็นTERM
ตัวแปรสภาพแวดล้อม เนื่องจากมีหลายสิ่งที่ใช้เป็นส่วนหนึ่งของกระบวนการตัดสินใจ
เป็นการยากที่จะพูดคุยที่นี่เนื่องจากบางโปรแกรมไม่เห็นด้วยกับผังการตัดสินใจเดียว ในความเป็นจริง GNU ที่grep
กล่าวถึงในคำตอบของ M. Kitt เป็นตัวอย่างที่ดีของค่าผิดปกติที่ใช้กระบวนการตัดสินใจที่ค่อนข้างผิดปกติกับผลลัพธ์ที่ไม่คาดคิด โดยทั่วไปแล้วดังนั้น:
isatty()
มาตรฐานการส่งออกจะต้องเป็นอุปกรณ์ปลายทางที่กำหนดโดย
- โปรแกรมต้องสามารถค้นหาเร็กคอร์ดสำหรับชนิดเทอร์มินัลในฐานข้อมูล termcap / terminfo
- ดังนั้นจึงต้องมีเป็นประเภทอาคารที่จะมองขึ้น
TERM
ตัวแปรสภาพแวดล้อมจะต้องมีอยู่และความคุ้มค่าของมันจะต้องตรงกับบันทึกฐานข้อมูล
- ดังนั้นจะต้องมีฐานข้อมูล terminfo / termcap ในการใช้งานบางอย่างของระบบย่อยตำแหน่งของฐานข้อมูล termcap สามารถระบุได้โดยใช้
TERMCAP
ตัวแปรสภาพแวดล้อม ดังนั้นในการใช้งานบางอย่างมีตัวแปรสภาพแวดล้อมที่สอง
- เร็กคอร์ด termcap / terminfo ต้องระบุว่าชนิดเทอร์มินัลรองรับสี มี
max_colors
ฟิลด์ใน terminfo ไม่ได้ตั้งค่าสำหรับประเภทเทอร์มินัลที่ไม่มีความสามารถด้านสี อันที่จริงมีระเบียบแบบ terminfo สำหรับทุกประเภทเทอร์มินัล colourable มีบันทึกอื่นที่มี-m
หรือ-mono
ผนวกเข้ากับชื่อที่ระบุความสามารถไม่มีสี
- เร็กคอร์ด termcap / terminfo ต้องจัดเตรียมวิธีสำหรับโปรแกรมเพื่อเปลี่ยนสี มี
set_a_foreground
และset_a_background
ฟิลด์ใน terminfo
มันซับซ้อนกว่าการตรวจสอบเพียงisatty()
เล็กน้อย มันจะทำต่อไปซับซ้อนโดยหลายสิ่งหลายอย่าง:
- บางแอปพลิเคชันเพิ่มตัวเลือกบรรทัดคำสั่งหรือการตั้งค่าสถานะที่แทนที่การ
isatty()
ตรวจสอบเพื่อให้โปรแกรมเสมอหรือไม่เคยถือว่ามันมีขั้ว (colourable) เป็นเอาท์พุท ตัวอย่าง:
- GNU
ls
มี--color
ตัวเลือกบรรทัดคำสั่ง
- BSD
ls
ลักษณะที่CLICOLOR
(กรณีที่ไม่มีความหมายไม่เคย ) และCLICOLOR_FORCE
(การแสดงตนความหมายเสมอ ) ตัวแปรสภาพแวดล้อมและกีฬา-G
ตัวเลือกบรรทัดคำสั่ง
- บางการใช้งานที่ไม่ได้ใช้ termcap / terminfo
TERM
และมีการตอบสนองเดินสายค่าของ
- ไม่ใช่เทอร์มินัลทั้งหมดที่ใช้ลำดับ SGMA ของ ECMA-48 หรือ ISO 8613-6 ซึ่งมีชื่อเรียกว่า "ANSI escape sequences" ที่ผิดเล็กน้อยเพื่อเปลี่ยนสี กลไก termcap / terminfo ได้รับการออกแบบมาเพื่อป้องกันแอปพลิเคชันจากความรู้โดยตรงของลำดับการควบคุมที่แน่นอน (นอกจากนี้ยังมีข้อโต้แย้งว่าไม่มีใครใช้ลำดับ ISO 8613-6 SGR เพราะทุกคนเห็นด้วยกับข้อผิดพลาดของการใช้เซมิโคลอนเป็นตัวคั่นสำหรับลำดับ SGR สี RGB มาตรฐานจริงระบุโคลอน)
ดังที่กล่าวไว้ GNU grep
จริงแสดงถึงความซับซ้อนเพิ่มเติมเหล่านี้ มันไม่ได้ปรึกษา termcap / terminfo, hardwires ลำดับการควบคุมเพื่อปล่อยและ hardwires การตอบสนองTERM
ต่อตัวแปรสภาพแวดล้อม
พอร์ต Linux / Unix ของมันมีรหัสนี้ซึ่งจะช่วยให้ colourization เฉพาะเมื่อTERM
ตัวแปรสภาพแวดล้อมที่มีอยู่และความคุ้มค่าไม่ตรงกับชื่อเดินสายdumb
:
int
should_colorize (เป็นโมฆะ)
{
char const * t = getenv ("TERM");
ส่งคืน t && strcmp (t, "dumb")! = 0;
}
ดังนั้นแม้ว่าคุณTERM
จะเป็นxterm-mono
GNU grep
จะตัดสินใจที่จะปล่อยสีแม้ว่าโปรแกรมอื่น ๆ เช่นvim
จะไม่
พอร์ต Win32 ของมันมีรหัสนี้ซึ่งจะช่วยให้ colourization ทั้งเมื่อTERM
ตัวแปรสภาพแวดล้อมไม่อยู่หรือเมื่อมันมีอยู่และความคุ้มค่าไม่ตรงกับชื่อเดินสายdumb
:
int
should_colorize (เป็นโมฆะ)
{
char const * t = getenv ("TERM");
กลับมาแล้ว! (t && strcmp (t, "dumb") == 0);
}
grep
ปัญหาของGNU เกี่ยวกับสี
การเปลี่ยนสีของ GNU grep
นั้นมีชื่อเสียง เพราะมันไม่ได้ทำงานอย่างถูกต้องในการสร้างเอาท์พุทของเทอร์มินัล แต่เพียงแค่ทำให้เกิดความผิดพลาดในลำดับการควบคุมเดินสายที่จุดต่าง ๆ ของเอาท์พุตด้วยความหวังว่ามันจะดีพอ
สถานการณ์เหล่านี้เป็นสิ่งที่จำเป็นต้องทำในสิ่งที่อยู่ทางด้านขวามือของเครื่อง โปรแกรมที่ใช้งานเทอร์มินัลเอาต์พุตอย่างถูกต้องจะต้องคำนึงถึงระยะขอบขวาโดยอัตโนมัติ นอกจากจะเป็นไปได้เล็กน้อยว่าอาจขั้วไม่ได้พวกเขา ( ได้แก่auto_right_margin
ฟิลด์ใน terminfo) พฤติกรรมของอาคารที่จะมีอัตรากำไรขั้นต้นที่เหมาะสมโดยอัตโนมัติมักจะตามแบบอย่างธันวาคม VT ของที่รอการตัดสาย GNU grep
ไม่ได้คำนึงถึงสิ่งนี้ แต่คาดหวังว่าจะมีการตัดบรรทัดในทันทีและการแสดงสีที่ผิดพลาด
เอาต์พุตสีไม่ใช่เรื่องง่าย
อ่านเพิ่มเติม