วิธีการเปลี่ยนสีเอาต์พุตของ echo ใน Linux


1738

ฉันพยายามพิมพ์ข้อความในเทอร์มินัลโดยใช้คำสั่ง echo

ฉันต้องการพิมพ์ข้อความด้วยสีแดง ฉันจะทำสิ่งนั้นได้อย่างไร


30
ลิงค์นี้มีประโยชน์มาก: misc.flogisoft.com/bash/tip_colors_and_formatting
Pithikos

ลองดูที่สิ่งนี้ซึ่งฉันได้ตอบคำถามของคุณที่นั่น: stackoverflow.com/a/48216286/3782119
Shayan Amani

คำตอบ:


2294

คุณสามารถใช้รหัสหลบหนี ANSIเหล่านี้:

Black        0;30     Dark Gray     1;30
Red          0;31     Light Red     1;31
Green        0;32     Light Green   1;32
Brown/Orange 0;33     Yellow        1;33
Blue         0;34     Light Blue    1;34
Purple       0;35     Light Purple  1;35
Cyan         0;36     Light Cyan    1;36
Light Gray   0;37     White         1;37

แล้วใช้มันในสคริปต์ของคุณ:

#    .---------- constant part!
#    vvvv vvvv-- the code from above
RED='\033[0;31m'
NC='\033[0m' # No Color
printf "I ${RED}love${NC} Stack Overflow\n"

ซึ่งพิมพ์loveด้วยสีแดง

จากความคิดเห็น @ james-Lim ของถ้าคุณใช้echoคำสั่งตรวจสอบการใช้ธงอีที่จะช่วยให้หนีทับขวา

# Continued from above example
echo -e "I ${RED}love${NC} Stack Overflow"

(ไม่ต้องเพิ่ม"\n"เมื่อใช้ echo ถ้าคุณไม่ต้องการเพิ่มบรรทัดว่างเพิ่มเติม)


11
ไม่ทำงานสำหรับฉัน - ผลลัพธ์:\e[0;31mHello Stackoverflow\e[0m
Ben Harold

171
คุณลองด้วย "-e" หรือไม่? มันบอกechoให้เปิดใช้งานเครื่องหมายแบคสแลช
James Lim

142
ใน MacOSX ใช้แทน\x1B จะโอเคสำหรับทุกแพลตฟอร์ม \e\033
Xiao

4
ในไฟล์คุณสมบัติ ant ใช้ unicode สำหรับ esacpe เช่น red = \ u001b [0; 31m
ผู้ใช้ shonky linux

20
เช่นเดียวกับ msanford ที่สร้างขึ้นสำหรับ tput นี่คือ "ANSI-Rainbow"for (( i = 30; i < 38; i++ )); do echo -e "\033[0;"$i"m Normal: (0;$i); \033[1;"$i"m Light: (1;$i)"; done
everyman

970

คุณสามารถใช้tputคำสั่งที่ยอดเยี่ยม (แนะนำในคำตอบของ Ignacio ) เพื่อสร้างรหัสควบคุมเทอร์มินัลสำหรับทุกสิ่ง


การใช้

tputคำสั่งย่อยเฉพาะจะกล่าวถึงในภายหลัง

โดยตรง

เรียกtputเป็นส่วนหนึ่งของลำดับของคำสั่ง:

tput setaf 1; echo "this is red text"

ใช้;แทน&&ดังนั้นหากtputข้อผิดพลาดข้อความยังคงแสดง

ตัวแปรเชลล์

ตัวเลือกอื่นคือการใช้ตัวแปรเชลล์:

red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
echo "${red}red text ${green}green text${reset}"

tputสร้างลำดับอักขระที่ตีความโดยเทอร์มินัลว่ามีความหมายพิเศษ พวกเขาจะไม่ปรากฏตัว โปรดทราบว่ายังสามารถบันทึกลงในไฟล์หรือประมวลผลเป็นอินพุตโดยโปรแกรมอื่นที่ไม่ใช่เทอร์มินัล

การทดแทนคำสั่ง

มันอาจจะสะดวกกว่าในการแทรกtputเอาต์พุตลงในechoสตริงของคุณโดยตรงโดยใช้การแทนที่คำสั่ง :

echo "$(tput setaf 1)Red text $(tput setab 7)and white background$(tput sgr 0)"

ตัวอย่าง

คำสั่งดังกล่าวสร้างสิ่งนี้บน Ubuntu:

สกรีนช็อตของข้อความเทอร์มินัลสี


คำสั่งพื้นสี & พื้นหลัง

tput setab [1-7] # Set the background colour using ANSI escape
tput setaf [1-7] # Set the foreground colour using ANSI escape

สีมีดังนี้:

Num  Colour    #define         R G B

0    black     COLOR_BLACK     0,0,0
1    red       COLOR_RED       1,0,0
2    green     COLOR_GREEN     0,1,0
3    yellow    COLOR_YELLOW    1,1,0
4    blue      COLOR_BLUE      0,0,1
5    magenta   COLOR_MAGENTA   1,0,1
6    cyan      COLOR_CYAN      0,1,1
7    white     COLOR_WHITE     1,1,1

นอกจากนี้ยังมีฟังก์ชั่นการตั้งค่าสีรุ่นที่ไม่ใช่ ANSI ( setbแทนsetabและsetfแทนsetaf) ซึ่งใช้ตัวเลขที่แตกต่างกันซึ่งไม่ได้ระบุไว้ที่นี่

คำสั่งโหมดข้อความ

tput bold    # Select bold mode
tput dim     # Select dim (half-bright) mode
tput smul    # Enable underline mode
tput rmul    # Disable underline mode
tput rev     # Turn on reverse video mode
tput smso    # Enter standout (bold) mode
tput rmso    # Exit standout mode

คำสั่งการเคลื่อนไหวเคอร์เซอร์

tput cup Y X # Move cursor to screen postion X,Y (top left is 0,0)
tput cuf N   # Move N characters forward (right)
tput cub N   # Move N characters back (left)
tput cuu N   # Move N lines up
tput ll      # Move to last line, first column (if no cup)
tput sc      # Save the cursor position
tput rc      # Restore the cursor position
tput lines   # Output the number of lines of the terminal
tput cols    # Output the number of columns of the terminal

ล้างและแทรกคำสั่ง

tput ech N   # Erase N characters
tput clear   # Clear screen and move the cursor to 0,0
tput el 1    # Clear to beginning of line
tput el      # Clear to end of line
tput ed      # Clear to end of screen
tput ich N   # Insert N characters (moves rest of line forward!)
tput il N    # Insert N lines

คำสั่งอื่น ๆ

tput sgr0    # Reset text format to the terminal's default
tput bel     # Play a bell

ด้วยหน้าต่างสั่นคลอน Compizที่belคำสั่งทำให้วอกแวกขั้วเป็นครั้งที่สองเพื่อดึงดูดความสนใจของผู้ใช้


สคริป

tputยอมรับสคริปต์ที่มีหนึ่งคำสั่งต่อบรรทัดซึ่งจะดำเนินการตามลำดับก่อนtputออก

หลีกเลี่ยงไฟล์ชั่วคราวด้วยการสะท้อนสตริงหลายบรรทัดและไพพ์:

echo -e "setf 7\nsetb 1" | tput -S  # set fg white and bg red

ดูสิ่งนี้ด้วย

  • ดู man 1 tput
  • ดูman 5 terminfoรายการคำสั่งทั้งหมดและรายละเอียดเพิ่มเติมเกี่ยวกับตัวเลือกเหล่านี้ ( tputคำสั่งที่เกี่ยวข้องแสดงอยู่ในCap-nameคอลัมน์ของตารางขนาดใหญ่ที่เริ่มต้นที่บรรทัดที่ 81)

13
คำตอบที่ดี นี่คือสิ่งที่ช่วยฉันได้มากที่สุด สำหรับคนอื่น ๆ ที่ถูกสงสัยว่าฉันถูกสงสัยที่$()เป็นแทนคำสั่ง ทั้งหมดtput af 1ทำคือสร้างสตริงรหัสสี แต่รหัสไม่ใช่อักขระที่พิมพ์ได้ดังนั้นการพิมพ์tput af 1เพียงอย่างเดียวจะสร้างบรรทัดว่างเปล่า
Chris Middleton

5
หมายเหตุ: ถ้าคุณใช้ CygWin และไม่มีการติดตั้ง tputncurses
Enrico

3
tput ยังทำงานใน sed เพื่อแยก cruft ให้เป็น cruft ที่อ่านง่ายและมีสีสัน: gist.github.com/nickboldt/fab71da10bd5169ffdfa
nickboldt

1
สำหรับรายการtputสีทั้งหมดลองดูคำตอบนี้บน Unix StackExchange
Andrew

ฉันคิดว่าreset=`tput sgr0`ควรจะreset=`tput sgr 0`มีพื้นที่
monkeypants

833

ตัวแปรบางตัวที่คุณสามารถใช้:

# Reset
Color_Off='\033[0m'       # Text Reset

# Regular Colors
Black='\033[0;30m'        # Black
Red='\033[0;31m'          # Red
Green='\033[0;32m'        # Green
Yellow='\033[0;33m'       # Yellow
Blue='\033[0;34m'         # Blue
Purple='\033[0;35m'       # Purple
Cyan='\033[0;36m'         # Cyan
White='\033[0;37m'        # White

# Bold
BBlack='\033[1;30m'       # Black
BRed='\033[1;31m'         # Red
BGreen='\033[1;32m'       # Green
BYellow='\033[1;33m'      # Yellow
BBlue='\033[1;34m'        # Blue
BPurple='\033[1;35m'      # Purple
BCyan='\033[1;36m'        # Cyan
BWhite='\033[1;37m'       # White

# Underline
UBlack='\033[4;30m'       # Black
URed='\033[4;31m'         # Red
UGreen='\033[4;32m'       # Green
UYellow='\033[4;33m'      # Yellow
UBlue='\033[4;34m'        # Blue
UPurple='\033[4;35m'      # Purple
UCyan='\033[4;36m'        # Cyan
UWhite='\033[4;37m'       # White

# Background
On_Black='\033[40m'       # Black
On_Red='\033[41m'         # Red
On_Green='\033[42m'       # Green
On_Yellow='\033[43m'      # Yellow
On_Blue='\033[44m'        # Blue
On_Purple='\033[45m'      # Purple
On_Cyan='\033[46m'        # Cyan
On_White='\033[47m'       # White

# High Intensity
IBlack='\033[0;90m'       # Black
IRed='\033[0;91m'         # Red
IGreen='\033[0;92m'       # Green
IYellow='\033[0;93m'      # Yellow
IBlue='\033[0;94m'        # Blue
IPurple='\033[0;95m'      # Purple
ICyan='\033[0;96m'        # Cyan
IWhite='\033[0;97m'       # White

# Bold High Intensity
BIBlack='\033[1;90m'      # Black
BIRed='\033[1;91m'        # Red
BIGreen='\033[1;92m'      # Green
BIYellow='\033[1;93m'     # Yellow
BIBlue='\033[1;94m'       # Blue
BIPurple='\033[1;95m'     # Purple
BICyan='\033[1;96m'       # Cyan
BIWhite='\033[1;97m'      # White

# High Intensity backgrounds
On_IBlack='\033[0;100m'   # Black
On_IRed='\033[0;101m'     # Red
On_IGreen='\033[0;102m'   # Green
On_IYellow='\033[0;103m'  # Yellow
On_IBlue='\033[0;104m'    # Blue
On_IPurple='\033[0;105m'  # Purple
On_ICyan='\033[0;106m'    # Cyan
On_IWhite='\033[0;107m'   # White

อักขระ escape ในbash , hexและoctalตามลำดับ:

|       | bash  | hex    | octal   | NOTE                         |
|-------+-------+--------+---------+------------------------------|
| start | \e    | \x1b   | \033    |                              |
| start | \E    | \x1B   | -       | x cannot be capital          |
| end   | \e[0m | \x1m0m | \033[0m |                              |
| end   | \e[m  | \x1b[m | \033[m  | 0 is appended if you omit it |
|       |       |        |         |                              |

ตัวอย่างสั้น ๆ :

| color       | bash         | hex            | octal          | NOTE                                  |
|-------------+--------------+----------------+----------------+---------------------------------------|
| start green | \e[32m<text> | \x1b[32m<text> | \033[32m<text> | m is NOT optional                     |
| reset       | <text>\e[0m  | <text>\1xb[0m  | <text>\033[om  | o is optional (do it as best practice |
|             |              |                |                |                                       |

ข้อยกเว้นทุบตี:

หากคุณจะใช้รหัสเหล่านี้ในของคุณ ตัวแปรทุบตีพิเศษ

  • PS0
  • PS1
  • PS2 (= นี่คือการแจ้งเตือน)
  • PS4

คุณควรเพิ่มอักขระพิเศษเพื่อหลีกเลี่ยง สามารถตีความได้อย่างถูกต้อง หากไม่มีการเพิ่มอักขระหลบหนีพิเศษมันใช้งานได้ แต่คุณจะประสบปัญหาเมื่อคุณใช้Ctrl + rค้นหาในประวัติของคุณ

กฎข้อยกเว้นสำหรับทุบตี

คุณควรเพิ่ม\[ก่อนหน้ารหัส ANSI เริ่มต้นและเพิ่ม\]หลังจากรหัสสิ้นสุดใด ๆ
ตัวอย่าง:
ในการใช้งานปกติ: \033[32mThis is in green\033[0m
สำหรับ PS0 / 1/2/4: \[\033[32m\]This is in green\[\033[m\]

\[เป็นจุดเริ่มต้นของลำดับของที่ไม่สามารถพิมพ์ตัวอักษร
\]สำหรับการสิ้นสุดของลำดับของที่ไม่สามารถพิมพ์ตัวอักษร

เคล็ดลับ: เพื่อให้จดจำได้คุณสามารถเพิ่ม\[\]จากนั้นใส่รหัส ANSI ของคุณระหว่างพวกเขา:
- \[start-ANSI-code\]
-\[end-ANSI-code\]

ประเภทของลำดับสี:

  1. 3/4 บิต
  2. 8 บิต
  3. 24 บิต

ก่อนดำลงในสีเหล่านี้คุณควรรู้เกี่ยวกับ 4 โหมดด้วยรหัสเหล่านี้:

1. โหมดสี

มันปรับเปลี่ยนรูปแบบของข้อความสีไม่ใช่ ตัวอย่างเช่นทำให้สีสว่างหรือเข้มขึ้น

  • 0 รีเซ็ต
  • 1; เบากว่าปกติ
  • 2; มืดกว่าปกติ

โหมดนี้ไม่รองรับอย่างกว้างขวาง มันรองรับ Gnome-Terminal อย่างเต็มที่

2. โหมดข้อความ

โหมดนี้ใช้สำหรับปรับเปลี่ยนสไตล์ของข้อความไม่ใช่สี

  • 3; ตัวเอียง
  • 4; ขีดเส้นใต้
  • 5; กะพริบ (ช้า)
  • 6; กะพริบ (เร็ว)
  • 7; ถอยหลัง
  • 8; ซ่อน
  • 9; ข้ามออก

และได้รับการสนับสนุนเกือบ
ตัวอย่างเช่น KDE-Konsole รองรับ5;แต่ Gnome-Terminal ไม่รองรับและ Gnome รองรับ8;แต่ KDE ไม่ รองรับ

3. โหมดเบื้องหน้า

โหมดนี้ใช้สำหรับกำหนดสีพื้นหน้า

4. โหมดพื้นหลัง

โหมดนี้ใช้สำหรับกำหนดสีพื้นหลัง

ตารางด้านล่างแสดงข้อมูลสรุปANSI-color 3/4 บิต

|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
| color-mode | octal    | hex     | bash  | description      | example (= in octal)         | NOTE                                 |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|          0 | \033[0m  | \x1b[0m | \e[0m | reset any affect | echo -e "\033[0m"            | 0m equals to m                       |
|          1 | \033[1m  |         |       | light (= bright) | echo -e "\033[1m####\033[m"  | -                                    |
|          2 | \033[2m  |         |       | dark (= fade)    | echo -e "\033[2m####\033[m"  | -                                    |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|  text-mode | ~        |         |       | ~                | ~                            | ~                                    |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|          3 | \033[3m  |         |       | italic           | echo -e "\033[3m####\033[m"  |                                      |
|          4 | \033[4m  |         |       | underline        | echo -e "\033[4m####\033[m"  |                                      |
|          5 | \033[5m  |         |       | blink (slow)     | echo -e "\033[3m####\033[m"  |                                      |
|          6 | \033[6m  |         |       | blink (fast)     | ?                            | not wildly support                   |
|          7 | \003[7m  |         |       | reverse          | echo -e "\033[7m####\033[m"  | it affects the background/foreground |
|          8 | \033[8m  |         |       | hide             | echo -e "\033[8m####\033[m"  | it affects the background/foreground |
|          9 | \033[9m  |         |       | cross            | echo -e "\033[9m####\033[m"  |                                      |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
| foreground | ~        |         |       | ~                | ~                            | ~                                    |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|         30 | \033[30m |         |       | black            | echo -e "\033[30m####\033[m" |                                      |
|         31 | \033[31m |         |       | red              | echo -e "\033[31m####\033[m" |                                      |
|         32 | \033[32m |         |       | green            | echo -e "\033[32m####\033[m" |                                      |
|         33 | \033[33m |         |       | yellow           | echo -e "\033[33m####\033[m" |                                      |
|         34 | \033[34m |         |       | blue             | echo -e "\033[34m####\033[m" |                                      |
|         35 | \033[35m |         |       | purple           | echo -e "\033[35m####\033[m" | real name: magenta = reddish-purple  |
|         36 | \033[36m |         |       | cyan             | echo -e "\033[36m####\033[m" |                                      |
|         37 | \033[37m |         |       | white            | echo -e "\033[37m####\033[m" |                                      |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|         38 | 8/24     |                    This is for special use of 8-bit or 24-bit                                            |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
| background | ~        |         |       | ~                | ~                            | ~                                    |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|         40 | \033[40m |         |       | black            | echo -e "\033[40m####\033[m" |                                      |
|         41 | \033[41m |         |       | red              | echo -e "\033[41m####\033[m" |                                      |
|         42 | \033[42m |         |       | green            | echo -e "\033[42m####\033[m" |                                      |
|         43 | \033[43m |         |       | yellow           | echo -e "\033[43m####\033[m" |                                      |
|         44 | \033[44m |         |       | blue             | echo -e "\033[44m####\033[m" |                                      |
|         45 | \033[45m |         |       | purple           | echo -e "\033[45m####\033[m" | real name: magenta = reddish-purple  |
|         46 | \033[46m |         |       | cyan             | echo -e "\033[46m####\033[m" |                                      |
|         47 | \033[47m |         |       | white            | echo -e "\033[47m####\033[m" |                                      |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|
|         48 | 8/24     |                    This is for special use of 8-bit or 24-bit                                            |                                                                                       |
|------------+----------+---------+-------+------------------+------------------------------+--------------------------------------|

ตารางด้านล่างแสดงข้อมูลสรุปANSI-color เวอร์ชั่น 8 บิต

|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
| foreground | octal     | hex       | bash    | description      | example                            | NOTE                    |
|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
|        0-7 | \033[38;5 | \x1b[38;5 | \e[38;5 | standard. normal | echo -e '\033[38;5;1m####\033[m'   |                         |
|       8-15 |           |           |         | standard. light  | echo -e '\033[38;5;9m####\033[m'   |                         |
|     16-231 |           |           |         | more resolution  | echo -e '\033[38;5;45m####\033[m'  | has no specific pattern |
|    232-255 |           |           |         |                  | echo -e '\033[38;5;242m####\033[m' | from black to white     |
|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
| foreground | octal     | hex       | bash    | description      | example                            | NOTE                    |
|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|
|        0-7 |           |           |         | standard. normal | echo -e '\033[48;5;1m####\033[m'   |                         |
|       8-15 |           |           |         | standard. light  | echo -e '\033[48;5;9m####\033[m'   |                         |
|     16-231 |           |           |         | more resolution  | echo -e '\033[48;5;45m####\033[m'  |                         |
|    232-255 |           |           |         |                  | echo -e '\033[48;5;242m####\033[m' | from black to white     |
|------------+-----------+-----------+---------+------------------+------------------------------------+-------------------------|

การทดสอบที่รวดเร็ว 8 บิต:
for code in {0..255}; do echo -e "\e[38;05;${code}m $code: Test"; done

ตารางด้านล่างแสดงข้อมูลสรุปANSI-color เวอร์ชั่น 24 บิต

|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
| foreground | octal     | hex       | bash    | description | example                                  | NOTE            |
|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
|      0-255 | \033[38;2 | \x1b[38;2 | \e[38;2 | R = red     | echo -e '\033[38;2;255;0;02m####\033[m'  | R=255, G=0, B=0 |
|      0-255 | \033[38;2 | \x1b[38;2 | \e[38;2 | G = green   | echo -e '\033[38;2;;0;255;02m####\033[m' | R=0, G=255, B=0 |
|      0-255 | \033[38;2 | \x1b[38;2 | \e[38;2 | B = blue    | echo -e '\033[38;2;0;0;2552m####\033[m'  | R=0, G=0, B=255 |
|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
| background | octal     | hex       | bash    | description | example                                  | NOTE            |
|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|
|      0-255 | \033[48;2 | \x1b[48;2 | \e[48;2 | R = red     | echo -e '\033[48;2;255;0;02m####\033[m'  | R=255, G=0, B=0 |
|      0-255 | \033[48;2 | \x1b[48;2 | \e[48;2 | G = green   | echo -e '\033[48;2;;0;255;02m####\033[m' | R=0, G=255, B=0 |
|      0-255 | \033[48;2 | \x1b[48;2 | \e[48;2 | B = blue    | echo -e '\033[48;2;0;0;2552m####\033[m'  | R=0, G=0, B=255 |
|------------+-----------+-----------+---------+-------------+------------------------------------------+-----------------|

ภาพหน้าจอบางอย่าง

สรุป 8 บิตเบื้องหน้าใน .gif

foreground.gif

สรุปพื้นหลัง 8 บิตใน .gif

background.gif

สรุปสีด้วยค่าของพวกเขา

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่

blinking บน KDE-Terminal

KDE-กระพริบ

Cรหัสง่ายๆที่แสดงให้คุณเห็นมากขึ้น

cecho_screenshot

เครื่องมือขั้นสูงที่ฉันพัฒนาเพื่อจัดการกับสีเหล่านี้:

bline


โหมดถ่ายภาพสี

จางปกติสดใส

โหมดถ่ายภาพข้อความ

เพียงโหมดข้อความ

รวมเป็นตกลง

รวมกัน

ภาพเพิ่มเติม


เคล็ดลับและเทคนิคสำหรับผู้ใช้และโปรแกรมเมอร์ขั้นสูง:

เราสามารถใช้รหัสเหล่านี้ในภาษาการเขียนโปรแกรมได้หรือไม่?

ใช่คุณสามารถ. ฉันมีประสบการณ์, , , ,

พวกเขาชะลอความเร็วของโปรแกรมหรือไม่?

ฉันคิดว่าไม่

เราสามารถใช้สิ่งเหล่านี้กับ Windows ได้หรือไม่?

3/4-bit ใช่ถ้าคุณรวบรวมรหัสด้วยgcc
ภาพหน้าจอบางอย่างใน Win-7

วิธีการคำนวณความยาวของรหัส?

\033[ = 2 ส่วนอื่น ๆ 1

เราจะใช้รหัสเหล่านี้ได้ที่ไหน

ทุกที่ที่มีttyล่าม
xterm, gnome-terminal, kde-terminal, mysql-client-CLIและอื่น ๆ
ตัวอย่างเช่นถ้าคุณต้องการ colorize output ของคุณด้วย mysql คุณสามารถใช้Perl

#!/usr/bin/perl -n
print "\033[1m\033[31m$1\033[36m$2\033[32m$3\033[33m$4\033[m" while /([|+-]+)|([0-9]+)|([a-zA-Z_]+)|([^\w])/g;

เก็บรหัสนี้ในชื่อไฟล์: pcc(= Perl Colorize Character) จากนั้นให้วางไฟล์ a ที่ถูกต้องPATHจากนั้นใช้ที่ใดก็ได้ที่คุณต้องการ

ls | pcc
df | pcc

ข้างในmysqlลงทะเบียนก่อนpagerแล้วลอง:

[user2:db2] pager pcc
PAGER set to 'pcc'
[user2:db2] select * from table-name;

PCC

มันไม่ได้จัดการกับ Unicode

รหัสเหล่านี้ทำ colorizing เท่านั้น?

ไม่พวกเขาสามารถทำสิ่งที่น่าสนใจมากมาย ลอง:

echo -e '\033[2K'  # clear the screen and do not move the position

หรือ:

echo -e '\033[2J\033[u' # clear the screen and reset the position

มีผู้เริ่มต้นจำนวนมากที่ต้องการล้างหน้าจอsystem( "clear" )เพื่อให้คุณสามารถใช้สิ่งนี้แทนการsystem(3)โทร

พวกเขามีอยู่ใน Unicode หรือไม่?

ใช่. \u001b

รุ่นใดของสีเหล่านี้ดีกว่า

มันเป็นเรื่องง่ายที่จะใช้แต่มันเป็นเรื่องที่ถูกต้องและสวยงามในการใช้มาก3/4-bit24-bit
หากคุณไม่มีประสบการณ์กับดังนั้นนี่คือการกวดวิชาอย่างรวดเร็ว:
24 บิตหมายถึง: 00000000และและ00000000 00000000แต่ละบิต 8 สำหรับสีเฉพาะ
1..8สำหรับและ9..16สำหรับและ17..24สำหรับ
ดังนั้นใน #FF0000หมายถึงและนี่มันคือ: 255;0;0
ใน #00FF00หมายความว่านี่คือ: 0;255;0
ที่เหมาะสมหรือไม่ คุณต้องการรวมสีใดกับค่า 8 บิตทั้งสามนี้


การอ้างอิง:
วิกิพีเดีย
ANSI escape sequences
tldp.org
tldp.org
misc.flogisoft.com
บางบล็อก / หน้าเว็บที่ฉันจำไม่ได้


70
ไม่มีใครประหลาดใจที่คำตอบนี้หรือไม่?
Benj

14
นี่คือคำตอบที่มีชื่อเสียงมากขอบคุณ
ForeverZer0

2
@NeilGuyLindberg ไม่มีตัวอักษรฐานแปดข้อผิดพลาดนี้เป็นส่วนหนึ่งของ Node.js ไม่ได้ eslist ตัวเอง คุณสามารถใช้x1B[เพื่อกำจัดมัน
Shakiba Moshiri

5
ฉันเลื่อนไปด้านหลังค่อนข้างไกลเพื่อโหวตคำตอบนี้!
RNA

1
รู้สึกเหมือน @ShakibaMoshiri เขียนวิทยานิพนธ์ในหัวข้อนี้ xD Jokes นอกเหนือจากนั้นให้กำลังใจสำหรับคำตอบอย่างละเอียด!
SH '

189

ใช้tputกับความสามารถและพารามิเตอร์ของsetaf1

echo "$(tput setaf 1)Hello, world$(tput sgr0)"

8
นี่ควรเป็นตัวเลือกที่ดีที่สุด สิ่งที่tputทำคือมันจะอ่านข้อมูลเทอร์มินัลและแสดงรหัส ANSI ที่หลบหนีได้อย่างถูกต้องสำหรับคุณ โค้ด\033[31mจะแบ่งไลบรารีreadlineในเทอร์มินัลบางตัว
เทียนเฉิน

44
สำรวจสีด้วยการวนซ้ำง่าย ๆ (เพิ่มiขอบเขตบนเพื่อเพิ่มเฉดสีมากขึ้น):for (( i = 0; i < 17; i++ )); do echo "$(tput setaf $i)This is ($i) $(tput sgr0)"; done
msanford

2
นี่คือ HOWTO เกี่ยวกับรหัสtput
maxywb

tput: command not found(บนอัลไพน์)
dgallant

127
echo -e "\033[31m Hello World"

การ[31mควบคุมสีข้อความ:

  • 30- 37ตั้งค่าสีพื้นหน้า
  • 40- 47ตั้งค่าสีพื้นหลัง

รายการที่สมบูรณ์ของรหัสสีสามารถพบได้ที่นี่

เป็นวิธีปฏิบัติที่ดีในการรีเซ็ตสีข้อความกลับไป\033[0mที่ส่วนท้ายของสตริง


2
echo -e "\ 033 [31m Hello World", [31m คือสี
neocanable

36

ฉันเพิ่งรวมการจับที่ดีในการแก้ปัญหาทั้งหมดและจบลงด้วย:

cecho(){
    RED="\033[0;31m"
    GREEN="\033[0;32m"
    YELLOW="\033[1;33m"
    # ... ADD MORE COLORS
    NC="\033[0m" # No Color

    printf "${!1}${2} ${NC}\n"
}

และคุณสามารถเรียกมันว่า:

cecho "RED" "Helloworld"

1
ในทางปฏิบัติมากฉันแค่ต้องแทนที่คำพูดเดียวด้วยคำพูดสองครั้งสำหรับ GREEN, YELLOW, NC เพื่อให้มันทำงานในสคริปต์ของฉัน
ionescu77

1
ทางออกที่ดี !!
David Kariuki

31

นี้เป็นสีสลับ \033[ดูประวัติ

รหัสสีเช่น1;32(เขียวอ่อน), 0;34(น้ำเงิน), 1;34(น้ำเงินอ่อน) ฯลฯ

เรายุติลำดับสีที่มีสวิทช์สี\033[และ0mที่ไม่มีรหัส -color เช่นเดียวกับการเปิดและปิดแท็บในภาษามาร์กอัป

  SWITCH="\033["
  NORMAL="${SWITCH}0m"
  YELLOW="${SWITCH}1;33m"
  echo "${YELLOW}hello, yellow${NORMAL}"

echoฟังก์ชั่นการแก้ปัญหาสีที่เรียบง่าย:

cecho() {
  local code="\033["
  case "$1" in
    black  | bk) color="${code}0;30m";;
    red    |  r) color="${code}1;31m";;
    green  |  g) color="${code}1;32m";;
    yellow |  y) color="${code}1;33m";;
    blue   |  b) color="${code}1;34m";;
    purple |  p) color="${code}1;35m";;
    cyan   |  c) color="${code}1;36m";;
    gray   | gr) color="${code}0;37m";;
    *) local text="$1"
  esac
  [ -z "$text" ] && local text="$color$2${code}0m"
  echo "$text"
}

cecho "Normal"
cecho y "Yellow!"

1
ฉันจะเปลี่ยนtextตัวแปรสุดท้ายด้วยtext="$color${@: 2}${code}0m"วิธีนี้ทั้งบรรทัดยกเว้นพารามิเตอร์สีจะเป็นสี
Shairon Toledo

@tomazahlin เพียงเพิ่ม -e to echo ดังที่ได้กล่าวมาแล้วหลายครั้ง
Artem Medvedev

28

วิธีที่เรียบร้อยในการเปลี่ยนสีเพียงอย่างเดียวechoคือการกำหนดฟังก์ชั่นดังกล่าว

function coloredEcho(){
    local exp=$1;
    local color=$2;
    if ! [[ $color =~ '^[0-9]$' ]] ; then
       case $(echo $color | tr '[:upper:]' '[:lower:]') in
        black) color=0 ;;
        red) color=1 ;;
        green) color=2 ;;
        yellow) color=3 ;;
        blue) color=4 ;;
        magenta) color=5 ;;
        cyan) color=6 ;;
        white|*) color=7 ;; # white or invalid color
       esac
    fi
    tput setaf $color;
    echo $exp;
    tput sgr0;
}

การใช้งาน:

coloredEcho "This text is green" green

หรือคุณสามารถใช้รหัสสีที่ระบุโดยตรงในคำตอบของ Drew :

coloredEcho "This text is green" 2

หากคุณเพิ่ม-nไปยังเสียงก้องคุณสามารถใช้เป็นสีแบบอินไลน์ได้echo "Red `coloredEcho "fox" red` jumps over the lazy dog"
sobi3ch

23

ใช้tputในการคำนวณรหัสสี หลีกเลี่ยงการใช้รหัสหลบหนี ANSI (เช่น\E[31;1mสีแดง) เพราะพกพาได้น้อยกว่า ตัวอย่างเช่น Bash บน OS X ไม่รองรับ

BLACK=`tput setaf 0`
RED=`tput setaf 1`
GREEN=`tput setaf 2`
YELLOW=`tput setaf 3`
BLUE=`tput setaf 4`
MAGENTA=`tput setaf 5`
CYAN=`tput setaf 6`
WHITE=`tput setaf 7`

BOLD=`tput bold`
RESET=`tput sgr0`

echo -e "hello ${RED}some red text${RESET} world"

18

คำถามนี้ได้รับการตอบซ้ำแล้วซ้ำอีก :-) แต่ทำไมถึงไม่

การใช้งานครั้งแรกtputนั้นสามารถพกพาได้ในสภาพแวดล้อมที่ทันสมัยกว่าการฉีดรหัส ASCII ด้วยตนเองecho -E

นี่คือฟังก์ชั่นทุบตีอย่างรวดเร็ว:

 say() {
     echo "$@" | sed \
             -e "s/\(\(@\(red\|green\|yellow\|blue\|magenta\|cyan\|white\|reset\|b\|u\)\)\+\)[[]\{2\}\(.*\)[]]\{2\}/\1\4@reset/g" \
             -e "s/@red/$(tput setaf 1)/g" \
             -e "s/@green/$(tput setaf 2)/g" \
             -e "s/@yellow/$(tput setaf 3)/g" \
             -e "s/@blue/$(tput setaf 4)/g" \
             -e "s/@magenta/$(tput setaf 5)/g" \
             -e "s/@cyan/$(tput setaf 6)/g" \
             -e "s/@white/$(tput setaf 7)/g" \
             -e "s/@reset/$(tput sgr0)/g" \
             -e "s/@b/$(tput bold)/g" \
             -e "s/@u/$(tput sgr 0 1)/g"
  }

ตอนนี้คุณสามารถใช้:

 say @b@green[[Success]] 

ที่จะได้รับ:

ความสำเร็จของ Bold-Green

หมายเหตุเกี่ยวกับการพกพาของ tput

tput(1)อัปโหลดซอร์สโค้ดครั้งแรกในเดือนกันยายน 2529

tput(1) มีให้บริการใน X / Open curses semantics ในปี 1990 (มาตรฐาน 1997 มี semantics ที่กล่าวถึงด้านล่าง)

ดังนั้นมันค่อนข้างแพร่หลาย


นี่มันเจ๋งมาก! ไม่ทราบเรื่องนี้ คุณสามารถพูดอะไรบางอย่างเกี่ยวกับความพร้อมของtput? สามารถใช้ได้กับเซิร์ฟเวอร์ส่วนใหญ่ที่ไม่มีสิทธิ์ของผู้ดูแลระบบในการติดตั้งหรือไม่ คุณมีลิงค์ไปยังที่ซึ่งเทคนิคนี้ถูก 'ประดิษฐ์' ครั้งแรกหรือไม่?
Redsandro

3
tput เป็นวิธีที่เป็นไปตามมาตรฐานในการทำสิ่งนี้ซึ่งเป็นอิสระอย่างสมบูรณ์จากการที่คุณรู้ความสามารถของเทอร์มินัล หากเทอร์มินัลไม่รองรับความสามารถที่กำหนดไว้มันจะลดระดับอย่างสง่างามเป็นอะไรก็ตามที่ทำได้โดยไม่ต้องกดรหัสหนีแบบเกลียว
Ahmed Masud

1
ฉันหยุดใช้วิธีนี้เนื่องจากมันยุ่งกับตำแหน่งเคอร์เซอร์ใน bash lines มันจะห่อแบบสุ่มก่อนถึงจุดสิ้นสุดของบรรทัดและจะไม่ย้อนกลับไปจนถึงจุดเริ่มต้นของบรรทัดเมื่อใช้ปุ่ม home หรือปุ่มลูกศร การกลับไปที่รหัสหลบหลีกด้วยตนเองที่เงอะงะแก้ไขปัญหานี้ได้
Redsandro

2
@Resandro - นั่นเป็นเพราะคุณกำลังใช้งานอยู่$PS1โดยไม่มี\[...\]ส่วนที่ไม่มีการเว้นวรรคหรือไม่ ใช้เครื่องหมาย Bash PS1 ต่อไปกับสตริง tput
Toby Speight

โปรดทราบว่าฟังก์ชั่นนี้ใช้งานไม่ได้บน MacOsX เนื่องจากความแตกต่างในยูทิลิตี้ sed: unix.stackexchange.com/questions/13711/ …
Jeff

14

ขอบคุณ@ k-fiveสำหรับคำตอบนี้

declare -A colors
#curl www.bunlongheng.com/code/colors.png

# Reset
colors[Color_Off]='\033[0m'       # Text Reset

# Regular Colors
colors[Black]='\033[0;30m'        # Black
colors[Red]='\033[0;31m'          # Red
colors[Green]='\033[0;32m'        # Green
colors[Yellow]='\033[0;33m'       # Yellow
colors[Blue]='\033[0;34m'         # Blue
colors[Purple]='\033[0;35m'       # Purple
colors[Cyan]='\033[0;36m'         # Cyan
colors[White]='\033[0;37m'        # White

# Bold
colors[BBlack]='\033[1;30m'       # Black
colors[BRed]='\033[1;31m'         # Red
colors[BGreen]='\033[1;32m'       # Green
colors[BYellow]='\033[1;33m'      # Yellow
colors[BBlue]='\033[1;34m'        # Blue
colors[BPurple]='\033[1;35m'      # Purple
colors[BCyan]='\033[1;36m'        # Cyan
colors[BWhite]='\033[1;37m'       # White

# Underline
colors[UBlack]='\033[4;30m'       # Black
colors[URed]='\033[4;31m'         # Red
colors[UGreen]='\033[4;32m'       # Green
colors[UYellow]='\033[4;33m'      # Yellow
colors[UBlue]='\033[4;34m'        # Blue
colors[UPurple]='\033[4;35m'      # Purple
colors[UCyan]='\033[4;36m'        # Cyan
colors[UWhite]='\033[4;37m'       # White

# Background
colors[On_Black]='\033[40m'       # Black
colors[On_Red]='\033[41m'         # Red
colors[On_Green]='\033[42m'       # Green
colors[On_Yellow]='\033[43m'      # Yellow
colors[On_Blue]='\033[44m'        # Blue
colors[On_Purple]='\033[45m'      # Purple
colors[On_Cyan]='\033[46m'        # Cyan
colors[On_White]='\033[47m'       # White

# High Intensity
colors[IBlack]='\033[0;90m'       # Black
colors[IRed]='\033[0;91m'         # Red
colors[IGreen]='\033[0;92m'       # Green
colors[IYellow]='\033[0;93m'      # Yellow
colors[IBlue]='\033[0;94m'        # Blue
colors[IPurple]='\033[0;95m'      # Purple
colors[ICyan]='\033[0;96m'        # Cyan
colors[IWhite]='\033[0;97m'       # White

# Bold High Intensity
colors[BIBlack]='\033[1;90m'      # Black
colors[BIRed]='\033[1;91m'        # Red
colors[BIGreen]='\033[1;92m'      # Green
colors[BIYellow]='\033[1;93m'     # Yellow
colors[BIBlue]='\033[1;94m'       # Blue
colors[BIPurple]='\033[1;95m'     # Purple
colors[BICyan]='\033[1;96m'       # Cyan
colors[BIWhite]='\033[1;97m'      # White

# High Intensity backgrounds
colors[On_IBlack]='\033[0;100m'   # Black
colors[On_IRed]='\033[0;101m'     # Red
colors[On_IGreen]='\033[0;102m'   # Green
colors[On_IYellow]='\033[0;103m'  # Yellow
colors[On_IBlue]='\033[0;104m'    # Blue
colors[On_IPurple]='\033[0;105m'  # Purple
colors[On_ICyan]='\033[0;106m'    # Cyan
colors[On_IWhite]='\033[0;107m'   # White


color=${colors[$input_color]}
white=${colors[White]}
# echo $white



for i in "${!colors[@]}"
do
  echo -e "$i = ${colors[$i]}I love you$white"
done

ผลลัพธ์

ป้อนคำอธิบายรูปภาพที่นี่

หวังว่าภาพนี้จะช่วยคุณเลือกสีสำหรับทุบตี: D


ควรสังเกตว่าต้องใช้ bash v4
Synox

14

หากคุณกำลังใช้zshหรือbash

black() {
    echo -e "\e[30m${1}\e[0m"
}

red() {
    echo -e "\e[31m${1}\e[0m"
}

green() {
    echo -e "\e[32m${1}\e[0m"
}

yellow() {
    echo -e "\e[33m${1}\e[0m"
}

blue() {
    echo -e "\e[34m${1}\e[0m"
}

magenta() {
    echo -e "\e[35m${1}\e[0m"
}

cyan() {
    echo -e "\e[36m${1}\e[0m"
}

gray() {
    echo -e "\e[90m${1}\e[0m"
}

black 'BLACK'
red 'RED'
green 'GREEN'
yellow 'YELLOW'
blue 'BLUE'
magenta 'MAGENTA'
cyan 'CYAN'
gray 'GRAY'

ลองออนไลน์


14

เราสามารถใช้สีจริง 24 Bits RGBสำหรับทั้งข้อความและพื้นหลัง!

 ESC[38;2;⟨r⟩;⟨g⟩;⟨bm  /*Foreground color*/
 ESC[48;2;⟨r⟩;⟨g⟩;⟨bm  /*Background color*/

ตัวอย่างข้อความสีแดงและแท็กปิด:

 echo -e "\e[38;2;255;0;0mHello world\e[0m"

เครื่องกำเนิดไฟฟ้า:

24 บิต:เนื่องจากกราฟิกการ์ด "สีจริง" ที่มีสี 16 ถึง 24 บิตกลายเป็นเรื่องธรรมดา Xterm, Konsole ของ KDE เช่นเดียวกับเทอร์มินัลที่ใช้ libvte ทั้งหมด (รวมถึงเทอร์มินัล GNOME) สนับสนุนการตั้งค่าสีพื้นหน้าและบิตพื้นหลัง 24 บิต https: / /en.wikipedia.org/wiki/ANSI_escape_code#24-bit

การใช้สคริปต์ของฉันปลอดภัยหรือไม่?

ใช่ เทอร์มินัล 8 และ 16 บิตจะแสดงเป็นทางเลือกสีในช่วงของพาเลตที่มีอยู่ให้ความคมชัดที่ดีที่สุดไม่แตก!


นอกจากนี้ยังไม่มีใครสังเกตเห็นประโยชน์ของรหัส ANSI 7 วิดีโอตรงกันข้าม

มันยังคงสามารถอ่านได้ในทุกรูปแบบสีเทอร์มินัลพื้นหลังสีดำหรือสีขาวหรือจานสีเพ้อฝันอื่น ๆ โดยการสลับสีพื้นหน้าและสีพื้นหลัง

ตัวอย่างเช่นสำหรับพื้นหลังสีแดงที่ใช้งานได้ทุกที่:

echo -e "\033[31;7mHello world\e[0m";

นี่คือลักษณะที่ปรากฏเมื่อเปลี่ยนโครงร่างในตัวเครื่อง:

ป้อนคำอธิบายรูปภาพที่นี่

นี่คือสคริปต์ลูปที่ใช้สำหรับ gif

for i in {30..49};do echo -e "\033[$i;7mReversed color code $i\e[0m Hello world!";done

ดูhttps://en.wikipedia.org/wiki/ANSI_escape_code#SGR_(Select_Graphic_Rendition)_parameters


11

รหัสเหล่านี้ใช้ได้กับกล่อง Ubuntu ของฉัน:

ป้อนคำอธิบายรูปภาพที่นี่

echo -e "\x1B[31m foobar \x1B[0m"
echo -e "\x1B[32m foobar \x1B[0m"
echo -e "\x1B[96m foobar \x1B[0m"
echo -e "\x1B[01;96m foobar \x1B[0m"
echo -e "\x1B[01;95m foobar \x1B[0m"
echo -e "\x1B[01;94m foobar \x1B[0m"
echo -e "\x1B[01;93m foobar \x1B[0m"
echo -e "\x1B[01;91m foobar \x1B[0m"
echo -e "\x1B[01;90m foobar \x1B[0m"
echo -e "\x1B[01;89m foobar \x1B[0m"
echo -e "\x1B[01;36m foobar \x1B[0m"

พิมพ์ตัวอักษร abcd ทั้งหมดในสีที่ต่างกัน:

echo -e "\x1B[0;93m a \x1B[0m b \x1B[0;92m c \x1B[0;93m d \x1B[0;94m"

สำหรับวง:

for (( i = 0; i < 17; i++ )); 
do echo "$(tput setaf $i)This is ($i) $(tput sgr0)"; 
done

ป้อนคำอธิบายรูปภาพที่นี่


2
โดยวิธีการ: สิ่งนี้ไม่ได้ขึ้นอยู่กับการติดตั้ง Ubuntu เฉพาะรุ่น แต่ใช้ PuTTY!
urzeit

11

ฉันพบคำตอบที่ยอดเยี่ยมของShakiba Moshiriในขณะที่ฉันกำลังดูข้อมูลในหัวข้อนั้น…จากนั้นฉันก็มีความคิด ... และมันก็จบลงด้วยฟังก์ชั่นที่ดีมากใช้งานง่ายมาก😁
ดังนั้นฉันจึงแบ่งปันมัน😉

https://github.com/ppo/bash-colors

การใช้งาน: $(c <flags>)ภายในecho -eหรือprintf

 ┌───────┬─────────────────┬──────────┐   ┌───────┬─────────────────┬──────────┐
  Code   Style            Octal        Code   Style            Octal    
 ├───────┼─────────────────┼──────────┤   ├───────┼─────────────────┼──────────┤
    -    Foreground       \033[3..       B    Bold             \033[1m  
    _    Background       \033[4..       U    Underline        \033[4m  
 ├───────┼─────────────────┼──────────┤      F    Flash/blink      \033[5m  
    k    Black            ......0m       N    Negative         \033[7m  
    r    Red              ......1m    ├───────┼─────────────────┼──────────┤
    g    Green            ......2m       L    Normal (unbold)  \033[22m 
    y    Yellow           ......3m       0    Reset            \033[0m  
    b    Blue             ......4m    └───────┴─────────────────┴──────────┘
    m    Magenta          ......5m 
    c    Cyan             ......6m 
    w    White            ......7m 
 └───────┴─────────────────┴──────────┘

ตัวอย่าง:

echo -e "$(c 0wB)Bold white$(c) and normal"
echo -e "Normal text… $(c r_yB)BOLD red text on yellow background… $(c _w)now on
  white background… $(c 0U) reset and underline… $(c) and back to normal."

10

สำหรับการอ่าน

หากคุณต้องการปรับปรุงความสามารถในการอ่านของรหัสคุณสามารถechoสตริงก่อนแล้วจึงเพิ่มสีในภายหลังโดยใช้sed:

echo 'Hello World!' | sed $'s/World/\e[1m&\e[0m/' 

1
ฉันชอบคำตอบนี้จริงๆ! คุณช่วยอธิบาย $ ในคำสั่ง sed ได้ไหม?
Patrick

2
$ '<something>' ใช้สำหรับการทุบตีไม่ใช่การกดปุ่ม มันบอกให้ทุบตีเพื่อประมวลผล \ e เป็นลำดับ escape และใส่อักขระ "escape" โดยปกติคุณจะเห็นรูปแบบที่ง่ายกว่าเช่น $ '\ t' หรือ $ '\ n' เพื่อรับแท็บหรืออักขระขึ้นบรรทัดใหม่ให้กับ คำสั่ง
dsz

8

คำตอบที่ฉันชอบที่สุดคือ colorEcho

เพียงแค่โพสต์ตัวเลือกอื่นคุณสามารถตรวจสอบ xcol เครื่องมือเล็ก ๆ นี้

https://ownyourbits.com/2017/01/23/colorize-your-stdout-with-xcol/

คุณใช้มันเหมือนกับ grep และมันจะ colorize stdin ด้วยสีที่ต่างกันสำหรับแต่ละอาร์กิวเมนต์ตัวอย่างเช่น

sudo netstat -putan | xcol httpd sshd dnsmasq pulseaudio conky tor Telegram firefox "[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+" ":[[:digit:]]+" "tcp." "udp." LISTEN ESTABLISHED TIME_WAIT

ตัวอย่าง xcol

โปรดทราบว่ามันยอมรับการแสดงออกปกติใด ๆ ที่ sed จะยอมรับ

เครื่องมือนี้ใช้คำจำกัดความต่อไปนี้

#normal=$(tput sgr0)                      # normal text
normal=$'\e[0m'                           # (works better sometimes)
bold=$(tput bold)                         # make colors bold/bright
red="$bold$(tput setaf 1)"                # bright red text
green=$(tput setaf 2)                     # dim green text
fawn=$(tput setaf 3); beige="$fawn"       # dark yellow text
yellow="$bold$fawn"                       # bright yellow text
darkblue=$(tput setaf 4)                  # dim blue text
blue="$bold$darkblue"                     # bright blue text
purple=$(tput setaf 5); magenta="$purple" # magenta text
pink="$bold$purple"                       # bright magenta text
darkcyan=$(tput setaf 6)                  # dim cyan text
cyan="$bold$darkcyan"                     # bright cyan text
gray=$(tput setaf 7)                      # dim white text
darkgray="$bold"$(tput setaf 0)           # bold black = dark gray text
white="$bold$gray"                        # bright white text

ฉันใช้ตัวแปรเหล่านี้ในสคริปต์ของฉันอย่างนั้น

echo "${red}hello ${yellow}this is ${green}coloured${normal}"

6

หากต้องการขยายคำตอบนี้สำหรับคนที่ขี้เกียจของเรา:

function echocolor() { # $1 = string
    COLOR='\033[1;33m'
    NC='\033[0m'
    printf "${COLOR}$1${NC}\n"
}

echo "This won't be colored"
echocolor "This will be colorful"

2
อย่าทำฮาร์ดโค้ดโค้ดหลุดจากขั้ว ใช้tput; นั่นคือสิ่งที่มันมีไว้สำหรับ!
Toby Speight

@TobySpeight แม้ว่าอาจเป็นจริงสำหรับการสนับสนุนหลายแพลตฟอร์ม (ในทางทฤษฎี) หากโปสเตอร์พบว่ามันทำงานได้ในโลกของตัวเองทำไมไม่เห็นด้วยและห้ามผู้อื่นในโลกที่คล้ายกันจากการใช้เทคนิค? ในกรณีที่ฉันพยายามคล้ายกันใน Ubuntu ทุบตี 16.04 และใช้งานได้ ในฐานะผู้ใช้รายเดียวบนแพลตฟอร์มนี้ฉันพบว่าคำตอบนี้ยอมรับได้ ฉันจะใช้tputสำหรับscและrcแม้ว่า (บันทึกเคอร์เซอร์คืนค่าเคอร์เซอร์) แม้ว่าคำตอบนี้จะเรียกฉันว่า "ขี้เกียจ" แต่มันอาจเป็นคำพูดที่ "ปฏิบัติ" หรือ "ตรงประเด็น"
WinEunuuchs2Unix

วิธีการแก้ปัญหาของฉันคล้ายกับสิ่งนี้กักขังเชลล์ภายในอย่างหมดจดเนื่องจากการฟอร์กกระบวนการภายนอกสอง subshells ฯลฯ สำหรับทุกข้อความในสคริปต์เพียงแค่ ... กลิ่นที่ไม่พึงประสงค์
Amit Naidu

6

เพื่อแสดงข้อความที่มีสีแตกต่างกันคุณสามารถทำ:

echo -e "\033[31;1mYour Message\033[0m"

- สีดำ 0; 30 สีเทาเข้ม 1; 30

- แดง 0; 31 Light Red 1; 31

- สีเขียว 0; 32 สีเขียวอ่อน 1; 32

- บราวน์ / ส้ม 0; 33 เหลือง 1; 33

-Blue 0; 34 Light Blue 1; 34

- สีม่วง 0; 35 สีม่วงอ่อน 1; 35

-Cyan 0; 36 Light Cyan 1; 36

- เทาอ่อน 0; 37 ขาว 1; 37


5

คุณควรใช้ tput แทนลำดับการควบคุม ANSI แบบดิบ

เนื่องจากมีภาษาควบคุมเทอร์มินัลต่าง ๆ จำนวนมากโดยปกติระบบจะมีเลเยอร์การสื่อสารระดับกลาง รหัสจริงถูกค้นหาในฐานข้อมูลสำหรับชนิดเทอร์มินัลที่ตรวจพบในปัจจุบันและคุณให้คำขอมาตรฐานกับ API หรือ (จากเชลล์) ไปยังคำสั่ง

tputหนึ่งในคำสั่งเหล่านี้คือ tputยอมรับชุดของตัวย่อที่เรียกว่าชื่อความสามารถและพารามิเตอร์ใด ๆ ตามความเหมาะสมจากนั้นค้นหาลำดับการหลีกเลี่ยงที่ถูกต้องสำหรับเทอร์มินัลที่ตรวจพบในฐานข้อมูล terminfo และพิมพ์รหัสที่ถูกต้อง

จากhttp://wiki.bash-hackers.org/scripting/terminalcodes

ที่กล่าวว่าฉันเขียนห้องสมุดผู้ช่วยขนาดเล็กที่เรียกว่าbash-tintซึ่งเพิ่มอีกเลเยอร์บน tput ทำให้ง่ายยิ่งขึ้นในการใช้ (imho):

ตัวอย่าง: tint "white(Cyan(T)Magenta(I)Yellow(N)Black(T)) is bold(really) easy to use."

จะให้ผลลัพธ์ดังต่อไปนี้: ป้อนคำอธิบายรูปภาพที่นี่


5

tputฉันแทนฮาร์ดเข้ารหัสรหัสหนีที่เฉพาะเจาะจงไปยังสถานีปัจจุบันของคุณคุณควรใช้

นี่คือสคริปต์สาธิตที่ฉันโปรดปราน:

#!/bin/bash

tput init

end=$(( $(tput colors)-1 ))
w=8
for c in $(seq 0 $end); do
    eval "$(printf "tput setaf %3s   " "$c")"; echo -n "$_"
    [[ $c -ge $(( w*2 )) ]] && offset=2 || offset=0
    [[ $(((c+offset) % (w-offset))) -eq $(((w-offset)-1)) ]] && echo
done

tput init

เอาท์พุท 256 สีโดย tput


4

ฉันใช้สิ่งนี้ในการพิมพ์สี

#!/bin/bash
#--------------------------------------------------------------------+
#Color picker, usage: printf $BLD$CUR$RED$BBLU'Hello World!'$DEF     |
#-------------------------+--------------------------------+---------+
#       Text color        |       Background color         |         |
#-----------+-------------+--------------+-----------------+         |
# Base color|Lighter shade| Base color   | Lighter shade   |         |
#-----------+-------------+--------------+-----------------+         |
BLK='\e[30m'; blk='\e[90m'; BBLK='\e[40m'; bblk='\e[100m' #| Black   |
RED='\e[31m'; red='\e[91m'; BRED='\e[41m'; bred='\e[101m' #| Red     |
GRN='\e[32m'; grn='\e[92m'; BGRN='\e[42m'; bgrn='\e[102m' #| Green   |
YLW='\e[33m'; ylw='\e[93m'; BYLW='\e[43m'; bylw='\e[103m' #| Yellow  |
BLU='\e[34m'; blu='\e[94m'; BBLU='\e[44m'; bblu='\e[104m' #| Blue    |
MGN='\e[35m'; mgn='\e[95m'; BMGN='\e[45m'; bmgn='\e[105m' #| Magenta |
CYN='\e[36m'; cyn='\e[96m'; BCYN='\e[46m'; bcyn='\e[106m' #| Cyan    |
WHT='\e[37m'; wht='\e[97m'; BWHT='\e[47m'; bwht='\e[107m' #| White   |
#-------------------------{ Effects }----------------------+---------+
DEF='\e[0m'   #Default color and effects                             |
BLD='\e[1m'   #Bold\brighter                                         |
DIM='\e[2m'   #Dim\darker                                            |
CUR='\e[3m'   #Italic font                                           |
UND='\e[4m'   #Underline                                             |
INV='\e[7m'   #Inverted                                              |
COF='\e[?25l' #Cursor Off                                            |
CON='\e[?25h' #Cursor On                                             |
#------------------------{ Functions }-------------------------------+
# Text positioning, usage: XY 10 10 'Hello World!'                   |
XY () { printf "\e[$2;${1}H$3"; }                                   #|
# Print line, usage: line - 10 | line -= 20 | line 'Hello World!' 20 |
line () { printf -v _L %$2s; printf -- "${_L// /$1}"; }             #|
# Create sequence like {0..(X-1)}                                    |
que () { printf -v _N %$1s; _N=(${_N// / 1}); printf "${!_N[*]}"; } #|
#--------------------------------------------------------------------+

สีพื้นฐานทั้งหมดถูกตั้งค่าเป็น vars และยังมีฟังก์ชั่นที่มีประโยชน์บางอย่างเช่น XY, line และ que แหล่งสคริปต์นี้ในหนึ่งในของคุณและใช้ vars สีและฟังก์ชั่นทั้งหมด


3

และนี่คือสิ่งที่ฉันเคยเห็นชุดค่าผสมทั้งหมดและตัดสินใจว่าจะอ่านแบบไหนดี:

for (( i = 0; i < 8; i++ )); do
    for (( j = 0; j < 8; j++ )); do
        printf "$(tput setab $i)$(tput setaf $j)(b=$i, f=$j)$(tput sgr0)\n"
    done
done

2

ฉันได้เขียนย้อยเพื่อให้บรรลุว่า

คุณสามารถทำได้

pip install swag

ตอนนี้คุณสามารถติดตั้งคำสั่ง escape ทั้งหมดเป็นไฟล์ txt ไปยังปลายทางที่กำหนดผ่าน:

swag install -d <colorsdir>

หรือง่ายยิ่งขึ้นผ่าน:

swag install

ซึ่งจะทำการติดตั้งสี~/.colorsต่างๆ

ไม่ว่าคุณจะใช้สิ่งเหล่านี้:

echo $(cat ~/.colors/blue.txt) This will be blue

หรือด้วยวิธีนี้ซึ่งฉันคิดว่าน่าสนใจกว่า:

swag print -c red -t underline "I will turn red and be underlined"

ลองดูในasciinema !


0

นี่เป็นสคริปต์ตัวเล็ก ๆ ที่เรียบง่ายฉันเพิ่งรวบรวมกันเมื่อไม่นานมานี้ที่จะทำให้สีของการป้อน piped แทนที่จะใช้ "Toilet"

File: color.bsh

#!/usr/bin/env bash 

## A.M.Danischewski 2015+(c) Free - for (all (uses and 
## modifications)) - except you must keep this notice intact. 

declare INPUT_TXT=""
declare    ADD_LF="\n" 
declare -i DONE=0
declare -r COLOR_NUMBER="${1:-247}"
declare -r ASCII_FG="\\033[38;05;"
declare -r COLOR_OUT="${ASCII_FG}${COLOR_NUMBER}m"

function show_colors() { 
   ## perhaps will add bg 48 to first loop eventually 
 for fgbg in 38; do for color in {0..256} ; do 
 echo -en "\\033[${fgbg};5;${color}m ${color}\t\\033[0m"; 
 (($((${color}+1))%10==0)) && echo; done; echo; done
} 

if [[ ! $# -eq 1 || ${1} =~ ^-. ]]; then 
  show_colors 
  echo " Usage: ${0##*/} <color fg>" 
  echo "  E.g. echo \"Hello world!\" | figlet | ${0##*/} 54" 
else  
 while IFS= read -r PIPED_INPUT || { DONE=1; ADD_LF=""; }; do 
  PIPED_INPUT=$(sed 's#\\#\\\\#g' <<< "${PIPED_INPUT}")
  INPUT_TXT="${INPUT_TXT}${PIPED_INPUT}${ADD_LF}"
  ((${DONE})) && break; 
 done
 echo -en "${COLOR_OUT}${INPUT_TXT}\\033[00m"
fi 

จากนั้นเรียกมันด้วยสีแดง (196):
$> echo "text you want colored red" | color.bsh 196


ตรรกะวงสีพบที่การกวดวิชาสี Ascii นี้ที่ดี: misc.flogisoft.com/bash/tip_colors_and_formatting

-1

อ้างถึง:

echo_red(){
    echo -e "\e[1;31m$1\e[0m"
}
echo_green(){
    echo -e "\e[1;32m$1\e[0m"
}
echo_yellow(){
    echo -e "\e[1;33m$1\e[0m"
}
echo_blue(){
    echo -e "\e[1;34m$1\e[0m"
}

โปรดทราบว่าฟังก์ชั่น echo_green ควรมีรหัส 32 มากกว่า 33 ไม่สามารถแก้ไข b / c stackoverflow ต้องการการแก้ไขอักขระอย่างน้อย 6 ตัว
Daniel

-2

นี่คือทางออกที่ง่ายที่สุดและอ่านได้ ด้วย bashj ( https://sourceforge.net/projects/bashj/ ) คุณเพียงแค่เลือกหนึ่งในบรรทัดเหล่านี้:

#!/usr/bin/bash

W="Hello world!"
echo $W

R=130
G=60
B=190

echo u.colored($R,$G,$B,$W)

echo u.colored(255,127,0,$W)
echo u.red($W)
echo u.bold($W)
echo u.italic($W)

Y=u.yellow($W)
echo $Y
echo u.bold($Y)

256x256x256 มีสีให้เลือกหากคุณมีการรองรับสีในแอปพลิเคชั่นเครื่องเทอร์มินัลของคุณ


-3

หลังจากผสมโซลูชันอื่น ๆ จากเธรดนี่คือวิธีที่ฉันจัดการเพื่อให้ได้สีในnpm scriptsเอาต์พุต (gitbash CLI):

{
    "deploy": "echo \u001b[1;32m && ng build && echo \u001b[1;0mdeploy {\u001b[1;33mcopy\u001b[1;0m: \u001b[1;32m0% && cp -r -f dist/packaged/* \\\\SERVER-01\\dist\\ && echo \u001b[1;0mdeploy {\u001b[1;33mcopy\u001b[1;0m} \u001b[1;34m\u001b[1;1m100% DEPLOYED"
}

ป้อนคำอธิบายรูปภาพที่นี่


-4

เช่นเดียวกับสิ่งเล็กน้อยในนั้นการส่งผ่าน grep จะเน้นเป็นสีแดง (แต่เป็นสีแดงเท่านั้น) คุณยังสามารถใช้ชื่อ pipes เพื่อให้สายของคุณใกล้กับส่วนท้ายของบรรทัด:

 grep '.*' --color=always <(echo "foobar")

คุณไม่มีจุดที่สามารถเลือกสีที่คุณต้องการได้ grep เป็นยูทิลิตี้การระบายสีเป็นที่น่าสงสัยจริงๆ: P
Ahmed Masud

ไม่จริง OP ระบุว่าพวกเขาต้องการสีแดง ฉันยอมรับว่ามีตัวเลือกที่ดีกว่าการใช้ grep แต่จะบรรลุสิ่งที่พวกเขาถามและประหยัดโดยไม่ต้องเรียนรู้สิ่งที่ซับซ้อนมากขึ้น
รอบชิงชนะเลิศ

-5
red='\e[0;31m'
NC='\e[0m' # No Color
echo -e "${red}Hello Stackoverflow${NC}"

คำตอบนี้ถูกต้องยกเว้นว่าการโทรหาสีไม่ควรอยู่ในเครื่องหมายคำพูด

echo -e ${red}"Hello Stackoverflow"${NC}

ควรทำเคล็ดลับ


3
ทำงานได้ดีภายในเครื่องหมายคำพูด สวิตช์ -e จะประเมินสิ่งที่อยู่ในเครื่องหมายคำพูดด้วย เล่นทั้งสอง (ภายในและคำพูดนอก) โดยใช้ทุบตี -x echo -e '\e[0;31mHello Stackoverflow\e[0m'ผลคำสั่งดำเนินการเดียวกัน ดังนั้นมันจึงเหมือนกับการทุบตี
naab
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.