我写了一个 bash 枚举器,因为我受够了 xargs
一个用 `{}` 占位符统一遍历文件和列表的小型 Bash 工具遭到命令行用户的怀疑;他们认为只要正确使用,`find -print0`、`xargs -0`、GNU Parallel 以及简单的 `while read` 循环已经足以完成这些工作。评论者将追求更简单、统一语法的愿望,与学习现有 POSIX 工具的价值、可移植性担忧,以及再增加一个带有自身怪癖的包装器的风险进行对比。讨论进一步扩展为对传统 shell 的批评——指出 Bash 的许多坑、zsh、nushell 和 PowerShell 等替代工具,以及停留在无处不在但过时的实用工具与采用更现代、结构化方法之间的张力。
对 bashumerate 的感知需求
- OP 的目标:用一种单一、统一、基于
{}的方式来遍历文件、行、范围和列表,避免for、find -exec和xargs的各种参数标志。 - 有些人原则上觉得这很吸引人(一个心智模型、简单的单行命令)。
- 另一些人则认为这并不“更简单”,只是“更省事”:它引入了另一个工具和语法,而不是学习现有工具。
“直接用 Shell 工具”阵营
- 许多人说,
xargs+find(配合-print0/-0)已经解决了几乎所有问题,包括文件名中的空格和参数列表长度限制。 find -exec ... +和find -delete被强调为许多示例中更好、更简单的模式。- 若干人推荐用
while read循环(通常使用$REPLY)进行按行遍历,但会提醒通过管道使用时的子 shell 问题。 - 有些人展示了自己构建的小型自定义包装函数(迷你枚举器),而不是再增加一个依赖。
正确性、边界情况与语法问题
- 强调“文件名包含空格”的问题可以通过 NUL 结尾(
-print0、xargs -0)来解决,而且这在 POSIX 2024 中已经标准化。 - 也有人警告文件名里有换行符以及 glob 展开的限制;有人指出
bashumerate基于 glob 的实现可能会遇到参数/内存问题。 - 对
enumerate语法的批评包括:对--的非常规使用、对引用的要求,以及模板式{}替换会重新引入引用/转义陷阱。 - 还有人认为这个工具只覆盖了
find/循环能做的一部分,因此它只是额外叠加了一层语法,而不是替代品。
性能与并行
xargs因其能够批量处理参数并可选并行化(-P)而受到称赞,相比之下find -exec往往是一进程接一进程地执行。- 也有人在大多数日常任务中更看重清晰和简单,而不是并行速度。
替代方案与更广泛的 Shell 争论
- 讨论中提到的其他工具包括:GNU Parallel(既被赞赏其强大,也被批评其 UX、引用提示以及首次运行行为)、
lr/xe、rush、fd、个人的 Python/Go 包装器、基于 CSV 的流水线。 - 线程分叉到更广泛的争论:传统 POSIX shell vs 更现代的 shell(zsh、nushell、PowerShell、rc、xonsh)。
- 一个反复出现的主题是:使用无处不在的标准工具(POSIX
sh/bash+ coreutils)在随机系统上的可移植性很有价值,尽管它们有不少怪癖。