在echo命令中更改字体


16

是否可以在zsh或bash中更改echo输出的字体属性?

我想要的是类似于:

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

以便在一行文本中显示 “这是字体:normal,italic粗体small ”。


这与所涉及的终端仿真器有关,而不是与所使用的外壳有关。 我认为这个问题线程包含一些有价值的指针
sr_

通常,您不能更改字体大小。通常,您唯一能做的就是更改颜色,有时更改粗体/带下划线的属性。为此,可以使用ANSI转义序列。有关某些示例,请参见例如bashguru.com/2010/01/shell-colors-colorizing-shell-scripts.html
jofel 2012年

Answers:


15

在大多数(如果不是全部)终端仿真器上,您不能设置不同的字体大小或字体,只能设置颜色和一些属性(粗体,带下划线,突出)。

在bash(或zsh或任何其他shell)中,您可以直接使用终端转义序列(除了一些奇异的转义序列,如今所有终端都遵循xterm的指导)。CSIESC [$'\e['bash 编写的。更改属性的转义序列为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提示,但它是颜色代码的不错参考,并提供了一些有关您可以做什么的想法。


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和normal之间的区别。

我还没有看到壳中的斜体或小号。

您可以通过Bash中的 Ctrl + 输入(也要感谢操作), v ESC 显示为^[。这意味着整个ANSI序列将看起来像^[[1m bold^[[1mbold(以避免在“ bold”之前出现空格)。

许多编辑器的(char)0x1b都有问题。替代方法:从某个地方复制/粘贴它,或使用

echo -e "\x1b[1m bold"

在bash或十六进制编辑器中。


1
可以输入转义字符:Ctrl + V,Esc。(将显示为“ ^ [”。这意味着整个ANSI序列将看起来像“ ^ [[1mbold”。)
manatwork 2012年

1
还有更多需要提及的属性:\e[4m带下划线,\e[5m闪烁,\e[7m倒置。
manatwork 2012年

@manatwork:添加了它们。
用户未知

@userunknown感谢您的帮助,修改了代码,我发现斜体是echo -e "\x1b[3m italic"
GypsyCosmonaut

0

这里:

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

(注意:它们中的许多通常不起作用,但其中大多数都带有标记。)

我正在终端中制作游戏,并且一直严重依赖上面的链接。它甚至还告诉您如何隐藏/取消隐藏光标,设置颜色(30年代),“加粗”(较浅),较暗,加下划线,斜体,背景色(从40变为30),等等。您还可以更改光标的位置(这非常有帮助-例如,"\x1B[1A"将光标向上"\x1B[0;0H"移动一行;将光标移动到第0行,第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

@clearlight我不确定您的意思。我认为您可能想说“使用\ e”。但是,\e它的支持比\x1b我发现的要少。最佳的做法是要么要么esc=$'\e'esc=$'\x1b'(这在bash中),然后再使用"${esc}[34;1m"(例如亮蓝色)。我在这里有一个半复杂的示例(github.com/dylnmc/ps1porn/blob/master/powerline.sh)中的真实bash提示字符串;)请原谅存储库的名称-您可以感谢freenode频道的人们#为此,请使用archlinux-offtopic。
迪伦

这样做的原因esc=$'\e'是,这允许bash在现场创建ansi-escape字符,您可以通过两种方式从中受益。实际上,有时(如github链接中所示),您必须使用此方法才能使颜色正确显示。对于较旧版本的bash以及sh shell,您应该(但不必)使用此方法来显示颜色...前提是该终端使用大多数现代终端所做的转义序列。
Dylan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.