Интересно, есть ли способ создать «виртуальный файл» из вывода bash.
Пример: скажем, я хочу отправить по электронной почте вывод mysqldump
как вложение к внешнему адресу электронной почты. Для этого я могу использовать Матта. В mutt
вариант, который мне нужно использовать, -a <name of the file I want to attach>
. Я знаю, что могу использовать временный файл:
mysqldump mysqldumpoptions > /tmp/tempfile && mutt -a /tmp/tempfile admin@example.org
Но я бы предпочел перенаправить mysqldump
вместо этого выводить непосредственно в Mutt. Матта -a
option принимает только файл, а не поток, но, возможно, есть способ передать ему какой-то дескриптор виртуального файла или что-то в этом роде. Что-то вроде:
mutt -a $(mysqldump mysqldumpoptions) admin@example.org
Является ли это возможным? Если нет, то почему?
Возможно, это глупый пример, и, безусловно, есть более простые способы сделать это, но я надеюсь, что он объясняет мой вопрос о создании виртуального файла из результатов другой команды.
Это самый чистый способ делать то, что вы хотите:
mutt admin@example.org -a <(mysqldump mysqldumpoptions)
В <()
оператор - это то, о чем вы просили; он создает FIFO (или / dev / fd), разветвляет процесс и подключает стандартный вывод к 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
Я думаю, что вы ищете 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
FIFO, вероятно, лучший способ. Однако вы можете использовать mkfifo /path/to/fifo
вместо
Это обязательно должно быть приложение? Если он может отображаться как тело сообщения (7-битный чистый ascii, не содержит '.' В отдельной строке и т. Д.), То сработает что-то вроде этого:
mysqldump mysqldumpoptions | mutt -s "сегодняшний дамп MySQL" admin@example.org
Вы можете использовать имя файла /dev/stdin
с mutt, который будет читать из своего стандартного ввода.
mysqldump mysqldumpoptions | mutt -a /dev/stdin admin@example.org
Хм, я только что попробовал это, а дворняга жалуется:
/dev/stdin isn't a regular file.
/dev/stdin: unable to attach file.
Ну что ж. Я думаю, что это ответ на ваш вопрос с помощью -a
option Mutt ожидает обычный файл, что подразумевает не устройство или канал.
Возможно, мне здесь что-то не хватает, но зачем использовать mutt, если это больше похоже на работу для / usr / sbin / sendmail (или где-то еще в вашем дистрибутиве)?
mysqldump mysqldumpoptions | sendmail admin@example.org
большинство MTA для unix предоставляют команду / usr / sbin / sendmail, и все они понимают более или менее одинаковые параметры и работают более или менее одинаково. почти во всех случаях вам не нужно заботиться о том, какой именно MTA / реализацию sendmail вы используете.
есть еще несколько альтернатив, включая mail / mailx
Параметр Mutt -a специально использует типы MIME, определенные в /etc/mime.types. Ни один из виртуальных типов файлов, которые, по вашему мнению, не являются действительным зарегистрированным типом mime, поэтому я не думаю, что вложение mutt будет работать. Просто для доказательства концепции вы можете попробовать установить пакет поддержки mime (который предоставляет двоичные файлы доступа к mime-файлам, такие как просмотр, редактирование и т. Д.) И запустить просмотр для виртуального файла (скажем, канала), вы увидите, что он делает не признать это. Основная проблема заключается в том, что обычно виртуальный файл содержит данные в памяти, а не на диске, файловый объект - это просто указатель. Вы даже можете попробовать обернуть виртуальный файл tar / gz и порадовать Mutt, но я сомневаюсь, что вы получите что-нибудь полезное на другом конце ... :)