是否可以在 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".
这样它就打印出:“这是字体:正常,斜体,大胆的,小“在一行文本内。
答案1
在大多数(如果不是全部)终端模拟器上,您无法设置不同的字体大小或不同的字体,只能设置颜色和一些属性(粗体、下划线、突出)。
在 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
或者可以将其作为迅速扩张,也用print -P
,或%
参数扩展标志:
print -P '%F{red}%Bbold%b red%f %Uunderline%u'
答案2
您可以将这些颜色定义包含在脚本或源文件中。可能看起来像这样。
#!/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 提示符,它是颜色代码的一个很好的参考,并生成一些关于您可以做什么的想法。
答案3
似乎布局无法处理[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 和普通之间的区别。
我在shell中没见过斜体或小号。
Ctrl 您可以在 Bash 中通过+输入它们(也感谢 manatwork) v ESC ,它将显示为^[
。这意味着整个 ANSI 序列将看起来像^[[1m bold
or ^[[1mbold
(以避免“粗体”之前的空白)。
许多编辑器对 (char)0x1b 存在疑问。替代方案:从某处复制/粘贴它,或使用
echo -e "\x1b[1m bold"
在 bash 或十六进制编辑器中。
或者,更简单:
echo -e "\e[1m bold"
这\e
是 ascii 代码 27、bash 内部命令 echo 以及外部程序 GNU-echo 的转义序列。
答案4
这里:
http://en.wikipedia.org/wiki/ANSI_escape_code
(注意:其中很多通常不起作用,但大多数都这样标记。)
我正在终端中制作游戏,并且一直严重依赖上面的链接。它甚至告诉您如何隐藏/取消隐藏光标、设置颜色(30's)、“粗体”(更亮)、更暗、下划线、斜体、背景颜色(40's 而不是 30's)等。您还可以更改光标的位置(这非常有帮助 - 例如,"\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
:
回声-e"\x1b[35;1m 浅紫色\x1b[m"
或者您需要使用单引号。键入man echo
以查看原因(双引号在打印时通常很痛苦;当我需要不扩展的内容或需要 ANSI 转义序列时,我使用单引号,因为它很容易 - 尽管我已经习惯了这样做很多次- 忘记-e
在这种情况下你会得到“ box with numbers and letters
[35;1m”)。
每次看到时CSI
将其替换为"\x1b["
(或"\e["
或"\u1b["
)。"\x1b["
我认为更标准,但我真的不知道它们之间有什么区别。