tạo 'tệp ảo' từ đầu ra lệnh bash?


36

Tôi tự hỏi liệu có cách nào để tạo một 'tệp ảo' từ đầu ra bash không.

Ví dụ: Giả sử tôi muốn gửi email đầu ra mysqldumpdưới dạng tệp đính kèm tới địa chỉ email bên ngoài. Tôi có thể sử dụng Mutt để làm như vậy. Các mutttùy chọn tôi cần phải sử dụng là -a <name of the file I want to attach>. Tôi biết tôi có thể sử dụng một tập tin tạm thời:

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

Nhưng tôi muốn chuyển hướng mysqldumpđầu ra trực tiếp đến Mutt thay vào đó. -aTùy chọn của Mutt chỉ chấp nhận một tệp chứ không phải luồng, nhưng có thể có một cách để truyền cho nó một loại mô tả tệp ảo hoặc một cái gì đó dọc theo các dòng đó. Cái gì đó như:

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

Có thể không? Nếu không, tại sao?

Đây có thể là một ví dụ ngớ ngẩn và chắc chắn có nhiều cách dễ dàng hơn để làm điều này, nhưng tôi hy vọng nó giải thích câu hỏi của tôi về việc tạo một tệp ảo từ đầu ra của một lệnh khác.


1
Tôi không thể làm cho <() hoạt động cho đến khi tôi nhận ra mình đang sử dụng sh thay vì bash. Nó đang làm việc tuyệt vời. Tôi sẽ nêu lên những phản hồi hữu ích khi (nếu) tôi đạt được danh tiếng cần thiết tối thiểu. Cảm ơn vì tất cả những góp ý.
Pierre

Câu trả lời:


53

Đây là cách sạch nhất để làm những gì bạn muốn:

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

Các <()nhà điều hành là những gì bạn được yêu cầu; nó tạo ra một FIFO (hoặc / dev / fd) và tạo ra một quy trình và kết nối thiết bị xuất chuẩn với FIFO. >()thay vào đó, ngoại trừ kết nối stdin với FIFO. Nói cách khác, nó thực hiện tất cả các công cụ mknod cho bạn đằng sau hậu trường; hoặc trên một hệ điều hành hiện đại, thực hiện nó theo một cách thậm chí tốt hơn.

Tất nhiên, ngoại trừ, điều đó không hoạt động với mutt, nó nói:

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

Tôi nghi ngờ vấn đề là mutt đang cố gắng tìm kiếm trong tập tin, điều mà bạn không thể làm trên bất kỳ loại ống nào. Việc tìm kiếm có lẽ là một cái gì đó giống như quét tệp để tìm ra loại MIME và loại mã hóa nào có thể hoạt động (nghĩa là tệp đó là 7 bit hay 8 bit), sau đó tìm kiếm ở đầu tệp để thực sự mã hóa nó vào tin nhắn .

Nếu những gì bạn muốn gửi là văn bản thuần túy, bạn luôn có thể làm một cái gì đó như thế này để biến nó thành nội dung chính của email thay thế (không lý tưởng, nhưng nó thực sự hoạt động):

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

2
Tuyệt vời! Tôi đang nhìn thấy sự chuyển hướng như vậy lần đầu tiên.
Saurabh Barjatiya

Cảm ơn bạn đã giải thích tốt! Tôi chưa bao giờ thấy điều này trước đây, trong bất kỳ hướng dẫn nào về chuyển hướng I / O.
Christian Mann

4

Tôi nghĩ rằng những gì bạn đang tìm kiếm là một fifo sử dụng mknod

mknod /tmp/foo p

echo hello > /tmp/foo &

cat /tmp/foo

Lưu ý, quá trình viết sẽ chặn nếu không có quá trình đọc.

ví dụ

mknod /tmp/foo p

mysqldump mysqldumpoptions > /tmp/foo &

mutt -a /tmp/foo

1

Có cần phải là một tập tin đính kèm? Nếu nó có thể xuất hiện dưới dạng nội dung của tin nhắn (ascii sạch 7 bit, không chứa '.' Trên một dòng, v.v.), thì một cái gì đó như thế này sẽ hoạt động:

mysqldump mysqldumpoptions | mutt -s "bãi rác mysql ngày nay" admin@example.org


1

Bạn có thể sử dụng tên tệp /dev/stdinvới mutt, nó sẽ đọc từ stdin của nó.

mysqldump mysqldumpoptions | mutt -a /dev/stdin admin@example.org

Hừm, tôi vừa thử cái này và mutt phàn nàn:

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

Ồ tốt Tôi nghĩ rằng điều này trả lời câu hỏi của bạn mặc dù, với -atùy chọn mutt mong đợi một tệp thông thường, ngụ ý không phải là một thiết bị hoặc đường ống.


1

Một FIFO có lẽ là cách tốt nhất. Tuy nhiên, bạn có thể sử dụng mkfifo /path/to/fifothay thế


0

Tôi có thể đang thiếu một cái gì đó ở đây, nhưng tại sao lại sử dụng mutt khi điều này nghe giống như một công việc cho / usr / sbin / sendmail (hoặc bất cứ nơi nào nó sống trên bản phân phối của bạn)?

mysqldump mysqldumpoptions | sendmail admin@example.org

hầu hết các MTA unix đều cung cấp lệnh / usr / sbin / sendmail và tất cả đều hiểu ít nhiều các tùy chọn giống nhau và hoạt động theo cách ít nhiều giống nhau. trong hầu hết các trường hợp, bạn không cần quan tâm MTA / việc triển khai sendmail cụ thể nào bạn đang sử dụng.

có một số lựa chọn thay thế khác nữa, bao gồm mail / mailx


1
sau đó, nó không phải là một tệp đính kèm, dường như khó sử dụng hơn cho người nhận
freiheit

1
trong trường hợp đó, một giải pháp tốt hơn là sử dụng một công cụ như siêu dữ liệu (1) hoặc mime-construc (1p) hoặc tự viết bằng cách sử dụng một cái gì đó như mô-đun MIME :: Lite (yêu thích cá nhân của tôi vì nó dễ thực hiện những điều phổ biến nhất liên quan đến mime).
cas

0

Tùy chọn Mutt -a đặc biệt sử dụng các loại MIME được xác định tại /etc/mime.types. Không có loại tệp ảo nào mà bạn nghĩ thực sự là loại mime hợp lệ được đăng ký, vì vậy tôi không nghĩ rằng tệp đính kèm mutt sẽ hoạt động. Chỉ cần chứng minh khái niệm, bạn có thể thử cài đặt gói hỗ trợ mime (cung cấp các tệp nhị phân truy cập tệp mime như xem, chỉnh sửa, v.v.) và chạy xem với tệp ảo (giả sử là một đường ống), bạn sẽ thấy rằng nó thực hiện không nhận ra nó Vấn đề cơ bản là thông thường một tệp ảo chứa nội dung dữ liệu trong bộ nhớ, không phải trên đĩa, đối tượng tệp chỉ là một con trỏ. Bạn thậm chí có thể thử bọc một tệp ảo bằng tar / gz và làm cho mutt hài lòng nhưng tôi nghi ngờ bạn sẽ nhận được bất cứ điều gì hữu ích từ đầu kia ... :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.