从标准输入创建临时文件

k.s*_*stm 1 shell bash zsh pipe

假设我有一个文件内容的标准输入流和一个需要文件名作为参数的命令,我想在由标准输入流的文件内容组成的文件上运行该命令。

例如,而不是命令

imageviewer mouse.jpg
Run Code Online (Sandbox Code Playgroud)

我想要一些神奇的线magic,使这相当于

cat mouse.jpg | magic
Run Code Online (Sandbox Code Playgroud)

magiczsh或 中会是什么样子bash

最好,我希望它看起来像

cat mouse.jpg | submagic | xargs imageviewer
Run Code Online (Sandbox Code Playgroud)

也就是说,我想submagic从标准输入流创建一个临时文件并输出创建的文件的文件名。

这些行magicsubmagic应该是仅使用 bash 或 zsh 命令、它们的内置命令、GNU coreutils 等的 shell 管道。


这是整个问题。以下只是澄清和背景,因为人们一直在误解我的意思。


好的,所以我想我说清楚了,但似乎我没有:我真的希望有一个管道做相当于

imageviewer mouse.jpg
Run Code Online (Sandbox Code Playgroud)

开始正好cat mouse.jpg | …。也就是说,我真的正是一条线magicsubmagic使得准确上述工作的管道-我的意思是我的问题从字面上。

这尤其意味着以下建议的解决方案不起作用:

  • 开始管道 tmpfile = $(mktemp); cat mouse.jpg | …
  • 将其重写为 imageviewer =(cat mouse.jpg)
  • 将其重写为 echo mouse.jpg | xargs imageviewer
  • 使用函数或二进制文件来解决它,比如通过定义 function magic () { … }

可以说,我感兴趣的是是否可以编写别名alias magic='…'alias submagic='…'使上述管道之一起作用,并且这些别名的定义仅包含 bash 或 zsh 命令、GNU coreutils 等 –没有什么是自己写的。

另一个评论。你让采取imageviewer成为fehsxiv或某事。

背景。当我尝试使用我的邮件客户端打开附加到邮件的几个图像文件时,我想到了这个问题neomutt。Neomutt 提供标记附加文件,然后将文件内容通过管道传输到您可以输入的命令行。所以在这里,我只能给出一个命令行,它可以在给定的标准输入流上执行某些操作。这就是问题的来源。但我对最初的问题不感兴趣,而只对这个问题感兴趣。

Kus*_*nda 7

bash至少与使用的过程取代

utility <( some_other_utility )
Run Code Online (Sandbox Code Playgroud)

这将显示utility一个文件名。当utility打开文件并从中读取时,它将读取some_other_utility.


你的例子:

cat mouse.jpg | submagic | xargs imageviewer
Run Code Online (Sandbox Code Playgroud)

我假设这是为了将文件名 发送mouse.jpgimageviewer,因为将 JPEG 文件的内容通过xargs.

这可以通过

echo 'mouse.jpg' | xargs imageviewer
Run Code Online (Sandbox Code Playgroud)

或者

xargs imageviewer <<<'mouse.jpg'
Run Code Online (Sandbox Code Playgroud)

bash

发送mouse.jpgto的内容imageviewer可以用

cat mouse.jpg | imageviewer /dev/stdin
Run Code Online (Sandbox Code Playgroud)

或者,使用过程替换,与

imageviewer <( cat mouse.jpg )
Run Code Online (Sandbox Code Playgroud)

使用临时文件:

tmpfile=$(mktemp)
cat mouse.jpg >"$tmpfile"

imageviewer "$tmpfile"

rm "$tmpfile"
Run Code Online (Sandbox Code Playgroud)

可能,

tmpfile=$(mktemp)
cat mouse.jpg | { cat >"$tmpfile"; echo "$tmpfile"; } | xargs imageviewer
rm "$tmpfile"
Run Code Online (Sandbox Code Playgroud)

这个管道依赖于这样一个事实,即xargs等待执行,imageviewer直到它从管道的中间部分读取文件名。在创建临时文件之前,中间命令不会输出文件名。