ฉันต้องการเปลี่ยนสี (พื้นหลังแบบอักษรเบื้องหน้า) ของ xterm ของฉันจาก commandline ฉันได้ยินมาว่าสิ่งนี้สามารถทำได้โดยใช้ลำดับการหลบหนีของ ANSI
ถ้าเป็นไปได้:
- เป็นอย่างไรบ้าง?
- ฉันสามารถใช้ชื่อสีหรือต้องใช้รหัส RGB ได้หรือไม่
ฉันต้องการเปลี่ยนสี (พื้นหลังแบบอักษรเบื้องหน้า) ของ xterm ของฉันจาก commandline ฉันได้ยินมาว่าสิ่งนี้สามารถทำได้โดยใช้ลำดับการหลบหนีของ ANSI
ถ้าเป็นไปได้:
คำตอบ:
ANSI escape sequences ประกอบด้วยลำดับของอักขระที่เริ่มต้นด้วยอักขระ Escape, อักขระ 27. อักขระตัวถัดไปมักจะเป็น open-square-bracket
คำสั่ง echo สามารถส่งอักขระ escape หากคุณระบุ-e
และใช้\e
สำหรับ escape
มาตรฐาน ANSI กำหนด 8 สีรวมถึงโหมดสว่างทำให้มีความเป็นไปได้ทั้งหมด 16 ค่า ลำดับคือ:
\e[<number>m
ในกรณีที่<number>
เป็นหนึ่งใน:
เบื้องหน้า:
พื้นหลัง:
47 ขาว
0 รีเซ็ตทั้งหมด
ดังนั้นเพื่อให้พื้นหน้าของคุณมีสีแดงและพื้นหลังเป็นสีเหลือง:
$ echo -e "\e[31m\e[43m"
และเพื่อเปิดใช้งานตัวหนา:
$ echo -e "\e[1m"
แน่นอนคุณสามารถรวมทั้งหมดเข้าด้วยกัน:
$ echo -e "\e[31m\e[43m\e[1m"
มีหลายรหัสการหลบหนีอื่น ๆ สำหรับการทำสิ่งอื่น ๆ
ตัวอย่างเช่น - ล้างหน้าจอและเลื่อนเคอร์เซอร์ไปที่มุมบนซ้าย:
$ echo -e "\e[2J\e[1;1H"
ซึ่งมีประโยชน์เมื่อเปลี่ยนสี:
$ echo -e "\e[31m\e[43m\e[1m\e[2J\e[1;1H"
ซึ่งจะเปลี่ยนสีล้างหน้าจอและวางเคอร์เซอร์ที่ด้านบนซ้าย เกือบซ้ายบน เสียงสะท้อนทำให้รถกลับคืนดังนั้นมันจึงเลื่อนลงมาตามเส้น คุณสามารถเพิ่ม-n
echo เพื่อป้องกันสิ่งนี้หากคุณจู้จี้จุกจิก
หากคุณเลอะทั้งหมดและไม่เห็นสิ่งที่คุณกำลังพิมพ์คุณสามารถรีเซ็ตสีของเทอร์มินัลเป็นปกติโดยกด:
Ctrl+v [ 0 m Return
สิ่งที่คุณหวังคือพรอมต์คำสั่ง มันจะเอ่ยถึงคำสั่งที่ไม่รู้จัก แต่คุณจะสามารถเห็นสิ่งที่คุณทำอีกครั้ง
echo -ne '\e[31;43m'
(แทนด้านบนecho -e "\e[31m\e[43m"
)
โปรดทราบว่า Xterms ที่ทันสมัยรองรับสี 32 บิต!
ตัวอย่างง่ายๆ ในการตั้งค่าพื้นหลังสีม่วงเข้มที่สวยงาม (เฮ้แต่ละรายการเป็นของตัวเอง) มูลค่า # 53186f คุณต้องทำ:
echo -ne "\033]11;#53186f\007"
โปรดทราบว่าการดำเนินการนี้จะเปลี่ยนสีของทั้งหน้าต่างทันทีไม่ใช่เฉพาะข้อความที่ตามมา นี่เป็นสิ่งที่ดีโดยเฉพาะอย่างยิ่งสำหรับการทำให้หน้าต่างแตกต่างอย่างเห็นได้ชัดหลังจาก ssh'ing ไปยังเซิร์ฟเวอร์ (ตัวอย่าง) ใส่ 'echo' ด้านบนลงใน. bashrc และเทอร์มินัลของคุณจะเปลี่ยนสีโดยอัตโนมัติเมื่อคุณเข้าสู่เซิร์ฟเวอร์นั้น (แต่จะไม่เปลี่ยนกลับเมื่อคุณกด Ctrl-D)
คุณสามารถใช้เวลาเป็นชั่วโมงในการค้นหาสิ่งนี้ - เอกสารส่วนใหญ่พูดถึงสี ANSI 16 สีดั้งเดิมเท่านั้น
แหล่งที่มา: http://www.steike.com/code/xterm-colors/ และhttp://rtfm.etla.org/xterm/ctlseq.html (ดูที่ "การควบคุมระบบปฏิบัติการ")
โปรดทราบ: ลำดับการหลบหนีด้านบนนั้นใช้ได้สำหรับ XTerms และอาจใช้ไม่ได้กับการใช้งานอื่น ๆ ของ "เทอร์มินัลจำลองหน้าต่าง" XTerm-like "เลียนแบบเทอร์มินัลที่อาจ" ดู "เหมือน XTerm ตัวอย่างเช่น "gnome-terminal" หรือ "konsole" มีลำดับการหลีกเลี่ยงที่แตกต่างกันหรืออาจไม่ใช้การเปลี่ยนสีเลย
ใช่. ขั้ว ANSI สนับสนุนรหัสหนี ANSI แต่ละรหัสControl Sequence Introducer
( CSI
) ในรูปแบบต่อไปนี้:
ESC[<<<CODE>>>
อักขระ Ascii 27
( ESC
อักขระ) หรือ1b
เลขฐานสิบหกตามด้วยวงเล็บเหลี่ยมด้านซ้ายจากนั้นตัวอักษรแสดงถึงการดำเนินการที่จะใช้
โปรดทราบว่า;
อาจมีการจัดหารายการพารามิเตอร์ที่แยกจากกันโดยตรงก่อน<<<CODE>>>
พารามิเตอร์
ตอนนี้สีใช้ชุดย่อยของCSI
รหัส, Select Graphic Rendition
รหัส เหล่านี้อยู่ในรูปแบบ:
ESC[<<<SGR>>>m
รหัสผ่านเป็นพารามิเตอร์SGR
CSI
เกี่ยวข้องกับคำถามของคุณคือSGR
รหัส 30-49 รหัส 30-39 ตั้งค่าสีพื้นหน้า รหัส 40-49 ตั้งค่าสีพื้นหลัง
30 - Foreground Black
31 - Foreground Red
32 - Foreground Green
33 - Foreground Yellow
34 - Foreground Blue
35 - Foreground Magenta
36 - Foreground Cyan
37 - Foreground White
40 - Background Black
41 - Background Red
42 - Background Green
43 - Background Yellow
44 - Background Blue
45 - Background Magenta
46 - Background Cyan
47 - Background White
รหัส 38 และ 48 เป็นรหัสพิเศษ สิ่งเหล่านี้คือสิ่งที่อนุญาตให้คุณใช้ค่า RGB รูปแบบเหล่านี้คือ:
ESC[38;2;<r>;<g>;<b>m (Foreground)
ESC[48;2;<r>;<g>;<b>m (Background)
หมายเหตุ: ทางเลือกที่ใช้ \x1b[<3 or 4>8;5;<web safe color index>m
ได้แก่ ด้วยการใช้งานนี้มีการเข้ารหัสสีที่แตกต่างอย่างสิ้นเชิง ดูลิงค์ที่ด้านบนของคำตอบนี้สำหรับข้อมูลเพิ่มเติม
รหัส 39 และ 49 ตั้งค่าสีพื้นหน้าและสีพื้นหลังให้เป็นค่าเริ่มต้นซึ่งกำหนดไว้บนพื้นฐานแบบเทอร์มินัล
ในทางปฏิบัติสี 30-37 40-47 นั้นแตกต่างจากสีที่ป้ายบอกไว้เล็กน้อย
0 - Black
1 - Darker Red
2 - Darker Green
3 - Dark/Yellow or Brown (varies between terminals)
4 - Dark Blue
5 - Dark Magenta
6 - Dark Cyan
7 - Light Grey
เพื่อให้ได้แสงสีที่คุณใช้ SGI 1
สำหรับตัวหนา ตัวหนาเป็นชื่อที่ทำให้เข้าใจผิด มันไม่ได้ทำให้ตัวอักษรหนา มันเพิ่มความสว่างของข้อความ ด้วยตัวหนาที่ใช้สีจึงกลายเป็น:
0 - Dark Grey
1 - Bright Red
2 - Bright Green
3 - Bright Yellow
4 - Bright Blue
5 - Bright Magenta
6 - Bright Cyan
7 - White
แจ้งให้ทราบล่วงหน้า: ตัวเลขสองช่วงสีสุดท้ายมีความเกี่ยวข้องกับทั้งด้านหน้าและพื้นหลัง ( <index> + (30 or 40)
)
หากต้องการลบสไตล์ทั้งหมด (กลับสู่โหมดปกติ / ปกติ) ให้ใช้SGR
0
CSI
รหัสไม่ใช่กราฟิกทั้งหมด ตัวอย่างเช่นESC[2J
จะล้างเครื่องของคุณ ESC[<y>;<x>H
ตั้งค่าตำแหน่งเคอร์เซอร์ (1 ดัชนี) ดูบทความวิกิพีเดียสำหรับข้อมูลเพิ่มเติม
หมายเหตุ: ในการทดสอบเหล่านี้ใช้งานหรือecho -e
printf
หมายเหตุ: "^ [" เป็นตัวหนีและถูกแทรกด้วย CTRL-V, CTRL- [และ ^ G เป็นตัวอักษรระฆังซึ่งใส่ด้วย CTRL-V, CTRL-G
บล็อกต่อไปนี้อยู่ใน. bash_profile ของฉันและตรวจสอบให้แน่ใจว่า xterms ของฉันในระบบนี้เป็นสีขาว - ดำ - ดำเสมอแม้หลังจากเข้าสู่ระบบอื่นที่อาจเปลี่ยนสีของฉัน
perl -e '$e=chr(27);print "${e}[37m ${e}[40m ${e}[2J ${e}[1;1H";'
export PS1='^[[37m^[]0;${HOST}: ${PWD}^G^[[40m${USER}@${HOST}:${PWD}
--> '
ตรวจสอบโครงการScriptEchoColor
มันทำอย่างสมบูรณ์ในสคริปต์ทุบตี
มันมีแพคเกจสำหรับ Ubuntu ที่นี่
แต่สคริปต์เหล่านี้สามารถติดตั้งบน distro ใด ๆ ถ้าคุณรู้วิธี (สามารถดาวน์โหลดล่าสุดจากคอมไพล์ของมัน)
คุณสามารถใช้ชื่อสีที่สั้นลงหรือขยายได้เช่น:
echoc "@rRedFg@{/blue}BlueFg@{/GREEN}GreenBg"
ตัวอย่าง:
นอกจากนี้ตรวจสอบให้แน่ใจว่าได้ดูxtermcontrolเพื่อควบคุม xterm ในตัวของมันเอง (ไม่ใช่แค่ตัวละคร)
ในบรรดารหัส ANSI CSIจำนวนมากนั้นเรียกว่า SGR หรือ Select Rendition กราฟิค นี่คือ ESC,, [
พารามิเตอร์, m
โดยที่พารามิเตอร์เป็นหนึ่งหรือมากกว่าจำนวนเต็มในรูปแบบ ASCII, คั่นด้วยเครื่องหมายอัฒภาค พารามิเตอร์ SGR ที่แตกต่างกันมีการระบุไว้ในหน้าวิกิพีเดียด้านบน (แม้ว่าจะไม่ได้เข้าไปดูรายละเอียดทั้งหมดสำหรับทั้งหมด)
พารามิเตอร์บางตัวเช่น1
(ตัวหนาหรือเพิ่มความเข้ม) และ31
(ตัวอักษรสีแดง) เป็นแบบสแตนด์อโลนและสามารถใช้ทีละรายการหรือรวมกันได้เช่นในESC[31m
หรือESC[1;31m
เพื่อให้ข้อความพื้นหน้าสีแดงมาตรฐานและตัวหนาสีแดงตามลำดับ
พารามิเตอร์อื่น ๆ ใช้ตัวเองซึ่งมีให้หลังจากรหัสเป็นตัวเลขที่คั่นด้วยเครื่องหมายอัฒภาคมากขึ้น ตัวอย่างเช่นESC[38;5;219m
จะแสดงข้อความเบื้องหน้าในจำนวนสีที่ขยาย 219 และESC[38;2;150;100;50m
จะแสดงในสีที่มีค่า RGB 150, 100, 50 ในกรณีนี้38
คือคำสั่ง "ชุดฉากหน้าสีขยาย" ซึ่งมักจะเต็มไปด้วย คำสั่งย่อย คำสั่งย่อย2
ใช้พารามิเตอร์สามตัวคือค่าของส่วนประกอบสีแดงสีเขียวและสีน้ำเงิน แตกต่างกันคำสั่งย่อย5
ใช้ค่าเพียงหนึ่งค่าเพิ่มเติมจำนวนตั้งแต่ 0 ถึง 255 ระบุสีจากตารางที่เทอร์มินัลถูกกำหนดค่าด้วย
ฟังก์ชั่นเชลล์ต่อไปนี้มีประโยชน์ในการใช้รหัสเหล่านี้:
sgr() {
local codes=${1:-0}; shift
for c in "$@"; do codes="$codes;$c"; done
echo -n -e "\e[${codes}m"
}
คุณสามารถใช้สิ่งนี้:
normal=$(sgr 0)
red=$(sgr 31)
echo "Text can be $(sgr 1)made boldface$(sgr 0)" \
" or ${red}colored red${normal}" \
" or $(sgr 31 1)even both at the same time$(sgr)."
โปรดทราบว่าหากคุณไม่มีพารามิเตอร์ให้กับsgr()
ค่าเริ่มต้นเป็นรหัส SGR 0 ซึ่งหมายถึงการปิดคุณลักษณะทั้งหมดการรีเซ็ตข้อความเป็นค่าเริ่มต้นสำหรับเทอร์มินัลนั้น
ESC[38
... m
และESC[38
... m
สามารถ / ควร (ขึ้นอยู่กับแหล่งข้อมูลของคุณ - สิ่งที่ดีที่สุดที่เป็นอยู่ฉันเชื่อว่าitu.int/rec/T-REC-T.416-199303-I ) ควรใช้ สงวนไว้เป็นอย่างอื่นอักขระ:
(เพื่อแยกองค์ประกอบพารามิเตอร์ ) เพื่อให้;
ใช้เฉพาะระหว่างสตริงพารามิเตอร์ที่สมบูรณ์- เช่นESC[38;2;150;100;50m
ควรจะเขียนESC[38:2::150:100:50m
...
2
และถึง150
- อย่างที่ไม่มีใครรู้ว่าได้กำหนดไว้ว่าควรใช้ค่าใดในการใช้ค่าเริ่มต้นที่ว่างเปล่า - แต่มักพลาดไป และการใช้;
เป็นตัวคั่นเท่านั้นทำให้ไม่สามารถดำเนินการข้อมูลได้อย่างน่าเชื่อถือตามข้อกำหนด