เปลี่ยนแบบอักษรในคำสั่ง echo


16

เป็นไปได้หรือไม่ที่จะเปลี่ยนคุณลักษณะแบบอักษรของเอาต์พุตของ echo ใน zsh หรือ bash?

สิ่งที่ฉันต้องการเป็นสิ่งที่คล้ายกับ:

echo -n "This is the font: normal "
echo -n $font=italic "italic,"
echo -n $font=bold "bold,"
echo -n "and"
echo -n $font=small "small".

เพื่อที่จะพิมพ์: "นี่คือตัวอักษร: ปกติ, ตัวเอียง , ตัวหนา , ขนาดเล็ก " ในบรรทัดของข้อความ


สิ่งนี้เกี่ยวข้องกับเทอร์มินัลอีมูเลเตอร์มากกว่าคำถามกับเชลล์ที่ใช้ หัวข้อคำถามนี้ประกอบด้วยพอยน์เตอร์ที่มีค่าบางอย่างฉันคิดว่า
sr_

โดยปกติคุณไม่สามารถเปลี่ยนขนาดตัวอักษร สิ่งเดียวที่คุณสามารถทำได้คือเปลี่ยนสีและบางครั้งคุณลักษณะตัวหนา / ขีดเส้นใต้ สำหรับสิ่งนี้คุณสามารถใช้ ANSI escape sequences ดูตัวอย่างเช่นbashguru.com/2010/01/shell-colors-colorizing-shell-scripts.htmlสำหรับตัวอย่าง
jofel

คำตอบ:


15

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

ใน bash (หรือใน zsh หรือเชลล์อื่น ๆ ) คุณสามารถใช้ลำดับการยกเว้นเทอร์มินัลได้โดยตรง (นอกเหนือจากสิ่งแปลกใหม่ไม่กี่รายการ CSIเป็นESC [ลายลักษณ์อักษร$'\e['ในทุบตี CSI Ps mลำดับหลบหนีคุณลักษณะการเปลี่ยนแปลงคือ

echo $'\e[32;1mbold red\e[0mplain\e[4munderlined'

Zsh มีฟังก์ชั่นอำนวยความสะดวกสำหรับสิ่งนั้น

autoload -U colors
colors
echo $bold_color$fg[red]bold red${reset_color}plain$'\e'$color[underline]munderlined

16

คุณสามารถรวมคำจำกัดความสีเหล่านี้ในสคริปต์หรือไฟล์ต้นฉบับ อาจมีลักษณะเช่นนี้

#!/bin/bash
PATH=/bin:/usr/bin:

NONE='\033[00m'
RED='\033[01;31m'
GREEN='\033[01;32m'
YELLOW='\033[01;33m'
PURPLE='\033[01;35m'
CYAN='\033[01;36m'
WHITE='\033[01;37m'
BOLD='\033[1m'
UNDERLINE='\033[4m'

echo -e "This text is ${RED}red${NONE} and ${GREEN}green${NONE} and ${BOLD}bold${NONE} and ${UNDERLINE}underlined${NONE}."

tput sgr0

โปรดสังเกตว่าคุณควรรีเซ็ตรหัสสี ANSI หลังจากแต่ละอินสแตนซ์ที่คุณเรียกใช้การเปลี่ยนแปลง tput sgr0รีเซ็ตเปลี่ยนแปลงทั้งหมดที่คุณได้ทำในสถานี

ฉันเชื่อว่าการเปลี่ยนขนาดตัวอักษรหรือตัวเอียงจะเฉพาะเจาะจงกับเทอร์มินัลที่คุณใช้

ในขณะที่คู่มือนี้มีความเฉพาะเจาะจงกับการกำหนด bash prompt ของคุณเป็นการอ้างอิงที่ดีสำหรับรหัสสีและสร้างแนวคิดบางประการเกี่ยวกับสิ่งที่คุณสามารถทำได้


5

ดูเหมือนว่ารูปแบบไม่สามารถจัดการอักขระด้านหน้าของ[0x1b][

บรรทัดแรกทำให้เป็นตัวหนา:

 echo -e "\x1b[1m bold"
     echo -e "\x1b[30m black"
     echo -e "\x1b[31m red"
     echo -e "\x1b[32m green"
     echo -e "\x1b[33m yellow"
     echo -e "\x1b[34m blue"
     echo -e "\x1b[35m mag"
     echo -e "\x1b[36m cyan"
     echo -e "\x1b[37m white"   

สำหรับประเภททั่วไปฉันรู้

echo -e "\x1b[0m io-std"
echo -e "\x1b[1m bold"
echo -e "\x1b[2m normal"

และจากความคิดเห็นขอบคุณ manatwork และ GypsyCosmonaut:

echo -e "\x1b[3m italic"
echo -e "\x1b[4m underlined"
echo -e "\x1b[5m blinking"
echo -e "\x1b[7m inverted"

และไม่รู้ความแตกต่างระหว่าง io-std และปกติ

ฉันไม่ได้เห็นตัวเอียงหรือตัวเล็กในเปลือก

คุณสามารถใส่พวกเขา (ขอบคุณ manatwork เกินไป) โดย Ctrl + ในทุบตีที่มันจะแสดงเป็น v ESC ^[หมายถึงลำดับ ANSI ทั้งหมดนี้จะมีลักษณะเช่น^[[1m boldหรือ^[[1mbold(เพื่อหลีกเลี่ยงว่างเปล่าก่อนที่ 'ตัวหนา)

บรรณาธิการหลายคนมีปัญหากับ (ถ่าน) 0x1b ทางเลือก: คัดลอก / วางจากที่อื่นหรือใช้

echo -e "\x1b[1m bold"

ในทุบตีหรือแก้ไข hex


1
สามารถพิมพ์อักขระ Escape ได้: Ctrl + V, Esc (จะปรากฏเป็น“ ^ [” ซึ่งหมายความว่าลำดับ ANSI ทั้งหมดจะมีลักษณะเหมือน“ ^ [[1mbold”))
จัดการงาน

1
มีคุณสมบัติที่ต้องพูดถึงเพิ่มเติม: \e[4mขีดเส้นใต้, \e[5mกะพริบ, \e[7mกลับหัว
จัดการ

@manatwork: เพิ่มพวกเขา
ผู้ใช้ไม่รู้จัก

@userunknown ขอบคุณที่ช่วยด้วยการแก้ไขโค้ดของคุณฉันพบว่าตัวเอียงคือecho -e "\x1b[3m italic"
GypsyCosmonaut

0

ที่นี่:

http://en.wikipedia.org/wiki/ANSI_escape_code

(หมายเหตุ: ส่วนใหญ่มักจะไม่ทำงาน แต่ส่วนใหญ่จะทำเครื่องหมายไว้)

ฉันกำลังสร้างเกมใน terminal และได้รับความไว้วางใจอย่างมากในลิงค์ด้านบน มันยังบอกวิธีการซ่อน / ยกเลิกการซ่อนเคอร์เซอร์ทำสี (30's), "bold" (จางลง), เข้มขึ้น, ขีดเส้นใต้, ตัวเอียง, สีพื้นหลัง (40 แทน 30) ฯลฯ นอกจากนี้คุณยังสามารถเปลี่ยนตำแหน่งของเคอร์เซอร์ได้ ซึ่งมีประโยชน์มาก - ตัวอย่างเช่น"\x1B[1A"เลื่อนเคอร์เซอร์ขึ้นหนึ่งบรรทัด"\x1B[0;0H"เลื่อนเคอร์เซอร์ไปที่แถว 0, col 0 "\x1B[2J"ล้างหน้าจอและ"\x1B[2K"ล้างบรรทัด

เพื่อจุดประสงค์ของคุณในฐานะที่เป็นคนพูดว่า:

echo -e "\x1b[30;44m black with blue background \x1b[m"

echo -e "\x1b[31;42m red with green background \x1b[m"

echo -e "\x1b[32;40m green with black background \x1b[m"

echo -e "\x1b[8m Invisible; na na na na boo boo \x1b[m"

หมายเหตุ:คุณต้อง-eใน

echo **-e** "\x1b[35;1m Light purple \x1b[m"

หรือคุณต้องใช้เครื่องหมายคำพูดเดี่ยว พิมพ์man echoเพื่อดูว่าทำไม (เครื่องหมายคำพูดคู่มักจะเจ็บปวดเมื่อพิมพ์เมื่อฉันต้องการสิ่งที่จะไม่ขยายหรือฉันต้องการลำดับการหลบหนีของ ANSI ฉันใช้เครื่องหมายคำพูดเดี่ยวเพราะมันง่าย - แม้ว่าฉันจะคุ้นเคยกับการทำหลายครั้ง - เพื่อลืม-eซึ่งในกรณีนี้คุณจะได้รับ " box with numbers and letters[35; 1m")

ทุกครั้งที่คุณเห็นCSIแทนที่ด้วย"\x1b["(หรือ"\e["หรือ"\u1b[") "\x1b["ฉันคิดว่าเป็นมาตรฐานมากกว่า แต่ฉันไม่รู้จริง ๆ ว่าความแตกต่างระหว่างพวกเขาคืออะไร


หากคุณชอบความรกของสายอักขระที่มีอักขระพิเศษอย่าใช้ \ e :-)
clearlight

@ ชัดเจนฉันไม่แน่ใจว่าคุณหมายถึงอะไร ฉันคิดว่าคุณน่าจะพูดว่า "use \ e" อย่างไรก็ตาม\eได้รับการสนับสนุนน้อยกว่าที่\x1bฉันได้พบ สิ่งที่เหมาะสมที่สุดที่จะทำคืออย่างใดอย่างหนึ่งesc=$'\e'หรือesc=$'\x1b'(นี่คือทุบตี) แล้วใช้"${esc}[34;1m"(สำหรับเช่นสีฟ้าสดใส) ฉันมีตัวอย่างกึ่งซับซ้อนที่นี่ ( github.com/dylnmc/ps1porn/blob/master/powerline.sh ) สำหรับสตริง bash prompt จริง;) โปรดให้อภัยชื่อ repo - คุณสามารถขอบคุณผู้คนในช่องของ freenode # archlinux-offtopic สำหรับสิ่งนั้น
Dylan

เหตุผลในการทำesc=$'\e'คือช่วยให้ bash สร้างตัวละคร ansi-escape ได้ทันทีและคุณได้รับประโยชน์จากมันในสองวิธี บางครั้งในความเป็นจริง (ตามที่แสดงในลิงค์ GitHub) คุณต้องใช้วิธีนี้เพื่อให้ได้สีเพื่อแสดงอย่างถูกต้อง สำหรับ bash รุ่นเก่ารวมถึง sh shell คุณควร (แต่ไม่จำเป็นต้องใช้) ใช้วิธีนี้ในการรับสีเพื่อแสดง ... เมื่อใช้เทอร์มินัลใช้ลำดับการหลีกเลี่ยงที่เทอร์มินัลสมัยใหม่ส่วนใหญ่ทำ
Dylan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.