目录
- 工具简介
- 核心特性
- 核心用途与场景
- 常见报错与解决方案
- [适配开源鸿蒙 PC 端的要点](#适配开源鸿蒙 PC 端的要点)
- 鸿蒙适配中的报错解决过程
- 构建脚本详解
- [HNP 包配置](#HNP 包配置)
- 构建结果
- 仓库地址与安装方式
- 总结
- FAQ
- 相关链接
工具简介
figlet(Frank, Ian & Glenn's Letters)是一个用 C 语言开发的命令行工具,用于将普通文本转换为大型 ASCII 艺术字符。它可以将简单的文本转换为美观的大字符,非常适合用于终端横幅、邮件签名、文档装饰等场景。
什么是 figlet?
figlet 是一个文本艺术生成工具,它使用特殊的字体文件(.flf 格式)将普通文本转换为大型 ASCII 艺术字符。这些字符由普通的屏幕字符组成,可以创建出各种风格的文字效果。
示例输出:
_ _ _ _ _ _ _
| | | | ___| | | ___ __ _____ _ __| | __| | |
| |_| |/ _ \ | |/ _ \ \ \ /\ / / _ \| '__| |/ _` | |
| _ | __/ | | (_) | \ V V / (_) | | | | (_| |_|
|_| |_|\___|_|_|\___( ) \_/\_/ \___/|_| |_|\__,_(_)
|/
核心特性
-
多种字体风格:
- 内置多种字体风格(standard、slant、shadow、script 等)
- 支持自定义字体文件
- 字体文件格式简单,易于创建和修改
-
字符处理能力:
- Kern(字距调整):调整字符间距
- Smush(字符合并):将字符合并在一起
- 支持多种字符布局模式
-
多语言支持:
- 支持多种字符编码(UTF-8、ISO-8859 系列等)
- 支持非拉丁字符集(希伯来语、西里尔语、日语等)
- 支持从右到左的文字(如希伯来语)
-
灵活的配置:
- 可配置默认字体目录
- 可配置默认字体文件
- 支持命令行参数自定义
-
跨平台支持:
- 支持 Unix/Linux、macOS、Windows
- 单一可执行文件,依赖少
- 易于编译和部署
开发语言与设计优势
C 语言的优势:
- 性能:编译后的二进制文件运行速度快,资源占用低
- 可移植性:C 语言标准广泛支持,易于跨平台编译
- 轻量级:单一可执行文件,不需要额外的运行时库
- 简单直接:代码结构清晰,易于理解和维护
设计优势:
- 零依赖:除了标准 C 库外,不需要其他依赖
- 快速启动:启动速度快,适合频繁使用
- 资源占用低:内存和 CPU 占用小
- 易于集成:可以轻松集成到脚本和工具链中

核心用途与场景
基本用法
1. 基本文本转换
bash
# 转换文本为 ASCII 艺术
figlet "Hello World"
# 输出示例:
# _ _ _ _ _ _ _
# | | | | ___| | | ___ __ _____ _ __| | __| | |
# | |_| |/ _ \ | |/ _ \ \ \ /\ / / _ \| '__| |/ _` | |
# | _ | __/ | | (_) | \ V V / (_) | | | | (_| |_|
# |_| |_|\___|_|_|\___( ) \_/\_/ \___/|_| |_|\__,_(_)
# |/
2. 使用不同字体
bash
# 使用 slant 字体
figlet -f slant "Hello"
# 使用 shadow 字体
figlet -f shadow "Hello"
# 使用 script 字体
figlet -f script "Hello"
# 使用 block 字体
figlet -f block "Hello"
3. 文本对齐
bash
# 居中对齐
figlet -c "Centered Text"
# 左对齐(默认)
figlet -l "Left Aligned"
# 右对齐
figlet -r "Right Aligned"
4. 字符布局模式
bash
# 使用 kern 模式(字距调整)
figlet -k "Kerned Text"
# 使用 smush 模式(字符合并)
figlet -s "Smushed Text"
# 使用 full width 模式
figlet -w 80 "Full Width"
5. 从文件读取
bash
# 从文件读取文本
figlet < input.txt
# 管道输入
echo "Hello World" | figlet
# 多行文本
cat multiline.txt | figlet -p
实际应用场景
场景 1:终端横幅
bash
# 创建登录横幅
figlet -f big "Welcome" > /etc/motd
# 创建脚本标题
#!/bin/bash
figlet -f standard "My Script"
echo "Starting script..."
场景 2:文档装饰
bash
# 生成文档标题
figlet -f shadow "Chapter 1" > chapter1_title.txt
# 创建 README 标题
figlet -f standard "My Project" >> README.md
场景 3:邮件签名
bash
# 创建邮件签名
figlet -f script "Best Regards" > signature.txt
# 添加到邮件
cat signature.txt | mail -s "Subject" recipient@example.com
场景 4:脚本输出美化
bash
#!/bin/bash
# 显示脚本标题
figlet -f slant "Backup Script"
echo "Starting backup..."
# 显示进度
figlet -f small "Progress: 50%"
场景 5:配合其他工具
bash
# 配合 fortune
fortune | figlet
# 配合 date
date | figlet -f digital
# 配合系统信息
hostname | figlet -f big
高级用法
1. 自定义字体目录
bash
# 使用自定义字体目录
figlet -d /path/to/fonts -f custom_font "Text"
# 设置环境变量
export FIGLET_FONT_DIR=/path/to/fonts
figlet -f custom_font "Text"
2. 输出到文件
bash
# 保存输出到文件
figlet "Hello" > output.txt
# 追加到文件
figlet "World" >> output.txt
# 格式化输出
figlet -c -f shadow "Title" | tee title.txt
3. 批量处理
bash
# 处理多个文本
for word in "Hello" "World" "Figlet"; do
figlet -f slant "$word"
done
# 处理文件中的每一行
while IFS= read -r line; do
figlet "$line"
done < input.txt
常见报错与解决方案
问题 1:安装失败
错误信息:
make: *** No rule to make target `install'. Stop.
原因:Makefile 未正确配置或缺少必要的变量。
解决方案:
bash
# 检查 Makefile 是否存在
ls -la Makefile
# 查看 Makefile 配置
grep -E "prefix|BINDIR|MANDIR|DEFAULTFONTDIR" Makefile
# 手动设置变量并安装
make install DESTDIR=/path/to/install prefix=/usr
问题 2:字体文件未找到
错误信息:
figlet: can't open font file /usr/local/share/figlet/standard.flf
原因:字体文件未安装或路径配置错误。
解决方案:
bash
# 检查字体文件是否存在
ls -la /usr/local/share/figlet/
# 使用 -d 选项指定字体目录
figlet -d /path/to/fonts "Text"
# 或者设置环境变量
export FIGLET_FONT_DIR=/path/to/fonts
figlet "Text"
# 重新安装字体文件
make install DESTDIR=/path/to/install prefix=/usr
问题 3:权限错误
错误信息:
mkdir: /usr/local/man: Permission denied
原因:尝试安装到系统目录,需要 root 权限。
解决方案:
bash
# 使用 DESTDIR 安装到指定目录
make install DESTDIR=/path/to/install prefix=/usr
# 或者使用 sudo(不推荐用于交叉编译)
sudo make install
# 或者修改 Makefile 中的 prefix
make install prefix=/home/user/local
问题 4:编译错误
错误信息:
figlet.c:1234:5: error: expected ';' before '}'
原因:源代码语法错误或编译器版本不兼容。
解决方案:
bash
# 检查编译器版本
gcc --version
# 使用兼容的编译器选项
make CC=gcc CFLAGS="-g -O2 -Wall"
# 清理并重新编译
make clean
make
问题 5:字符显示异常
错误信息:终端中显示的字符乱码或格式不正确。
原因:终端编码设置不正确或字体文件损坏。
解决方案:
bash
# 检查终端编码
echo $LANG
# 设置 UTF-8 编码
export LANG=en_US.UTF-8
# 使用 UTF-8 字体
figlet -f utf8 "Text"
# 检查字体文件
chkfont /path/to/font.flf
问题 6:字体文件格式错误
错误信息:
figlet: error reading font file
原因:字体文件格式不正确或损坏。
解决方案:
bash
# 使用 chkfont 检查字体文件
chkfont font.flf
# 重新下载字体文件
# 或使用标准字体
figlet -f standard "Text"
适配开源鸿蒙 PC 端的要点
系统环境差异
1. 包管理器
HarmonyOS PC 使用 HNP(HarmonyOS Native Package)作为包管理格式,而不是传统的 apt、yum 或 brew。
影响:
- 需要创建 HNP 包配置文件(
hnp.json) - 安装路径遵循 HNP 规范
- 包管理命令不同
2. 依赖库
figlet 使用标准 C 库,HarmonyOS 使用 musl libc:
- 链接方式:可以使用静态链接或 musl 兼容的动态链接
- 系统调用:标准 C 库函数应该兼容
- 库依赖:figlet 不依赖外部库,只需要标准 C 库
3. 字体文件路径
HarmonyOS 的文件系统结构可能与标准 Linux 不同:
- 字体目录 :需要正确设置
DEFAULTFONTDIR - 路径格式:确保路径格式正确
- 权限:确保字体文件可读
Makefile 构建系统适配
1. 编译器配置
需要配置 Makefile 使用 HarmonyOS SDK 的编译器:
bash
make CC="${CC}" CFLAGS="${CFLAGS}" LD="${CC}" LDFLAGS="${LDFLAGS}"
关键变量:
CC: C 编译器(HarmonyOS SDK 的 clang)CFLAGS: 编译标志(包含交叉编译选项)LD: 链接器(通常与 CC 相同)LDFLAGS: 链接标志
2. 安装路径配置
使用 DESTDIR 和 prefix 控制安装路径:
bash
export DESTDIR=${TREE_INSTALL_HNP_PATH}
export prefix=/usr
make install
路径结构:
- 二进制文件:
${DESTDIR}${prefix}/bin - 手册页:
${DESTDIR}${prefix}/share/man/man6 - 字体文件:
${DESTDIR}${prefix}/share/figlet
3. 字体目录配置
Makefile 在编译时会硬编码 DEFAULTFONTDIR:
makefile
DEFAULTFONTDIR = $(prefix)/share/figlet
这会在编译时嵌入到二进制文件中,所以需要确保:
- 编译时
prefix设置为/usr - 安装时字体文件放在正确的位置
关键适配要点总结
- 编译器配置:使用 HarmonyOS SDK 的编译器
- 安装路径 :使用
DESTDIR和prefix控制 - 字体路径:确保字体文件安装在正确位置
- 包格式:使用 HNP 格式打包
- 路径规范:遵循 HNP 规范
鸿蒙适配中的报错解决过程
报错 1:构建系统识别错误
错误信息:
make: *** No rule to make target `clean'. Stop.
make: *** No targets specified and no makefile found. Stop.
原因分析 :
原始的构建脚本可能没有正确设置工作目录或 Makefile 不存在。
解决过程:
-
检查 Makefile:
bashls -la Makefile # 确认 Makefile 存在 -
检查构建脚本:
- 确保在正确的目录下运行
- 确保设置了正确的环境变量
-
修改构建脚本:
- 添加清理步骤的错误处理
- 确保在构建前清理旧文件
最终解决方案:
bash
# 清理之前的构建
make clean 2>/dev/null || true
# 构建
make CC="${CC}" CFLAGS="${CFLAGS}" LD="${CC}" LDFLAGS="${LDFLAGS}"
报错 2:安装路径权限错误
错误信息:
mkdir: /usr/local/man: Permission denied
make: *** [install] Error 1
原因分析 :
make install 尝试安装到系统目录 /usr/local/man,需要 root 权限。在交叉编译时,不应该安装到系统目录。
排查思路:
-
检查 Makefile 的 install 目标:
bashgrep -A 10 "^install:" Makefile # 发现使用了 DESTDIR 和 prefix -
检查环境变量:
bashecho $DESTDIR echo $prefix # 发现未设置或设置不正确 -
查看 Makefile 变量定义:
makefileprefix = /usr/local BINDIR = $(prefix)/bin MANDIR = $(prefix)/man
解决方案:
设置 DESTDIR 和 prefix 环境变量:
bash
# 设置安装路径变量
export DESTDIR=${TREE_INSTALL_HNP_PATH}
export prefix=/usr
# 使用 DESTDIR 安装
make install
工作原理:
DESTDIR是安装的根目录prefix是相对于DESTDIR的路径- 最终安装路径 =
${DESTDIR}${prefix}=${TREE_INSTALL_HNP_PATH}/usr - Makefile 会创建
${DESTDIR}${prefix}/bin、${DESTDIR}${prefix}/share/man/man6等目录
报错 3:安装目录不存在
错误信息:
cp: directory /Users/jianguo/HarmonyOSPC/build/data/service/hnp//figlet.org/figlet_2.2.5 does not exist
Error: Failed to copy hnp.json
原因分析 :
安装目录不存在,make install 可能失败或目录未创建。
解决方案:
bash
# 创建安装目录
mkdir -p ${TREE_INSTALL_HNP_PATH}/usr/bin
mkdir -p ${TREE_INSTALL_HNP_PATH}/usr/share/man/man6
mkdir -p ${TREE_INSTALL_HNP_PATH}/usr/share/figlet
报错 4:编译器警告
错误信息:
warning: a function definition without a prototype is deprecated in all versions of C
原因分析 :
figlet 使用旧的 C 函数定义风格(K&R 风格),现代编译器会发出警告。
解决方案:
这些警告不影响编译,但可以通过以下方式处理:
bash
# 在 CFLAGS 中添加选项忽略警告
CFLAGS="${CFLAGS} -Wno-deprecated-non-prototype"
# 或者保持原样(警告不影响功能)
适配过程中的关键决策
- 使用 DESTDIR 和 prefix:解决安装路径问题
- 提前创建目录:确保安装目录存在
- 传递编译器参数:确保使用正确的工具链
- 错误处理完善:添加详细的错误检查和提示
构建脚本详解
build_ohos.sh 完整代码
bash
export TREE_INSTALL_HNP_PATH=${HNP_PUBLIC_PATH}/figlet.org/figlet_2.2.5
# 创建安装目录
mkdir -p ${TREE_INSTALL_HNP_PATH}/usr/bin
mkdir -p ${TREE_INSTALL_HNP_PATH}/usr/share/man/man6
mkdir -p ${TREE_INSTALL_HNP_PATH}/usr/share/figlet
# 清理之前的构建
echo "Cleaning previous build..."
make clean 2>/dev/null || true
# 构建
echo "Building figlet..."
make CC="${CC}" CFLAGS="${CFLAGS}" LD="${CC}" LDFLAGS="${LDFLAGS}" VERBOSE=1 || {
echo "Error: Build failed"
exit 1
}
# 安装
echo "Installing figlet..."
# 设置安装路径变量
export DESTDIR=${TREE_INSTALL_HNP_PATH}
export prefix=/usr
# 使用 DESTDIR 安装,这样会安装到 ${DESTDIR}${prefix} = ${TREE_INSTALL_HNP_PATH}/usr
make install || {
echo "Error: Install failed"
exit 1
}
# 复制 hnp.json
cp hnp.json ${TREE_INSTALL_HNP_PATH}/ || {
echo "Error: Failed to copy hnp.json"
exit 1
}
# 打包
echo "Packaging..."
pushd ${TREE_INSTALL_HNP_PATH}/../
${HNP_TOOL} pack -i ${TREE_INSTALL_HNP_PATH} -o ${ARCHIVE_PATH}/ || {
echo "Error: HNP pack failed"
popd
exit 1
}
tar -zvcf ${ARCHIVE_PATH}/ohos_figlet_2.2.5.tar.gz figlet_2.2.5/ || {
echo "Error: Tar packaging failed"
popd
exit 1
}
popd
# 打印构建结果
echo ""
echo "=========================================="
echo "Build completed successfully!"
echo "=========================================="
echo "HNP Package: ${ARCHIVE_PATH}/figlet.org_figlet_2.2.5.hnp"
echo "Tar Archive: ${ARCHIVE_PATH}/ohos_figlet_2.2.5.tar.gz"
echo "Installation Path: ${TREE_INSTALL_HNP_PATH}"
echo "=========================================="
echo ""
脚本关键点解析
1. 安装目录创建
作用:确保安装目录存在,避免安装失败。
实现:
bash
mkdir -p ${TREE_INSTALL_HNP_PATH}/usr/bin
mkdir -p ${TREE_INSTALL_HNP_PATH}/usr/share/man/man6
mkdir -p ${TREE_INSTALL_HNP_PATH}/usr/share/figlet
2. 编译器配置
作用:使用 HarmonyOS SDK 的编译器进行交叉编译。
实现:
bash
make CC="${CC}" CFLAGS="${CFLAGS}" LD="${CC}" LDFLAGS="${LDFLAGS}"
3. 安装路径控制
作用 :使用 DESTDIR 和 prefix 控制安装路径。
实现:
bash
export DESTDIR=${TREE_INSTALL_HNP_PATH}
export prefix=/usr
make install
路径映射:
BINDIR = $(prefix)/bin→${DESTDIR}/usr/binMANDIR = $(prefix)/man→${DESTDIR}/usr/share/manDEFAULTFONTDIR = $(prefix)/share/figlet→${DESTDIR}/usr/share/figlet
HNP 包配置
hnp.json
json
{
"type": "hnp-config",
"name": "figlet",
"version": "2.2.5",
"install": {}
}
安装目录结构
figlet_2.2.5/
├── usr/
│ ├── bin/
│ │ ├── figlet # 主程序
│ │ ├── chkfont # 字体检查工具
│ │ ├── figlist # 字体列表脚本
│ │ └── showfigfonts # 字体预览脚本
│ ├── share/
│ │ ├── man/
│ │ │ └── man6/
│ │ │ ├── figlet.6 # 主程序手册
│ │ │ ├── chkfont.6 # chkfont 手册
│ │ │ ├── figlist.6 # figlist 手册
│ │ │ └── showfigfonts.6 # showfigfonts 手册
│ │ └── figlet/
│ │ ├── *.flf # 字体文件
│ │ └── *.flc # 控制文件
└── hnp.json # HNP 包配置
构建结果
构建成功后,会生成以下文件:
-
HNP 包 :
figlet.org_figlet_2.2.5.hnp- HarmonyOS 原生包格式
- 可以直接安装到 HarmonyOS 设备
-
Tar 归档 :
ohos_figlet_2.2.5.tar.gz- 压缩的 tar 归档
- 包含完整的安装目录结构
构建输出示例
==========================================
Build completed successfully!
==========================================
HNP Package: /path/to/archive/figlet.org_figlet_2.2.5.hnp
Tar Archive: /path/to/archive/ohos_figlet_2.2.5.tar.gz
Installation Path: /path/to/data/service/hnp/figlet.org/figlet_2.2.5
==========================================
仓库地址与安装方式
仓库地址
HarmonyOS 适配版本:
- 仓库:https://gitcode.com/nutpi/figlet
- Tag :
2.2.5_ohos - 原始项目:http://www.figlet.org/
安装方式
Linux(通用)
使用包管理器:
bash
# Debian/Ubuntu
sudo apt install figlet
# Fedora
sudo dnf install figlet
# Arch Linux
sudo pacman -S figlet
# Alpine Linux
apk add figlet
从源码编译:
bash
# 1. 下载源码
wget http://www.figlet.org/pub/figlet/program/unix/figlet-2.2.5.tar.gz
tar -xzf figlet-2.2.5.tar.gz
cd figlet-2.2.5
# 2. 编辑 Makefile(可选)
# 设置 DEFAULTFONTDIR 和 DEFAULTFONTFILE
# 3. 编译
make
# 4. 安装
sudo make install
macOS
使用 Homebrew:
bash
brew install figlet
使用 MacPorts:
bash
sudo port install figlet
从源码编译:
bash
# 与 Linux 相同
make
sudo make install
Windows
使用包管理器:
bash
# Chocolatey
choco install figlet
# Scoop
scoop install figlet
从源码编译:
bash
# 需要 MinGW 或 Visual Studio
# 参考 Makefile.tc(Turbo C 版本)
开源鸿蒙 PC
使用 HNP 包:
bash
# 安装 HNP 包
hnp install figlet.org_figlet_2.2.5.hnp
# 或使用 tar 归档
tar -xzf ohos_figlet_2.2.5.tar.gz
# 手动复制到系统路径
从源码交叉编译:
bash
# 1. 克隆仓库
git clone https://gitcode.com/nutpi/figlet.git
cd figlet
git checkout 2.2.5_ohos
# 2. 设置 HarmonyOS SDK 路径
export OHOS_SDK=/path/to/ohosdk
# 3. 运行构建脚本
./build_ohos.sh
# 4. 安装生成的 HNP 包
hnp install figlet.org_figlet_2.2.5.hnp
验证安装
bash
# 检查版本
figlet -v
# 测试基本功能
figlet "Hello"
# 列出可用字体
figlist
# 查看字体示例
showfigfonts
总结
适配要点
- 构建系统:使用 Makefile,需要正确配置编译器
- 安装路径 :使用
DESTDIR和prefix控制 - 字体路径:确保字体文件安装在正确位置
- 目录创建:提前创建安装目录
- 包格式:遵循 HNP 规范
关键决策
- DESTDIR 和 prefix:解决安装路径问题
- 提前创建目录:避免安装失败
- 编译器参数传递:确保使用正确的工具链
优势
- 零运行时依赖:单一可执行文件,部署简单
- 高性能:C 语言编写,运行速度快
- 功能强大:支持多种字体和字符布局模式
- 易于集成:可以轻松集成到脚本和工具链中
适用场景
- 终端横幅和装饰
- 文档标题生成
- 邮件签名创建
- 脚本输出美化
- ASCII 艺术创作
FAQ
Q1: figlet 和 toilet 有什么区别?
A: figlet 和 toilet 都是 ASCII 艺术生成工具,主要区别:
- figlet 更轻量,功能更基础
- toilet 支持更多字体格式(包括 TLF)
- figlet 使用
.flf字体格式 - toilet 使用
.tlf字体格式 - figlet 是更老的工具,兼容性更好
Q2: 如何创建自定义字体?
A:
- 参考
figfont.txt了解字体格式 - 使用文本编辑器创建
.flf文件 - 使用
chkfont检查字体文件 - 将字体文件放在字体目录中
Q3: 字体文件应该放在哪里?
A:
- 默认位置:
/usr/local/share/figlet/或/usr/share/figlet/ - 自定义位置:使用
-d选项指定 - 环境变量:设置
FIGLET_FONT_DIR
Q4: 如何在 HarmonyOS 上使用 figlet?
A:
- 安装 HNP 包:
hnp install figlet.org_figlet_2.2.5.hnp - 或从源码交叉编译
- 使用方式与 Linux 相同
Q5: 为什么需要设置 DESTDIR 和 prefix?
A:
DESTDIR用于指定安装根目录(用于打包)prefix用于指定相对于 DESTDIR 的路径- 这样可以安装到构建目录而不是系统目录
Q6: 如何改变默认字体?
A:
bash
# 使用 -f 选项
figlet -f slant "Text"
# 或修改 Makefile 中的 DEFAULTFONTFILE
# 然后重新编译
Q7: 可以处理多行文本吗?
A: 可以:
bash
# 使用 -p 选项(段落模式)
figlet -p < multiline.txt
# 或逐行处理
while IFS= read -r line; do
figlet "$line"
done < input.txt
Q8: 如何输出到文件?
A:
bash
# 重定向输出
figlet "Text" > output.txt
# 追加到文件
figlet "Text" >> output.txt
# 使用 tee 同时显示和保存
figlet "Text" | tee output.txt
相关链接
- figlet 官方网站:http://www.figlet.org/
- figlet 邮件列表:http://www.figlet.org/mailman/listinfo/figlet
- HarmonyOS 适配仓库:https://gitcode.com/nutpi/figlet
- HarmonyOS 开发者文档:https://developer.harmonyos.com/
- PC代码仓
- PC社区