แต้มสีให้ Terminal ด้วย Shell color codes
เวลาเราเขียนโปรแกรมแล้วไปทดสอบบนหน้า Terminal ขาวๆ ดำๆ อาจจะรู้สึกเบื่อกันบ้างนะฮะ ดังนั้น บล็อกนี้จะขอเล่าวิธีใส่สีเข้าไปให้ไม่จืดชืดล่ะ
ตัวอย่างแบบ extreme อันนี้ก็อาจจะเกินไปนิด แต่เห็นภาพนะฮะ
Shell color codes
Terminal console ทำได้ดีกับการแสดงผลข้อความ ตรงนี้แหละ เราเลยสามารถเติมข้อความที่เป็นรหัสเข้าไปบอกให้มันแสดงสีๆ ได้ ซึ่งรหัสที่ว่า มันมีหน้าตาแบบนี้ฮะ \033[...m
เราจะมาดูกันว่า จะใช้ได้ยังไงบ้าง ซึ่งผมก็มีเตรียมให้แล้วทั้ง Python และ Shell script เลยฮะ
ใครใจร้อน สามารถไปดูตัวเต็มที่ repo ตามลิงก์ข้างล่างนี้เลย
ใช้กับ Python
In the repo, I have created a class of constants of shell color codes. It looks as below.
module
ใน repo ผมเขียน class เก็บค่าคงที่ของ shell color code เอาไว้ หน้าตาประมาณนี้ฮะ
อันนี้เป็นแค่ส่วนหนึ่งนะฮะ ของจริงมีเยอะกว่านี้ ดูใน repo ได้ฮะ
หยิบมาใช้
พอตอนจะใช้ ก็แค่ import มันเข้ามาแล้วเลือกค่า code ที่อยากได้ใส่ไว้ข้างหน้าข้อความที่ต้องการแต่งสี ข้อความนั้นก็จะเป็นสีที่กำหนดไปจนสุด string หรือเราเลือกใส่ default color code ซึ่งผมกำหนดชื่อไว้ว่า RESET
( \033[0m
) ฮะ
แบบนี้
ถ้าต้องการอ่านเพิ่มเติมเกี่ยวกับ regex ผมมีบล็อกเขียนไว้ก่อนหน้านี้แล้ว ตามลิงก์ข้างล่างนี้เลยฮะ
ล้างค่า color code
ทีนี้ถ้าเราอยาก clear color code ทั้งหมดล่ะ ต้องมาลบเองรึเปล่า ไม่ต้องฮะ ผมก็มีเขียน function ไว้เรียบร้อยแล้วเหมือนกัน
ผมใช้ library re
และ function .sub()
เพื่อแทนที่ข้อความ โดยเลือก regex เป็น r"\033\[[\d;]+m"
หมายความว่า ส่วนไหนของข้อความที่ขึ้นต้นด้วย \033[
ตามด้วยตัวเลขหรือ comma และจบด้วย m
จะถูกแทนที่ด้วย empty string เทียบเท่าการลบส่วนนั้นทิ้งไปนั่นแหละฮะ
ผลลัพท์
เนี่ย หน้าตาตอน run ออกมาแล้ว ผมเขียนให้แสดงทั้งที่ใส่ color code และที่ล้างค่าแล้ว
ใช้กับ Shell script
รอบนี้กับ Shell ก็เขียนคล้ายกับ Python นะฮะ แต่มีจุดต่างนิดหน่อย
module
เป็นแค่ส่วนหนึ่งของที่อยู่ใน repo นะฮะ
หยิบมาใช้
เริ่มด้วย source
file แล้วก็ใช้งานได้เลยฮะ อ้อ อย่าลืมเติม RESET
( \033[0m
) เมื่อจบข้อความที่ต้องการ จะได้สีกลับมาเป็นแบบเดิมฮะ
ล้างค่า color code
ใช้ regex เหมือนกัน แต่เป็น regex คนละตัวกันฮะ
รอบนี้เราจะใช้ [^[:print:]]\[[0-9;]+m
เพราะว่า \033
มันเป็น non-printable character หรือตัวขระที่จะไม่แสดงออกมาบน console กลายเป็นว่า เรากำลังมองหาข้อความตรงส่วนที่ ไม่ได้ขึ้นต้นด้วย printable characters แล้วตามด้วย [
และตัวเลขหรือ comma และจบด้วย m
ใช้ sed
และมี -r
flag หมายถึง extended regex ฮะ
รวมกันเป็น function นี้ เพื่อใช้ลบ color codes ใน Shell นั่นเองฮะ
ผลลัพท์
References
- How do I print colored text to the terminal? https://stackoverflow.com/questions/287871/how-do-i-print-colored-text-to-the-terminal
- Replace non-printable characters in perl and sed https://unix.stackexchange.com/a/201753
แก้ไข
2023-08-19: เปลี่ยนจาก "Bash" เป็น "Shell" เนื่องจาก color code นี้สามาถใช้ได้กับ Shell script ไหนก็ได้ ไม่จำกัดว่าเป็นแค่ Bash ฮะ