Bash

如何將標準輸入用作文件

  • March 31, 2021

我有一個需要文件作為輸入的命令,但是我從 中獲取輸入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,您可以:

cmd =(cat)

哪裡=(...)是使用臨時文件而不是管道的第三種形式的程序替換。

對於bash5.1 或 5.1 之前的版本zsh,對於不以空行結尾的輸入(以及不包含 NUL 字節的 bash),您可以執行以下操作:

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

就像這裡的字元串(來自 zsh)一樣,這裡的文件(來自 Bourne shell)是用 bash¹ 和 zsh 中的(刪除的)臨時文件實現的。在 macOS(與 Linux 相對)上,假設cmd只打開文件一次(儘管可以在其中自由搜尋),因為每次打開都將在文件中的相同位置開始,與前一個打開時留下的位置相同,cmd如果它假定該位置位於文件的開頭。


¹ 請注意,bash 行為在 5.0 中發生了變化,其中 bash 開始不遺餘力地使臨時文件不可寫,而在 5.1 中,它切換到使用管道而不是使用臨時文件來儲存小文件

引用自:https://unix.stackexchange.com/questions/525407