# 程序员编程杂谈

* 原文链接：[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** 播客的主持人之一。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://book.bsdcn.org/qi-kan/20210910-freebsd-kai-fa/programmers.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
