如何将标准输入用作文件

如何将标准输入用作文件

我有一个命令需要一个文件作为输入,但我从其中获取输入,stdin并且不想创建临时文件。

我想做以下事情:

#!/bin/bash
osadecompile /dev/stdin < input_file.scpt

但这会导致 I/O 错误。以下可行,但是可能吗没有使用临时中间文件_?

#!/bin/bash
AS_FILE=$(mktemp)
cat - > "$AS_FILE"
osadecompile "$AS_FILE"
rm "$AS_FILE"

正如您可能已经猜到的,我在 macOS 上使用的是bash 3.2。然而,一个zsh 5.3解决方案也将受到欢迎。

答案1

使用zsh,您可以执行以下操作:

cmd =(cat)

哪里=(...)是第三种形式的进程替换,它使用临时文件而不是管道。

对于bash5.1 或 之前的版本zsh,对于不以空行结尾的输入(以及在不包含 NUL 字节的 bash 中),您可以执行以下操作:

cmd /dev/fd/3 3<<< "$(cat)"

正如此处字符串(来自 zsh)一样,此处文档(来自 Bourne shell)是通过 bash 和 zsh 中的(已删除的)临时文件实现的。在 macOS(而不是 Linux)上,假设cmd只打开文件一次(不过可以在其中自由查找),因为每个开口都会从文件中与前一个开口相同的位置开始,这可能会造成混淆,cmd如果它假设该位置位于文件的开头。


1 请注意,bash 行为在 5.0 中发生了变化,bash 开始不遗余力地使临时文件不可写,而在 5.1 中,bash 改用管道而不是小文件的临时文件

相关内容