命令需要文件路径。如何为“输入文件”提供标准输入,为“输出文件”提供标准输出?

Bee*_*jor 2 pipe io-redirection file-descriptors stdout stdin

考虑一个类似的命令foo -in /path/to/infile -out /path/to/outfile,您希望将字符串传递给它而不是使用临时文件。它可能会被调用很多导致大量磁盘访问,或者与您不想将敏感数据写入磁盘(或处理加密和/或 ram 磁盘等)的加密有关。

有没有办法给它stdin并在stdout 中获得输出,
比如echo "abc" | foo -in &0 -out &1

我知道有一些文件描述符可以重定向数据,比如echo "foo" 1>&2. 并且xargs可以将字符串作为参数传递之类的东西。但是是否可以以某种方式将标准文件描述符作为文件路径传递?如果我可以将 stdin/out 作为文件读写,为什么不能获得它的“虚拟”文件路径?

fil*_*den 5

您可以使用特殊的文件/dev/stdin/dev/fd/0对标准输入,以及/dev/stdout/dev/fd/1标准输出。

在你的例子中:

echo "abc" | foo -in /dev/fd/0 -out /dev/fd/1
Run Code Online (Sandbox Code Playgroud)

这些特殊文件的可用性取决于您使用的操作系统,但在 Linux(以及大多数 Linux 发行版)上,您应该不会在查找或使用它们时遇到问题。

这些文件是“虚拟的”,从某种意义上说,写入其中之一不会将数据写入磁盘。打开这些特殊文件之一相当于调用dup(2)系统调用,它将现有的文件描述符复制到一个新的文件描述符上。