很多人使用单行代码和包含代码的脚本
cat "$MYFILE" | command1 | command2 > "$OUTPUT"
第cat
一种通常称为“猫的无用使用”,因为从技术上讲,它需要启动一个新进程(通常是/usr/bin/cat
),如果已经执行了该命令,则可以避免这种情况
< "$MYFILE" command1 | command2 > "$OUTPUT"
因为shell只需启动command1
,只需将其stdin
指向给定文件即可。
Shell为什么不自动执行此转换?我觉得“猫的无用使用”语法更容易阅读,shell应该有足够的信息来自动摆脱无用的cat。的cat
是在POSIX标准定义,因此壳应该允许执行它在内部,而不是在路径使用二进制的。Shell甚至可以只包含一个参数版本的实现,并在路径中回退到二进制。
lseek
仍然是已定义的行为,并且可能导致不同的结果,不同的阻止行为可能在语义上是有意义的,等等。如果您知道其他命令是什么并且知道它们不在乎,则可以进行更改,或者如果您只是不关心该级别的兼容性,但是好处很小。我确实认为,缺乏收益比合规成本更能推动局势。
cat
不过,绝对允许外壳实现自身或任何其他实用程序。还可以知道属于系统的其他实用程序的工作方式(例如,它可以知道系统随附的外部grep
实现的行为方式)。这是完全可行的,因此想知道为什么他们不这样做是完全公平的。
grep
。和sed
。和awk
。和du
。还有几百个甚至数千个其他实用程序?