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 cmd
和 xargs 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}
中的一堆文件更优雅,也更容易维护。如果由于某种原因你需要保留前导空格,那么只需使用 <<
而不是 <<-
来获得所需的效果。