我写了一个 bash 枚举器,因为我受够了 xargs

一个用 `{}` 占位符统一遍历文件和列表的小型 Bash 工具遭到命令行用户的怀疑;他们认为只要正确使用,`find -print0`、`xargs -0`、GNU Parallel 以及简单的 `while read` 循环已经足以完成这些工作。评论者将追求更简单、统一语法的愿望,与学习现有 POSIX 工具的价值、可移植性担忧,以及再增加一个带有自身怪癖的包装器的风险进行对比。讨论进一步扩展为对传统 shell 的批评——指出 Bash 的许多坑、zsh、nushell 和 PowerShell 等替代工具,以及停留在无处不在但过时的实用工具与采用更现代、结构化方法之间的张力。

bashumerate 的感知需求

  • OP 的目标:用一种单一、统一、基于 {} 的方式来遍历文件、行、范围和列表,避免 forfind -execxargs 的各种参数标志。
  • 有些人原则上觉得这很吸引人(一个心智模型、简单的单行命令)。
  • 另一些人则认为这并不“更简单”,只是“更省事”:它引入了另一个工具和语法,而不是学习现有工具。

“直接用 Shell 工具”阵营

  • 许多人说,xargs + find(配合 -print0/-0)已经解决了几乎所有问题,包括文件名中的空格和参数列表长度限制。
  • find -exec ... +find -delete 被强调为许多示例中更好、更简单的模式。
  • 若干人推荐用 while read 循环(通常使用 $REPLY)进行按行遍历,但会提醒通过管道使用时的子 shell 问题。
  • 有些人展示了自己构建的小型自定义包装函数(迷你枚举器),而不是再增加一个依赖。

正确性、边界情况与语法问题

  • 强调“文件名包含空格”的问题可以通过 NUL 结尾(-print0xargs -0)来解决,而且这在 POSIX 2024 中已经标准化。
  • 也有人警告文件名里有换行符以及 glob 展开的限制;有人指出 bashumerate 基于 glob 的实现可能会遇到参数/内存问题。
  • enumerate 语法的批评包括:对 -- 的非常规使用、对引用的要求,以及模板式 {} 替换会重新引入引用/转义陷阱。
  • 还有人认为这个工具只覆盖了 find/循环能做的一部分,因此它只是额外叠加了一层语法,而不是替代品。

性能与并行

  • xargs 因其能够批量处理参数并可选并行化(-P)而受到称赞,相比之下 find -exec 往往是一进程接一进程地执行。
  • 也有人在大多数日常任务中更看重清晰和简单,而不是并行速度。

替代方案与更广泛的 Shell 争论

  • 讨论中提到的其他工具包括:GNU Parallel(既被赞赏其强大,也被批评其 UX、引用提示以及首次运行行为)、lr/xerushfd、个人的 Python/Go 包装器、基于 CSV 的流水线。
  • 线程分叉到更广泛的争论:传统 POSIX shell vs 更现代的 shell(zsh、nushell、PowerShell、rc、xonsh)。
  • 一个反复出现的主题是:使用无处不在的标准工具(POSIX sh/bash + coreutils)在随机系统上的可移植性很有价值,尽管它们有不少怪癖。