cat 的有用用法

Unix 用户再次讨论老生常谈的“无用的 `cat`”规范,争论以 `cat file | ...` 开始管道实际上是否能提升模块化、可读性和交互式工作流,即使它会多启动一个进程。评论者将 `cat` 驱动的管道与输入重定向(`< file cmd`)和直接文件参数(`cmd file`)进行对比,权衡性能、正确性边界情况,以及命令是否容易被编辑、重排或替换(例如把 `cat` 换成 `zcat` 或 `curl`)。虽然纯粹主义者仍主张在脚本里尽量减少冗余进程,但许多人最终认为,在日常 shell 使用中,`cat` 的人体工学收益往往超过其理论上的低效。

模块化 vs “无用的 cat”

  • 许多人为以 cat file | ... 开始管道辩护,认为这是一种清晰地建模“数据源 → 转换”的方式,并且很容易把 cat 替换成 zcatcurl 等。
  • 另一些人则认为文章过度抽象化了:把“把文件名转成字节”拆成一个独立进程,只是一种很薄弱的“职责”。重定向(< file cmd)本来就已经把来源与处理解耦了。
  • 有人说 cat 让管道更可组合,也更符合心理预期;批评者回应说,与使用内建文件参数或重定向相比,它并没有真正提升模块化。

Shell 语法、重定向与可读性

  • 讨论大量集中在 cat file | cmd<file cmdcmd <file 的比较上。
  • 不少人指出,POSIX shell 允许重定向出现在简单命令的任何位置,例如 <access.log head -n 500 | grep mail | perl ...
  • 对可读性的看法不一:有人觉得 <file cmd 优雅且对称(<infile cmd >outfile),也有人觉得它在视觉上难看,而且比 cat infile | cmd 更难扫读。
  • 还存在争论:重定向在概念上算不算“管道的一步”,还是仅仅是 shell 语法。

性能、正确性与脚本编写方面的顾虑

  • 一派认为“无用的 cat”主要是教学问题:它暴露了误解,还增加了一个不必要的进程和数据拷贝,这在脚本、大文件或慢平台上可能会有影响。
  • 反方则指出:对大多数真实工作负载来说,fork/pipe 的开销微不足道;正确性和可读性更重要,而 shellcheck 对 UUoC 的警告有时比帮助更像是唠叨。
  • 有人提到,传入文件名能让程序检查文件描述符(TTY 检测、缓冲、颜色等),而 cat 管道会遮蔽这些信息。另一些人认为这些情况很少见。

交互式工作流与人体工学

  • 许多人为 cat 辩护,理由是它很适合交互式使用:先敲 cat file,然后按上箭头并在前面加上 | grep ...| head ... 等,逐步细化过滤条件。
  • 也有人建议更快地利用历史记录:!$$_Alt+. 以及其他 readline/vi-mode 技巧,还有 zsh 的 $READNULLCMD 和进程替换特性。
  • 还有人更喜欢始终以 <input X | Y | Z >output 开始,这样在增删阶段时输入重定向保持稳定。

替代工具与较少人知道的特性

  • 文中提到 tacrevnlzgreplesspipexargsawkperlsed,以及使用进程替换进行 diff(diff -aui <(xxd a) <(xxd b))。
  • cat -Acat -n、here-doc、把 cat 作为函数中的恒等变换、作为简单编辑器(cat > file),或者作为模板注入器(在 heredoc 中使用 cat -)都被强调为真正“有用的 cat 用法”。

幽默与跑题

  • 文中出现了大量关于猫(动物)的笑话、书籍引用以及物理/线性代数式的玩笑,还夹杂着对 HN 挑刺文化和“UUoC 执法”社交动态的元评论。