Thay đổi phông chữ trong lệnh echo


16

Có thể thay đổi các thuộc tính phông chữ của đầu ra của tiếng vang trong zsh hoặc bash không?

Những gì tôi muốn là một cái gì đó giống như:

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".

để nó in: "Đây là phông chữ: bình thường, in nghiêng , in đậm , nhỏ " trong một dòng văn bản.


Điều này có liên quan nhiều đến trình giả lập thiết bị đầu cuối đang được đề cập hơn là với trình bao được sử dụng. Chủ đề câu hỏi này chứa một số gợi ý có giá trị, tôi nghĩ
sr_

Thông thường, bạn không thể thay đổi kích thước phông chữ. Điều duy nhất, bạn thường có thể làm, là thay đổi màu sắc và đôi khi thuộc tính in đậm / gạch chân. Đối với điều này, bạn có thể sử dụng các chuỗi thoát ANSI. Xem ví dụ: bashguru.com/2010/01/shell-colors-colorizing-shell-scripts.html để biết một số ví dụ.
jofel

Câu trả lời:


15

Trên hầu hết nếu không phải tất cả các trình giả lập thiết bị đầu cuối, bạn không thể đặt các kích thước phông chữ khác nhau hoặc các phông chữ khác nhau, chỉ có màu sắc và một vài thuộc tính (đậm, gạch chân, nổi bật).

Trong bash (hoặc trong zsh hoặc bất kỳ shell nào khác), bạn có thể sử dụng trực tiếp các chuỗi thoát thiết bị đầu cuối (ngoài một vài thứ kỳ lạ, tất cả các thiết bị đầu cuối đều đi theo hướng dẫn của xterm trong những ngày này). CSIESC [, viết bằng $'\e['bash. Trình tự thoát để thay đổi thuộc tính là CSI Ps m.

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

Zsh có một chức năng thuận tiện cho việc đó.

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

16

Bạn có thể bao gồm các định nghĩa màu này trong một tập lệnh hoặc tập tin nguồn. Có thể trông giống như thế này.

#!/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

Lưu ý rằng bạn nên đặt lại mã màu ANSI sau mỗi phiên bản bạn gọi thay đổi. Đặt tput sgr0lại tất cả các thay đổi bạn đã thực hiện trong thiết bị đầu cuối.

Tôi tin rằng việc thay đổi kích thước phông chữ hoặc chữ nghiêng sẽ cụ thể cho thiết bị đầu cuối bạn đang sử dụng.

Mặc dù hướng dẫn này dành riêng cho việc tùy chỉnh dấu nhắc bash của bạn, nhưng đây là một tài liệu tham khảo tốt cho mã màu và tạo ra một số ý tưởng về những gì bạn có thể làm.


5

Có vẻ như cách bố trí không thể xử lý [0x1b]-character ở phía trước [.

Dòng đầu tiên làm đậm:

 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"   

Đối với loại chung, tôi chỉ biết

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

và từ các ý kiến, cảm ơn manatwork và GypsyCosmonaut:

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

và không biết sự khác biệt giữa io-std và bình thường.

Tôi chưa thấy chữ nghiêng hay nhỏ trong vỏ.

Bạn có thể nhập chúng (nhờ vào thao tác quá) bằng Ctrl + v ESC trong Bash, nơi nó sẽ được hiển thị dưới dạng ^[. Đây có nghĩa là chuỗi ANSI cả sẽ trông giống như ^[[1m boldhay ^[[1mbold(để tránh sự trống trước 'đậm').

Nhiều biên tập viên có vấn đề với (char) 0x1b. Các lựa chọn thay thế: sao chép / dán nó từ một nơi nào đó hoặc sử dụng

echo -e "\x1b[1m bold"

trong bash, hoặc một trình soạn thảo hex.


1
Các ký tự thoát có thể được gõ: Ctrl + V, Esc. (Sẽ được hiển thị dưới dạng ^ ^ [. Điều này có nghĩa là toàn bộ chuỗi ANSI sẽ trông giống như ^ ^ [[1mbold Tấn.)
manatwork

1
Có nhiều thuộc tính để đề cập: \e[4mgạch chân, \e[5mnhấp nháy, \e[7mđảo ngược.
manatwork

@manatwork: thêm chúng.
người dùng không xác định

@userunknown Cảm ơn bạn đã giúp đỡ, mày mò mã của bạn, tôi thấy chữ nghiêng làecho -e "\x1b[3m italic"
GypsyCosmonaut 16/07/17

0

Đây:

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

(lưu ý: rất nhiều trong số chúng thường không hoạt động, nhưng hầu hết trong số chúng được đánh dấu như vậy.)

Tôi đang tạo một trò chơi trong thiết bị đầu cuối và đã phụ thuộc rất nhiều vào liên kết trên. Nó thậm chí còn cho bạn biết cách ẩn / bỏ ẩn con trỏ, tạo màu (30 giây), "đậm" (sáng hơn), tối hơn, gạch chân, in nghiêng, màu nền (40 giây thay vì 30 giây), v.v. Bạn cũng có thể thay đổi vị trí của con trỏ ( rất hữu ích - ví dụ: "\x1B[1A"di chuyển con trỏ lên một dòng, "\x1B[0;0H"di chuyển con trỏ đến hàng 0, col 0; "\x1B[2J"xóa màn hình, "\x1B[2K"xóa dòng.

Đối với mục đích của bạn như mọi người đã nói:

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"

Lưu ý: Bạn cần sự -etrong

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

hoặc bạn cần sử dụng dấu ngoặc đơn. Gõ man echođể xem tại sao (dấu ngoặc kép thường gây khó khăn khi in; khi tôi cần công cụ không mở rộng hoặc tôi cần trình tự thoát ANSI, tôi sử dụng dấu ngoặc đơn vì nó rất dễ - mặc dù tôi đã quen với nó từ việc đó rất nhiều lần - để quên -e trong trường hợp bạn nhận được " box with numbers and letters[35; 1m").

Mỗi khi bạn thấy CSIthay thế nó bằng "\x1b["(hoặc "\e["hoặc "\u1b["). "\x1b["Tôi nghĩ là tiêu chuẩn hơn, nhưng tôi không thực sự biết sự khác biệt giữa chúng là gì.


Nếu bạn thích làm lộn xộn chuỗi của mình với các ký tự phụ, đừng sử dụng \ e :-)
xóa sáng

@clearlight Tôi không chắc ý của bạn là gì. Tôi nghĩ bạn có thể muốn nói "sử dụng \ e". Tuy nhiên, \eít được hỗ trợ hơn \x1btôi đã tìm thấy. Điều tối ưu cần làm là esc=$'\e'hoặc esc=$'\x1b'(đây là trong bash) và sau đó sử dụng "${esc}[34;1m"(ví dụ: màu xanh sáng). Tôi có một ví dụ bán phức tạp ở đây ( github.com/dylnmc/ps1yh/blob/master/powerline.sh ) cho chuỗi nhắc bash thực sự;) Xin vui lòng tha thứ cho tên của repo - bạn có thể cảm ơn mọi người trong kênh # freenode archlinux-offtopic cho điều đó.
Dylan

Lý do để làm esc=$'\e'là điều này cho phép bash tạo ra nhân vật thoát ansi ngay tại chỗ, và bạn được hưởng lợi từ nó theo một số cách. Đôi khi, trên thực tế, (như được thể hiện trong liên kết github), bạn phải sử dụng phương pháp này để có được màu sắc hiển thị đúng. Đối với các phiên bản cũ hơn của bash cũng như sh sh, bạn nên (nhưng không cần) sử dụng phương pháp này để lấy màu để hiển thị ... với điều kiện là thiết bị đầu cuối sử dụng các chuỗi thoát mà hầu hết các thiết bị đầu cuối hiện đại làm.
Dylan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.