มีตัวแปรสภาพแวดล้อมบ้างไหม?
ใช่. มันเป็น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-monoGNU 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ไม่ได้คำนึงถึงสิ่งนี้ แต่คาดหวังว่าจะมีการตัดบรรทัดในทันทีและการแสดงสีที่ผิดพลาด
เอาต์พุตสีไม่ใช่เรื่องง่าย
อ่านเพิ่มเติม