从 bash 命令输出创建“虚拟文件”?

ppb*_*itb 39 bash redirection

我想知道是否有办法从 bash 输出创建“虚拟文件”。

示例:假设我想将 的输出mysqldump作为附件通过电子邮件发送到外部电子邮件地址。我可以使用 Mutt 来做到这一点。mutt我需要使用的选项是-a <name of the file I want to attach>. 我知道我可以使用一个临时文件:

mysqldump mysqldumpoptions > /tmp/tempfile && mutt -a /tmp/tempfile admin@example.org
Run Code Online (Sandbox Code Playgroud)

但我宁愿将mysqldump输出直接重定向到 Mutt。Mutt 的-a选项只接受一个文件而不是一个流,但也许有一种方法可以将某种虚拟文件描述符或类似的东西传递给它。就像是:

mutt -a $(mysqldump mysqldumpoptions) admin@example.org
Run Code Online (Sandbox Code Playgroud)

是否可以?如果不是,为什么?

这可能是一个愚蠢的例子,肯定有更简单的方法来做到这一点,但我希望它能解释我关于从另一个命令的输出创建虚拟文件的问题。

fre*_*eit 63

这是做你想做的最干净的方法:

mutt admin@example.org -a <(mysqldump mysqldumpoptions)
Run Code Online (Sandbox Code Playgroud)

<()操作是你问什么; 它创建一个 FIFO(或 /dev/fd)并派生一个进程并将 stdout 连接到 FIFO。 >()做同样的事情,除了将 stdin 连接到 FIFO。换句话说,它在幕后为您完成了所有的 mknod 工作;或在现代操作系统上,以更好的方式做到这一点。

除了,当然,这不适用于 mutt,它说:

/dev/fd/63: unable to attach file.
Run Code Online (Sandbox Code Playgroud)

我怀疑问题在于 mutt 试图在文件中查找,而您无法在任何类型的管道上进行查找。查找可能类似于扫描文件以找出它是什么 MIME 类型以及可能使用的编码(即文件是 7 位还是 8 位),然后查找到文件的开头以将其实际编码到消息中.

如果你想发送的是纯文本,你总是可以做这样的事情来使它成为电子邮件的主要内容(不理想,但它确实有效):

mysqldump mysqldumpoptions | mutt -s "Here's that mysqldump" admin@example.org
Run Code Online (Sandbox Code Playgroud)

  • 惊人的!我第一次看到这样的重定向。 (2认同)