# 程序员编程杂谈

* 原文链接：[Programmers Programming Potpourri](https://freebsdfoundation.org/wp-content/uploads/2021/11/Programmers_Programming_Potpourri.pdf)
* 作者：**BENEDICT REUSCHLING**

***

本专栏介绍了一些对 FreeBSD 有用、独特或值得了解的 ports 和软件包。Ports 扩展了基本操作系统的功能，可以帮助你完成任务，甚至让你会心一笑。一起探索吧，也许你会发现一些新奇的东西。

***

Unix 的一个优势是，尽管它涉及大量的输入，但多年来已经发展出许多辅助工具。人们创造了各种巧妙的快捷方式，以避免重复输入相同的命令。其中一个发明就是 shell 历史记录。为什么要重新输入一条命令，而不是从之前成功输入的记录中检索出来呢？对于新手来说，学会正确的按键组合来搜索 shell 历史记录，可能会让他们惊讶得目瞪口呆，仿佛刚刚解锁了魔法。然而，一旦熟悉了这项技能，他们可能就不会那么惊讶了。这时，正是安装 `misc/mcfly` 的好时候，让你像电影中的 Marty 一样，在 shell 历史记录中自由穿梭。智能搜索会考虑你当前的目录或你之前使用该程序的上下文，并向你提供合适的命令。同时，它不会修改你的普通 shell 历史文件，因此你可以放心地尝试和适应 mcfly。

程序员在编写代码时喜欢听音乐，而自 Winamp 时代以来，音频波形的可视化一直颇受欢迎。如果你想在终端中实现类似效果，可以试试 `audio/cava`。无论你使用的是 Pulseaudio、fifo（mpd）、sndio、squeezelite 还是 portaudio，都能看到随着音乐节奏跳动的条形图。很酷吧？不过别忘了戴上耳机，否则邻居可能会不太高兴。毕竟，没有人喜欢被迫“偷听”你的播放列表！

程序员不仅要编写代码，还需要对其进行测试。即使在今天，硬件的计算能力已远超阿波罗导航计算机的想象，但性能仍然是用户体验的关键。为了确保代码更改不会导致运行速度下降，通常会使用基准测试工具。其中一个适用于命令行的基准测试工具是 `benchmarks/hyperfine`。它支持对任意 shell 命令进行多次执行的统计分析，并提供预热阶段，以确保缓存不会干扰测量结果。此外，它还能检测由后台运行的其他程序导致的异常值，并支持以不同数量的线程运行测试。最终结果可以导出为 CSV、JSON、Markdown 和 AsciiDoc 格式。如今，写论文基本上都能自动生成了……

你是否曾需要安全地将文件或字符串（如密码）传输到另一台计算机？如果觉得 SSH 复杂到难以应付——毕竟其 740 字符的公钥交换方式确实让人头疼——但又不想在安全性上妥协，那就使用 `net/py-magic-wormhole` 吧！在发送文件时，该工具会生成一个简短且易于人类发音的字符字符串。只需在接收端输入这个一次性密钥，`magic-wormhole` 就会通过 Rendezvous 消息交换和基于 PAKE 的安全机制完成“魔法”传输。它甚至支持密钥的 Tab 补全，帮你节省输入时间。此外，`magic-wormhole` 还可以用作 `ssh-copy-id` 的替代方案，简化初始 SSH 密钥交换过程。在下面的示例中，我将 `backup.zip` 传输到另一台机器。接收端输入代码并确认文件后，几秒钟之内，文件便完成了传输——就像穿越 30,000 光年的三角象限一样神奇！

![](https://github.com/user-attachments/assets/2b97349e-5bd4-4426-95e0-fb7dbb83cefa)

![](https://github.com/user-attachments/assets/d1b22eee-d644-42ed-9020-7d6c613426ae)

我经常让本科计算机科学专业的学生练习在 Unix 中解析文本文件。在这些作业中，逗号分隔值 (CSV) 仍然是一种常见的文件格式。这通常发生在学生学习数据库和 SQL 之前。如果他们提前了解 SQL，那很可能会直接使用我接下来介绍的工具，并且再也不会回头看其他方法：`textproc/csvq`。你可以随心所欲地读取、更新和删除 CSV 文件。这个工具不仅提供了交互式 shell 和命令行模式，还支持顺序执行多个操作，并通过托管事务进行管理。此外，它还支持变量、游标，甚至临时表。哦，对了，除了 CSV，它还完全支持 UTF-8 和 UTF-16 编码的 JSON，因为——为什么不呢？

另一个实用工具是 `textproc/dasel`（Data Selector），它不仅支持 CSV，还能处理 JSON、YAML、TOML 和 XML。它可以在这些格式之间进行转换，还能添加新内容或删除已有条目。这样，每当遇到新数据格式时，你不必重新学习一款新工具——大概率 `dasel` 已经支持了。

开发者通常拥有许多设备，无论是在工作还是家里。他们希望在每台设备上都能保持熟悉的配置环境，以便随时保持高效。而 `sysutils/chezmoi` 能解决这个问题，它可以安全地在多台设备间同步 dotfiles（存储各种配置的隐藏文件）。在新机器上，只需一个命令就能拉取所有配置文件。如果你在一台机器上修改了设置，只要运行 `chezmoi update`，另一台机器上的配置也会自动更新。

`chezmoi` 提供了快速入门指南和详细文档，能让你迅速上手。

如果你喜欢带有语法高亮和行号的输出，并且一直在疑惑为什么 `cat(1)` 从未添加这些功能，那么可以尝试 `textproc/bat`。这是一款“长了翅膀的 cat”，它不仅可以显示不可打印字符，还支持自动分页，并集成了 Git。

有些开发者喜欢炫耀自己写了多少代码。但其中有多少是注释和空行呢？如果你想知道，`devel/tokei` 可以给你答案。Tokei 能识别多行注释和嵌套注释，并且会忽略字符串内的注释。它支持 150 多种编程语言，提供彩色输出，并且即使面对大型项目也能运行得非常快。

当我很久没用某个工具时，往往会忘记它的命令行参数。然后不得不查阅 man 页面，重新拼凑命令行（特别是有多个参数时）。其实，我应该早点写个速查表来节省时间。这可能也是 `misc/cheat` 的开发者的想法。如果你想知道 `tar` 的用法，只需运行：

```sh
$ cheat tar
# 提取未压缩的归档文件：
tar -xvf '/path/to/foo.tar'
# 提取 .gz 压缩的归档文件：
tar -xzvf '/path/to/foo.tgz'
# 创建 .gz 压缩归档文件：
tar -czvf '/path/to/foo.tgz' '/path/to/foo/'
# 提取 .bz2 压缩的归档文件：
tar -xjvf '/path/to/foo.tgz'
# 创建 .bz2 压缩归档文件：
tar -cjvf '/path/to/foo.tgz' '/path/to/foo/'
```

你可以在 `cheat` 的 GitHub 项目页面找到更多类似的示例。

非常实用，有时候我甚至能从中发现一些新的技巧。试试看，比如用在 `rsync` 命令上。运行：

```sh
cheat -l
```

列出所有可用的速查表。当然，你也可以添加自己的速查表，并分享给社区。这样大家还是会把你当成 Unix 大师，甚至可能比以前更崇拜你。

如果你以为 `bat` 是本文唯一提到的、以动物命名的软件包，那你要准备迎接两个新成员了：`dns/dog` 和 `dns/doggo`。后者受到前者的启发，但由于作者不懂 Rust（`dog` 是用 Rust 写的），所以他用 Go 重新实现了它（dog + go，你懂的）。这两个工具都是现代化的命令行 DNS 客户端（类似 `dig`），支持 DNS over HTTPS（DoH）、DNS over TLS（DoT）、DNS over TCP/UDP 和 DNSCrypt 等协议。`dns/dog` 和 `dns/doggo` 都支持 JSON 输出，并且至少有一个可以同时查询多个解析器。我就不告诉你是哪一个了，这样你可以自己去试试看，还能欣赏它们的彩色输出。想想过去的黑白终端，真是太单调了。不过，`LSCOLORS` 让事情变慢了一些，但那又是另一个故事了。

既然提到了颜色，如果你对颜色特别着迷，为什么不在你的 Unix 工作流里加点 `sysutils/lsd` 呢？这个美化版的 `ls` 命令不仅支持彩色输出，还带有图标，而且是用 Rust 编写的（现在还有什么不是 Rust 写的吗？）。它确实……很“多彩”。如果用 `lsd` 让你头疼或眼花，那可别怪我。

回到本期 FreeBSD 期刊的主题，但依然离不开颜色：你是否曾看着 `git diff` 的输出，觉得它可以更美观一些？别再想了，`devel/git-delta` 可以拯救你（即使你没觉得需要）。`delta` 让你可以花上好几个小时调整 diff 的布局和样式，只为了找到最合适的配色方案。它内置分页器，并且提供各种主题，这样你不需要从零开始。它还能显示行号，支持并排视图，并用自定义框线美化 diff 输出。很可能，你会因为这个工具花更多时间审查代码。看看他们是怎么“套路”你的？

当你的磁盘里堆满了代码片段、补丁和未提交的文件时，是时候运行 `sysutils/duff` 了。不，不是《辛普森一家》里的那款虚构啤酒，而是一个重复文件查找工具。它自称是更美观的 `du`，但美不美你说了算。它的确运行得很快，并且能帮你快速找出磁盘空间被哪些文件占用了。我敢肯定，`duff` 的分类功能（比如按本地、网络和特殊设备分组）能让系统管理员一眼就获取有价值的信息。最好还是先运行：

```sh
git gc
```

清理一下吧！

偶尔运行一次，以清理不再需要的临时文件。

最后，你可以在半夜把我叫醒，我依然能一字不差地告诉你 `find` 命令的语法来搜索文件或目录。不过，我可能会花点时间拼出这条命令：

```sh
find / -name “*foo*”
```

而且，我肯定会因为被吵醒而闷闷不乐。我很珍惜我的美容觉，所以还是告诉你一个更简单的方法吧：`sysutils/fd`。这个工具简单到只需要运行：

```sh
fd foo
```

就能列出结果。是不是更容易？这样我也能多睡一会儿。晚安！

***

**BENEDICT REUSCHLING** 是 FreeBSD 项目的文档贡献者，同时也是文档工程团队的成员。他担任 FreeBSD 基金会董事会副主席，并曾在 FreeBSD 核心团队任职两届。他在德国达姆施塔特应用科技大学管理一个大数据集群，并教授本科课程 **“Unix for Developers”**（面向开发者的 Unix）。此外，他还是 **bsdnow\.tv** 播客的主持人之一。
