终端程序的隐形规则:20年经验总结
本文总结了作者20年来使用终端程序的经验,归纳出一些并非官方标准但普遍适用的“规则”。这些规则涵盖了程序对Ctrl-C、Ctrl-D、q键的响应,颜色使用,readline键绑定支持,以及管道输出等方面。作者指出,虽然这些规则并非强制性规范,但理解它们有助于预测终端程序的行为,减少学习曲线。文章以实例分析了规则的适用场景和例外情况,并强调了区分程序自身责任与操作系统默认行为的重要性。
阅读更多
本文总结了作者20年来使用终端程序的经验,归纳出一些并非官方标准但普遍适用的“规则”。这些规则涵盖了程序对Ctrl-C、Ctrl-D、q键的响应,颜色使用,readline键绑定支持,以及管道输出等方面。作者指出,虽然这些规则并非强制性规范,但理解它们有助于预测终端程序的行为,减少学习曲线。文章以实例分析了规则的适用场景和例外情况,并强调了区分程序自身责任与操作系统默认行为的重要性。
阅读更多
本文解释了为什么在终端使用管道命令时,有时会没有输出。原因是很多程序会缓冲输出数据,例如 grep 默认会缓冲 8KB 数据才输出,当输出到管道时,如果匹配的数据量不足 8KB,就不会有任何输出。文章列举了一些常用命令(grep、sed、awk、tcpdump、jq、tr 等)的缓冲机制以及如何禁用缓冲的标志,并提供了几种避免缓冲的解决方案:使用快速完成的命令、使用禁用缓冲的标志、使用 awk、使用 stdbuf 或 unbuffer。文章还讨论了编程语言中的缓冲机制以及如何禁用缓冲。最后,文章提出了一些改进缓冲机制的建议,例如设置环境变量来禁用缓冲。
阅读更多
作者Julia Evans在其网站新增了一个名为“TIL”(今日所学)的版块,用于记录在社交媒体上分享的有趣工具和事实。她认为将这些零碎信息发布在个人网站上比使用书签更方便,并为此创建了新的文件夹、样式和Rake任务,还设置了单独的RSS Feed。这一做法受到了Simon Willison的TIL博客的启发,但她自己的TIL帖子会更短。作者认为社交媒体的短暂性使其更易于分享一些不那么重要的内容,而博客、漫画和TILs则适合放在个人网站上长期保存。
阅读更多
本文探讨了终端中ASCII控制字符的功能和行为。作者列举了33个ASCII控制字符,并解释了它们在Mac OS系统上的作用。这些字符大致分为由操作系统终端驱动程序处理的代码(例如Ctrl-C触发SIGINT信号)和传递给应用程序处理的代码。文章还讨论了readline库对控制字符的影响、ASCII控制字符数量的限制、与GUI键盘快捷键的差异、ASCII名称的意义以及使用Ctrl-M和Ctrl-I作为快捷键的困难。文章最后提到了识别控制字符的Python脚本、终端规范模式和非规范模式的区别、stty工具对控制字符映射的配置、信号相关的注意事项、“backspace”键的历史渊源以及不同系统中控制字符行为的差异。
阅读更多
本文介绍了作者如何优化 Mess With DNS 的内存使用。作者首先尝试使用 SQLite 存储 IP 地址数据库,但发现速度太慢。接着尝试使用 trie 结构,但内存占用反而更高。最终,作者通过去重和使用 netip.Addr 结构,成功将内存占用降低了 70MB,同时将查询速度保持在可接受范围内。
阅读更多
这篇文章探讨了终端颜色设置的复杂性和常见问题。作者首先解释了ANSI颜色和终端模拟器如何显示颜色,接着列举了用户可能遇到的问题,例如蓝色在黑色背景上难以阅读、程序使用256色导致的颜色冲突等。文章还介绍了一些解决方案,包括配置终端模拟器、运行shell脚本以及使用“最小对比度”功能。最后,作者推荐了一些有用的工具和资源,例如base16和tinted-theming,帮助读者更好地管理和定制终端颜色。
阅读更多
本文是作者在使用Go进行Web开发时的一些心得体会,包括Go 1.22版本带来的路由改进、使用sqlc自动生成数据库查询代码、SQLite使用技巧、Go 1.19版本中引入的GC内存限制设置方法以及作者选择Go进行Web开发的原因。
阅读更多
本文介绍了作者如何使用 PowerDNS 迁移和改进 Mess With DNS 网站 DNS 功能的过程。文章详细描述了在迁移过程中遇到的八个挑战,包括如何拦截所有 DNS 查询、前端是否应该直接访问 PowerDNS API、如何处理记录 ID、如何生成清晰的错误信息、如何设置 SQLite 数据库、如何升级 Vue.js 和管理表单、如何管理前端状态以及如何对项目进行排序等。作者还分享了在解决这些挑战过程中学到的经验和教训。最终, Mess With DNS 网站成功迁移到 PowerDNS,解决了之前存在的许多 DNS 问题。
阅读更多
本文探讨了Go语言中结构体在赋值时会进行拷贝而非引用传递的特性,并解释了由此可能引发的问题,例如在使用结构体切片时,对子切片的修改可能会影响原切片。此外,文章还介绍了Go语言中方法接收器的类型以及使用建议,并列举了其他一些常见的Go语言错误和编码技巧。
阅读更多
这篇文章探讨了在终端输入文本的复杂性。作者首先指出了不同程序处理文本输入方式的不一致性,例如有些程序不支持方向键,而另一些程序则使用readline库提供更丰富的功能。文章接着介绍了readline库及其常用快捷键,以及如何使用rlwrap为不支持readline的程序添加支持。此外,文章还讨论了libedit等其他输入库,以及一些程序使用的自定义输入系统。最后,作者总结了一个在终端输入文本时判断当前环境的流程图,并列举了一些未在本篇文章中讨论的相关问题。
阅读更多
这篇文章讲解了Ruby的Timeout方法为何是危险的。Timeout方法通过在一个新线程中向主线程抛出异常来中断主线程的执行,但这可能会在代码执行的任何阶段发生,包括网络请求、清理操作、数据库操作等,从而导致难以预测的后果。文章还对比了其他语言如Java、Python、C#和C++是如何处理线程中断的,并指出Java的Thread.interrupt方法更加安全,因为它只在特定的时间点抛出InterruptedException异常,例如在Thread.sleep期间。
阅读更多