การเปลี่ยนสีของข้อความและพื้นหลังของเทอร์มินัล?


72

ฉันสามารถเปลี่ยนสีผ่านการกำหนดลักษณะได้ แต่ฉันจะเปลี่ยนสีพื้นหลังและสีข้อความของเทอร์มินัลผ่านบรรทัดคำสั่งได้อย่างไร


อย่างถาวรหรือบังเอิญ?
Jacob Vlijm

dconfนอกจากนี้คุณยังสามารถใช้ ฉันได้เขียนคำตอบสำหรับคำถามที่คล้ายกันก่อนหน้านี้: askubuntu.com/a/628129/295286
Sergiy Kolodyazhnyy

\033[00;34mFOO\033[00m
Rafael Barros

คำตอบ:


50

บนเทอร์มินัลที่เข้ากันได้กับ XTerm / ANSI (เช่นxtermและgnome-terminal) คุณสามารถตั้งค่าสีโดยใช้พาเล็ตที่ใหญ่กว่าจากพาเลต 8/16 สีที่เป็นค่าเริ่มต้น (ตัวอย่างเช่นการใช้พาเล็ต 88 สี 256 สีหรือ 16777216- สี (RGB) ; ทั้งสองxtermและgnome-terminalรองรับทั้ง 256 สีและ 16777216- สี (RGB) จานสี); โปรดทราบว่าเชลล์อาจลบล้างสิ่งนี้ (ในกรณีนี้คือ for zsh)

ต่อไปนี้เป็นสคริปต์เพื่อแสดงรายการสีในจานสี 256 สีพร้อมกับรหัสสี ANSI ในเทอร์มินัลที่เข้ากันได้กับ XTerm / ANSI พร้อมการรองรับจานสี 256 สี:

#!/bin/bash
for((i=16; i<256; i++)); do
    printf "\e[48;5;${i}m%03d" $i;
    printf '\e[0m';
    [ ! $((($i - 15) % 6)) -eq 0 ] && printf ' ' || printf '\n'
done

screenshot1

ภาพหน้าจอ

ขึ้นอยู่กับว่าคุณต้องการใช้สีกับพื้นหน้าหรือพื้นหลังใช้<fg_bg>ค่า38หรือ48(ตามลำดับ) ในคำสั่งต่อไปนี้:

printf '\e[<fg_bg>;5;<ANSI_color_code>m'

ตัวอย่างเช่นการตั้งค่าสีพื้นหน้า ( <fg_bg>= 38) เป็นสีแดง ( <ANSI_color_code>= 196) และสีพื้นหลัง ( <fg_bg>= 48) เป็นสีดำ ( <ANSI_color_code>= 0):

printf '\e[38;5;196m Foreground color: red\n'
printf '\e[48;5;0m Background color: black\n'

screenshot3

จำเป็นต้องวาดพรอมต์ที่ใช้printf '\e[K'เพื่อให้สีพื้นหลังใช้กับทั้งบรรทัดและเพื่อให้สีพื้นหน้าใช้กับเคอร์เซอร์:

screenshot4

สิ่งเดียวกันสามารถทำได้โดยใช้ค่า RGB แทนรหัสสี ANSI ในเทอร์มินัลที่ใช้งานร่วมกันได้ ขึ้นอยู่กับว่าคุณต้องการใช้สีกับพื้นหน้าหรือพื้นหลังใช้<fg_bg>ค่า38หรือ48(ตามลำดับ) ในคำสั่งต่อไปนี้:

printf '\e[<fg_bg>;2;<R>;<G>;<B>m'

ตัวอย่างเช่นการตั้งค่าสีพื้นหน้า ( <fg_bg>= 38) เป็นสีแดง ( <R>= 255, <G>= 0, <B>= 0) และสีพื้นหลัง ( <fg_bg>= 48) เป็นสีดำ ( <R>= 0, <G>= 0, <B>= 0):

printf '\e[38;2;255;0;0m Foreground color: red\n'
printf '\e[48;2;0;0;0m Background color: black\n'

screenshot5

อีกครั้งจำเป็นต้องวาดพรอมต์ที่ใช้printf '\e[K'เพื่อให้สีพื้นหลังใช้กับทั้งบรรทัดและเพื่อให้สีพื้นหน้าใช้กับเคอร์เซอร์:

screenshot6

ใช้วิธีใดวิธีหนึ่งคุณสามารถใช้printf '\e[0m'เพื่อรีเซ็ตแอตทริบิวต์ทั้งหมด:

screenshot7


1
ทั้งสองxtermและgnome-terminalรู้จัก \ e [38/48; 2; R; G; Bm ลำดับสีจริงของการหลบหนี อย่างไรก็ตามxtermปัดเศษสีจริงให้ใกล้เคียงที่สุดในจานสี 256 สี gnome-terminalแสดงสีจริงที่แน่นอนที่กำหนดในลำดับการหลีกเลี่ยง
egmont

2
\ e [K เป็นสิ่งที่อันตราย; ในอีมูเลเตอร์บางตัว (เช่นxterm) หากเคอร์เซอร์อยู่ที่ขอบด้านขวาสุด (แสดงด้วยสายตาในคอลัมน์ขวาสุด แต่มีเหตุผลมากกว่านั้นเนื่องจากตัวละครถูกพิมพ์ไปแล้วในคอลัมน์ด้านขวาสุด) อักษรตัวสุดท้ายจะถูกถอดออก ดูเช่นbugzilla.gnome.org/show_bug.cgi?id=740789หรือsavannah.gnu.org/bugs/?36831
egmont

การแก้ไขตัวเอง: หากคุณปล่อย \ e [K ที่จุดเริ่มต้นของบรรทัด (ที่จุดเริ่มต้นของพรอมต์แทนที่จะอยู่ที่ปลายสาย) แน่นอนว่ามันปลอดภัย (จะไม่ทำงานกับพรอมต์หรือคำสั่งหลายบรรทัด)
egmont

@egmont ขอบคุณสำหรับข้อมูลที่เป็นประโยชน์ฉันเห็นว่าใน Bugzilla GNOME ที่ถูกทำเครื่องหมายว่าเป็นแบบคงที่ในกรณีนี้หรือไม่ ฉันไม่สามารถทดสอบได้ในขณะนี้ดังนั้นฉันจะทำในภายหลังเพื่อตรวจสอบว่านี่เป็นกรณี (เว้นแต่คุณจะตอบก่อน) และรวมข้อมูลนั้นไว้ในคำตอบ
kos

Gnome-terminal รุ่นใหม่ล่าสุดของ Yup ไม่ได้ตัดตัวละครนั้น นี่เป็นพฤติกรรมที่ถูกต้องหรือไม่ ท้ายที่สุดตัวเลียนแบบเทอร์มินัลกราฟิกกำลังจำลองอุปกรณ์โบราณบางอย่าง เราควรเลียนแบบการออกแบบที่ไม่ดีของพวกเขา (อย่างที่ xterm ทำที่นี่) หรือเราควรจะแทนที่ (เช่นที่เราทำใน gnome-terminal)? เป็นคำถามที่ยากมากที่ไม่มีคำตอบเดียวที่ถูกต้อง
egmont

33

ข้อมูลที่พบในหน้านี้ไม่รวมคอลัมน์ตัวอย่าง:

ลำดับประกอบด้วยตัวละคร Escape (มักจะแทนด้วย” ^[” หรือ” <Esc>”) ตามด้วยตัวละครอื่น ๆ :” ^[FCm” (โดยที่FCตัวเลขตัวใดตัวหนึ่งในรายการหัวข้อย่อยด้านล่าง)

ในbashการEscรหัสสามารถเป็นได้ทั้งต่อไปนี้:

  1. \e
  2. \033 (ฐานแปด)
  3. \x1B (ฐานสิบหก)

หมายเหตุ 1: "การ\e[0m" ลำดับเอาคุณลักษณะทั้งหมด (การจัดรูปแบบและสี) มันเป็นความคิดที่ดีที่จะเพิ่มไว้ท้ายข้อความสีแต่ละอัน

หมายเหตุ 2:เบื้องหน้าและสีพื้นหลังอาจแตกต่างกันขึ้นอยู่กับการกำหนดค่าของสถานีและไม่ได้ทุกสีได้รับการสนับสนุน

ตั้ง / Reset

  • 0: รีเซ็ต / ลบคุณสมบัติตัวปรับแต่งเบื้องหน้าและพื้นหลังทั้งหมด: echo -e "\e[0mNormal Text"
  • 1: ตัวหนา / สดใส: echo -e "Normal \e[1mBold"
  • 2: ติ่มซำ: echo -e "Normal \e[2mDim"
  • 4: ขีดเส้นใต้: echo -e "Normal \e[4mUnderlined"
  • 5: กะพริบ (ใช้งานไม่ได้ในเทอร์มินัลส่วนใหญ่ยกเว้น XTerm): echo -e "Normal \e[5mBlink"
  • 7: ย้อนกลับ / กลับ: echo -e "Normal \e[7minverted"
  • 8: ซ่อน (มีประโยชน์สำหรับข้อมูลที่ละเอียดอ่อน): echo -e "Normal \e[8mHidden Input"
  • 21: รีเซ็ต / ลบตัวหนา / สว่าง: echo -e "Normal \e[1mBold \e[21mNormal"
  • 22: รีเซ็ต / ลบสลัว: echo -e "Normal \e[2mDim \e[22mNormal"
  • 24: รีเซ็ต / ลบขีดเส้นใต้: echo -e "Normal \e[4mUnderlined \e[24mNormal"
  • 25: รีเซ็ต / ลบการกะพริบ: echo -e "Normal \e[5mBlink \e[25mNormal"
  • 27: รีเซ็ต / ลบย้อนกลับ / กลับด้าน: echo -e "Normal \e[7minverted \e[27mNormal"
  • 28: รีเซ็ต / ลบที่ซ่อนอยู่: echo -e "Normal \e[8mHidden \e[28mNormal"

เบื้องหน้า

  • 39: ค่าเริ่มต้น (โดยปกติคือสีเขียวสีขาวหรือสีเทาอ่อน): echo -e "Default \e[39mDefault"
  • 30: ดำ: echo -e "Default \e[30mBlack"(รวมกับสีพื้นหลังได้ดีที่สุด echo -e "Default \e[30;107mBlack on white")
  • 31: แดง (อย่าใช้กับพื้นหลังสีเขียว)
  • 32: เขียว
  • 33: สีเหลือง
  • 34: สีน้ำเงิน
  • 35: Magenta / Purple
  • 36: สีฟ้า
  • 37: แสงสีเทา
  • 90: สีเทาเข้ม
  • 91: แสงสีแดง
  • 92: สีเขียวอ่อน
  • 93: สีเหลืองอ่อน
  • 94: ฟ้าอ่อน
  • 95: Light Magenta / Pink
  • 96: ฟ้าอ่อน
  • 97: ขาว

พื้นหลัง

  • 49: สีพื้นหลังเริ่มต้น (โดยปกติจะเป็นสีดำหรือสีน้ำเงิน)
  • 40: ดำ
  • 41: แดง
  • 42: เขียว
  • 43: สีเหลือง
  • 44: สีน้ำเงิน
  • 45: Magenta / Purple
  • 46: สีฟ้า
  • 47: สีเทาอ่อน (ห้ามใช้กับพื้นหน้าสีขาว)
  • 100: สีเทาเข้ม (อย่าใช้กับพื้นหน้าสีดำ)
  • 101: แสงสีแดง
  • 102: ไฟเขียว (ห้ามใช้กับพื้นหน้าสีขาว)
  • 103: เหลืองอ่อน (ห้ามใช้กับพื้นหน้าสีขาว)
  • 104: Light Blue (อย่าใช้กับพื้นหน้าสีเหลืองอ่อน)
  • 105: Light Magenta / Pink (ห้ามใช้กับฉากหน้าแสง)
  • 106: ฟ้าอ่อน (ห้ามใช้กับพื้นหน้าสีขาว)
  • 107: สีขาว (ห้ามใช้กับไฟหน้า)

echo -e "\e[S;FG;BGm"ในการตั้งค่าทั้งเบื้องหน้าและสีพื้นหลังในครั้งเดียวให้ใช้แบบฟอร์มบิดา ตัวอย่างเช่น: echo -e "\e[1;97;41m"(เบื้องหน้าตัวหนาสีขาวบนพื้นหลังสีแดง)

สำหรับตัวเลือก 256 สีให้ดูหน้าแหล่งที่มา


30

เปลี่ยนสีตามความบังเอิญ

หากมีวัตถุประสงค์เพื่อเปลี่ยนสีตามความเหมาะสม :

คุณสามารถใช้คำสั่งsetterm :

setterm -term linux -back <background_colour> -fore <text_color> -clear

จากสีคุณสามารถเลือกได้ (ทั้งด้านหน้าและพื้นหลัง):

black|blue|green|cyan|red|magenta|yellow|white|default

สำหรับตัวเลือกเพิ่มเติม:

setterm -help

เปลี่ยนการตั้งค่าโปรไฟล์ (สี) ของคุณ

ใน 14.04 ฉันไม่พบตัวเลือกในdconfการตั้งค่าสีหรือเทอร์มินัล อย่างไรก็ตามคุณสามารถใช้gconftool

  • ก่อนอื่นคุณต้องได้รับชื่อโปรไฟล์ของคุณ:

    gconftool-2 --get /apps/gnome-terminal/global/profile_list
    
  • จากนั้นในการตั้งค่าสีข้อความในโปรไฟล์ของคุณ:

    gconftool-2 --set "/apps/gnome-terminal/profiles/<profile_name>/foreground_color" --type string "#FFFFFF"
    

    ตัวอย่างเช่นการตั้งค่าสีข้อความเป็นสีขาว

    เช่นเดียวกับสีพื้นหลัง:

    gconftool-2 --set "/apps/gnome-terminal/profiles/<profile_name>/background_color" --type string "#000000"
    

    ตัวอย่างเช่นการตั้งค่าสีพื้นหลังเป็นสีดำ

ในทางกลับกันหากต้องการตั้งชื่อของสีคุณสามารถใช้whiteหรือgreenจากพาเล็ตเดียวกับคำสั่ง setterm เช่น:

gconftool-2 --set "/apps/gnome-terminal/profiles/<profile_name>/background_color" --type string black

1
สิ่งเหล่านั้นควรเป็นเครื่องหมายขีดคั่นคู่ในคำสั่ง setterm เริ่มต้น
user1770201

ทำงานกับ 14.04 แต่ไม่ใช่ใน 16.04 (เบต้าไม่แน่ใจว่าเป็นเหตุผล) ... ยังdconf write /org/gnome/terminal/legacy/profiles:/:<profile_id>/background-color "'rgb(0,0,0)'"ทำเคล็ดลับ
Janaka Bandara

ไม่ทำงานกับ Ubuntu 1704 มันดูไม่ดี
Wax Cage

1
gconftool-2(สำหรับอูบุนตู 14.04 และอาจจะเผยแพร่ต่อไปไม่กี่) หรือdconfหรือgsettingsในรุ่นใหม่ของการตั้งค่าการเปลี่ยนแปลง Ubuntu gnome-ขั้วและมีผลบังคับใช้ทันทีในทุกแท็บและหน้าต่างของโปรไฟล์เดียวกัน ฉันไม่คิดว่า OP กำลังมองหาพฤติกรรมนี้
egmont

5

รหัสสีต่าง ๆ ที่ใช้ในการรับเอาต์พุตสียังสามารถใช้เพื่อให้ได้ภาพพื้นหลังที่เป็นสี :

40  black
41  red
42  green
43  yellow
44  blue
45  magenta
46  cyan
47  white

ดังนั้นคำสั่งต่อไปนี้เปลี่ยนพื้นหลังของฉันเป็นสีแดง:

$ echo -e '\e[0;41m'

ทั้งนี้ขึ้นอยู่กับเปลือกจำลอง terminal, ฯลฯ -eคุณอาจไม่จำเป็นต้อง


3

ดูคำตอบของ kos สำหรับการสลับพื้นหน้าหรือพื้นหลังเป็นสีของจานสีหรือแม้แต่สี RGB โดยตรงในบางเทอร์มินัล ผลของลำดับดังกล่าวจะคงอยู่จนกว่าจะมีการเลือกสีอื่น (หรือเปลี่ยนกลับเป็นค่าเริ่มต้น)

อีกวิธีหนึ่งซึ่งได้รับการสนับสนุนจากเทอร์มินัลอีมูเลเตอร์บางตัวคือการกำหนดค่า RGB ที่แน่นอนของสีพื้นหน้าและสีพื้นหลังเริ่มต้นของเทอร์มินัลใหม่โดยใช้ OSC 10/11 escape sequences:

echo -ne '\e]10;#123456\e\\'  # set default foreground to #123456
echo -ne '\e]11;#abcdef\e\\'  # set default background to #abcdef

สิ่งนี้น่าจะอยู่ได้นานกว่ามาก (จนกระทั่งถูกแทนที่โดย OSC อื่น 10/11 หรือรีเซ็ตผ่าน OSC 110/111) แต่ต่างจากวิธีการ dconf ซึ่งยังคงมีผลกับเทอร์มินัลปัจจุบันเท่านั้น

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