为什么管道不适用于 cat 和 locate?

Ste*_*and 6 pipe cat locate

我正在尝试执行此操作:

locate pg_type.h | cat
Run Code Online (Sandbox Code Playgroud)

但是这个命令与 locate pg_type.h 没有什么不同

我应该改变什么?我想在cat pg_type.h任何地方表演pg_type.h

Sté*_*las 13

locate -e0 '*/pg_type.h' | xargs -r0 cat
Run Code Online (Sandbox Code Playgroud)

locate pg_type.h会找到pg_type.h路径中的所有文件(例如,如果有一个rpg_type.horn目录,您最终会显示其中的所有文件)。

没有-0的输出locate无法进行后处理,因为文件由换行符分隔,而换行符是文件名中完全有效的字符。

cat没有参数将它从标准输入读取的内容写入标准输出,因此locate | cat与 相同locatecat只会传递输出locate。您需要的是将文件列表作为参数传递给cat.

xargs就是通常的用途:将数据流转换为参数列表。-r就是cat没有输入就不要调用。没有-0(这-r不是标准的,但在许多实现中都可以找到,至少那些 xargs 对任何东西都有用的实现),xargs只会在其输入中查找单词以转换为参数,其中单词以空格分隔,反斜杠、单引号和双引号可用于转义这些分隔符,因此通常不是locate用于显示文件名的格式。

这就是为什么我们-0对两者都使用选项locatexargs它使用 NUL 字符(这是文件路径中唯一不允许的字符)来分隔文件名。

另请注意,这locate不是标准命令,并且存在大量具有不同版本和不同选项和行为的不同实现。上面的代码至少适用于相对较新的 GNU 版本locatemlocate至少在基于 Linux 的操作系统上最常见的实现。


Mat*_*hid 5

您的命令在标准输入上传递locateto的输出cat。那不是你想要的。什么,你想要的是的输出传递locatecat作为参数

我相信这样做的方法是xargs

locate pg_type.h | xargs cat
Run Code Online (Sandbox Code Playgroud)

  • 你也可以用反引号或`$()`来做到这一点,例如`cat $(locate pg_type.h)`。 (2认同)
  • 假设locate返回的路径都不包含任何空格、制表符、换行符、黑斜杠、单引号或双引号字符。对于 `$()` (@goldilocks),没有 spc、制表符、换行符或通配符 (`*`、`?`、`[`) 字符。 (2认同)
  • @goldilocks、Windows/Mac 用户或任何可能想要利用您引入的错误的人。例如,如果您以 `root` 身份运行该行并且输出最终位于世界可读的某个地方,那么有人可能想要创建一个名为 `/tmp/ /etc/shadow /pg_type.h` 的文件,以便能够拥有查看 `/etc/shadow` 文件的内容。请记住,一些错误最终会成为安全漏洞,其中一些最终会被利用。让我们首先尝试尽可能少的错误。这首先要在这里教授良好的实践(或至少提到局限性/风险)。 (2认同)