從 bash 命令輸出建立「虛擬檔案」?

從 bash 命令輸出建立「虛擬檔案」?

我想知道是否有辦法從 bash 輸出建立「虛擬檔案」。

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

mysqldump mysqldumpoptions > /tmp/tempfile && mutt -a /tmp/tempfile [email protected]

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

mutt -a $(mysqldump mysqldumpoptions) [email protected]

是否可以?如果沒有,為什麼?

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

答案1

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

mutt [email protected] -a <(mysqldump mysqldumpoptions)

接線生<()就是您所要求的;它會建立一個 FIFO(或 /dev/fd)並分叉一個進程並將 stdout 連接到 FIFO。 >()執行相同的操作,只不過將 stdin 連接到 FIFO。換句話說,它在幕後為您完成所有 mknod 工作;或者在現代作業系統上,以更好的方式做到這一點。

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

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

我懷疑問題在於 mutt 正在嘗試在文件中查找,而您無法在任何類型的管道上執行此操作。尋找可能類似於掃描檔案以找出它是什麼 MIME 類型以及可能的編碼(即檔案是 7 位元還是 8 位元),然後尋找檔案的開頭以將其實際編碼到訊息中。

如果您要發送的內容是純文本,您始終可以執行類似的操作,使其成為電子郵件的主要內容(不理想,但實際上有效):

mysqldump mysqldumpoptions | mutt -s "Here's that mysqldump" [email protected]

答案2

我認為你正在尋找的是一個 fifo 使用mknod

mknod /tmp/foo p

echo hello > /tmp/foo &

cat /tmp/foo

請注意,如果沒有讀取過程,寫入過程將會阻塞。

例如

mknod /tmp/foo p

mysqldump mysqldumpoptions > /tmp/foo &

mutt -a /tmp/foo

答案3

FIFO 可能是最好的方法。但是你可以mkfifo /path/to/fifo使用

答案4

您可以將檔案名稱/dev/stdin與 mutt 一起使用,它將從其標準輸入中讀取。

mysqldump mysqldumpoptions | mutt -a /dev/stdin [email protected]

嗯,我剛剛嘗試了這個,穆特抱怨道:

/dev/stdin isn't a regular file.
/dev/stdin: unable to attach file.

那好吧。我認為這回答了你的問題,但選項-amutt 需要一個常規文件,這意味著不是設備或管道。

相關內容