cat 的有用用法
Unix 用户再次讨论老生常谈的“无用的 `cat`”规范,争论以 `cat file | ...` 开始管道实际上是否能提升模块化、可读性和交互式工作流,即使它会多启动一个进程。评论者将 `cat` 驱动的管道与输入重定向(`< file cmd`)和直接文件参数(`cmd file`)进行对比,权衡性能、正确性边界情况,以及命令是否容易被编辑、重排或替换(例如把 `cat` 换成 `zcat` 或 `curl`)。虽然纯粹主义者仍主张在脚本里尽量减少冗余进程,但许多人最终认为,在日常 shell 使用中,`cat` 的人体工学收益往往超过其理论上的低效。
模块化 vs “无用的 cat”
- 许多人为以
cat file | ...开始管道辩护,认为这是一种清晰地建模“数据源 → 转换”的方式,并且很容易把cat替换成zcat、curl等。 - 另一些人则认为文章过度抽象化了:把“把文件名转成字节”拆成一个独立进程,只是一种很薄弱的“职责”。重定向(
< file cmd)本来就已经把来源与处理解耦了。 - 有人说
cat让管道更可组合,也更符合心理预期;批评者回应说,与使用内建文件参数或重定向相比,它并没有真正提升模块化。
Shell 语法、重定向与可读性
- 讨论大量集中在
cat file | cmd、<file cmd与cmd <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开始,这样在增删阶段时输入重定向保持稳定。
替代工具与较少人知道的特性
- 文中提到
tac、rev、nl、zgrep、lesspipe、xargs、awk、perl、sed,以及使用进程替换进行 diff(diff -aui <(xxd a) <(xxd b))。 cat -A、cat -n、here-doc、把cat作为函数中的恒等变换、作为简单编辑器(cat > file),或者作为模板注入器(在 heredoc 中使用cat -)都被强调为真正“有用的 cat 用法”。
幽默与跑题
- 文中出现了大量关于猫(动物)的笑话、书籍引用以及物理/线性代数式的玩笑,还夹杂着对 HN 挑刺文化和“UUoC 执法”社交动态的元评论。