Bash
如何將標準輸入用作文件
我有一個需要文件作為輸入的命令,但是我從 中獲取輸入
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)
哪裡
=(...)
是使用臨時文件而不是管道的第三種形式的程序替換。對於
bash
5.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 中,它切換到使用管道而不是使用臨時文件來儲存小文件