我有一个需要文件作为输入的命令,但是我从 中获取输入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解决方案也将受到欢迎。
使用
zsh
,您可以:哪里
=(...)
是使用临时文件而不是管道的第三种形式的进程替换。对于
bash
5.1 或 5.1 之前的版本zsh
,对于不以空行结尾的输入(以及不包含 NUL 字节的 bash),您可以执行以下操作:正如这里的字符串(来自 zsh)一样,这里的文档(来自 Bourne shell)是用 bash¹ 和 zsh 中的(删除的)临时文件实现的。在 macOS(与 Linux 相对)上,假设
cmd
只打开文件一次(尽管可以在其中自由搜索),因为每次打开都将在文件中的相同位置开始,与前一个打开时留下的位置相同,cmd
如果它假定该位置位于文件的开头。¹ 请注意,bash 行为在 5.0 中发生了变化,其中 bash 开始不遗余力地使临时文件不可写,而在 5.1 中,它切换到使用管道而不是使用临时文件来存储小文件