Bash

從 bash 命令輸出創建“虛擬文件”?

  • February 11, 2022

我想知道是否有辦法從 bash 輸出創建“虛擬文件”。

範例:假設我想通過電子郵件將輸出mysqldump作為附件發送到外部電子郵件地址。我可以使用 Mutt 來做到這一點。mutt我需要使用的選項是-a <name of the file I want to attach>. 我知道我可以使用一個臨時文件:

mysqldump mysqldumpoptions > /tmp/tempfile && mutt -a /tmp/tempfile admin@example.org

但我寧願將mysqldump輸出直接重定向到 Mutt。Mutt 的-a選項只接受文件而不接受流,但也許有一種方法可以將某種虛擬文件描述符或類似的東西傳遞給它。就像是:

mutt -a $(mysqldump mysqldumpoptions) admin@example.org

可能嗎?如果不是,為什麼?

這可能是一個愚蠢的例子,肯定有更簡單的方法可以做到這一點,但我希望它能解釋我關於從另一個命令的輸出創建虛擬文件的問題。

這是做你想做的最乾淨的方法:

mutt admin@example.org -a <(mysqldump mysqldumpoptions)

<()操作員就是您所要求的;它創建一個 FIFO(或 /dev/fd)並分叉一個程序並將 stdout 連接到 FIFO。 >()做同樣的事情,除了將標準輸入連接到 FIFO。換句話說,它在幕後為您完成了所有 mknod 的工作;或在現代作業系統上,以更好的方式做到這一點。

當然,除了這對 mutt 不起作用,它說:

/dev/fd/63: unable to attach file.

我懷疑問題在於 mutt 試圖在文件中查找,而您在任何類型的管道上都無法做到這一點。搜尋可能類似於掃描文件以找出它是什麼 MIME 類型以及哪些編碼可能有效(即文件是 7 位還是 8 位),然後搜尋到文件的開頭以將其實際編碼到消息中.

如果您要發送的是純文字,您總是可以這樣做以使其成為電子郵件的主要內容(不理想,但它確實有效):

mysqldump mysqldumpoptions | mutt -s "Here's that mysqldump" admin@example.org

引用自:https://serverfault.com/questions/40284