cat — 文件连接

The cat 命令可用于连接两个或多个文件的内容。用法为 cat firstfile secondfile ...

滥用 cat

如果你发现自己要在一个 ebuild 中使用 cat,请停下来重新考虑。这几乎总是没有必要的。

所有形式为 cat somefile | somecommand 的用法都很愚蠢,应该避免。形式 somecommand < somefile 做同样的事情,并且不需要额外的 fork 和管道。对于许多标准实用程序来说,somecommand somefile 形式也能正常工作。

使用 foo=$(cat somefile) 将文件的内容放入变量 foo 中也是没有必要的。命令 foo=$(<somefile) 也可以正常工作,并且不需要 fork。类似地,cat file | xargs cmdxargs cmd < file 可以被 cmd $(<file) 替换。

最后,cat foo > bar(其中 foo 是一个单一文件)通常可以被 cp -f foo bar 替换。

Here 文档

另一方面,cat 对所谓的“here”文档特别有用,例如来自 sendmail-8.13.3 ebuild 的以下示例

src_install() {
	# ...
	cat <<- EOF > "${D}/etc/mail/trusted-users" || die
		# trusted-users - users that can send mail as others without a warning
		# apache, mailman, majordomo, uucp are good candidates
	EOF
	# ...
}

在这个例子中,cat 用于 src_install 内创建 ${D}/etc/mail/trusted-users 文件。具体来说,新文件将包含 ebuild 中 cat 行和带有 EOF 的行之间的行。

<<- 中的奇怪连字符是 >=bash-2.05 语法,它告诉 cat 去除前导制表符(请注意,当你想要复制这个示例时,你必须用制表符替换前导空格),这样,正如 Azarah 所说,“我们不会让 ebuild 看起来像空格效果”。对于像上面示例这样的小文件来说,一组 here 文档比等效的浮动在 ${FILESDIR} 中的一堆文件更优雅,也更容易维护。如果由于某种原因你需要保留前导空格,那么只需使用 << 而不是 <<- 来获得所需的效果。