是否可以在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 ”。
是否可以在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 ”。
Answers:
在大多数(如果不是全部)终端仿真器上,您不能设置不同的字体大小或字体,只能设置颜色和一些属性(粗体,带下划线,突出)。
在bash(或zsh或任何其他shell)中,您可以直接使用终端转义序列(除了一些奇异的转义序列,如今所有终端都遵循xterm的指导)。CSI
是ESC [
用$'\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
您可以在脚本或源文件中包括这些颜色定义。可能看起来像这样。
#!/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提示,但它是颜色代码的不错参考,并提供了一些有关您可以做什么的想法。
似乎布局无法处理 [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或十六进制编辑器中。
\e[4m
带下划线,\e[5m
闪烁,\e[7m
倒置。
echo -e "\x1b[3m italic"
这里:
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
它的支持比\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,您应该(但不必)使用此方法来显示颜色...前提是该终端使用大多数现代终端所做的转义序列。