Zastanawiam się, czy istnieje sposób na utworzenie „pliku wirtualnego” z wyjścia bash.
Przykład: powiedzmy, że chcę wysłać wynik mysqldump
jako załącznik do zewnętrznego adresu e-mail. Mogę do tego użyć Mutt. mutt
Opcja muszę używać jest -a <name of the file I want to attach>
. Wiem, że mógłbym użyć pliku tymczasowego:
mysqldump mysqldumpoptions > /tmp/tempfile && mutt -a /tmp/tempfile admin@example.org
Ale wolałbym zamiast tego przekierować mysqldump
wyjście bezpośrednio do Mutt. -a
Opcja Mutt'a akceptuje tylko plik, a nie strumień, ale być może istnieje sposób, aby przekazać mu jakiś wirtualny deskryptor pliku lub coś w tym stylu. Coś jak:
mutt -a $(mysqldump mysqldumpoptions) admin@example.org
Czy to możliwe? Jeśli nie to dlaczego?
Jest to może głupi przykład i są na pewno łatwiejsze sposoby na zrobienie tego, ale mam nadzieję, że to wyjaśnia moje pytanie dotyczące tworzenia pliku wirtualnego z danych wyjściowych innego polecenia.
źródło
Odpowiedzi:
To najczystszy sposób na robienie tego, co chcesz:
<()
Operator jest to, co zostało z prośbą o; tworzy FIFO (lub / dev / fd) i forksuje proces i łączy stdout z FIFO.>()
robi to samo, tyle że zamiast tego łączy stdin z FIFO. Innymi słowy, robi to wszystko za mknod za kulisami; lub w nowoczesnym systemie operacyjnym robi to w jeszcze lepszy sposób.Z wyjątkiem, oczywiście, że to nie działa z muttem, mówi:
Podejrzewam, że problem polega na tym, że mutt próbuje szukać w pliku, czego nie można zrobić na żadnym potoku. Wyszukiwanie prawdopodobnie przypomina skanowanie pliku, aby dowiedzieć się, jaki jest typ MIME i jakie kodowanie może działać (tj. Czy plik jest 7-bitowy czy 8-bitowy), a następnie wyszukiwanie do początku pliku w celu zakodowania go w wiadomości .
Jeśli to, co chcesz wysłać, to zwykły tekst, zawsze możesz zrobić coś takiego, aby zamiast tego była główną treścią wiadomości e-mail (nie jest idealna, ale w rzeczywistości działa):
źródło
Myślę, że to, czego szukasz, to użycie fifo
mknod
Uwaga: proces pisania zostanie zablokowany, jeśli nie będzie procesu odczytu.
na przykład
źródło
Czy to musi być załącznik? Jeśli może pojawić się jako treść wiadomości (7-bitowe czyste ascii, nie zawiera „.” W wierszu, itp.), To coś takiego działałoby:
źródło
Możesz być w stanie użyć nazwy pliku
/dev/stdin
z mutt, który będzie czytał ze swojego standardowego wejścia.Hm, właśnie próbowałem tego i mutt narzeka:
No cóż. Myślę, że to odpowiada na twoje pytanie, z
-a
opcją mutt oczekuje zwykłego pliku, który nie oznacza urządzenia ani potoku.źródło
FIFO jest prawdopodobnie najlepszym sposobem. Możesz jednak użyć
mkfifo /path/to/fifo
zamiast tegoźródło
może coś tu brakuje, ale po co używać mutt, jeśli brzmi to bardziej jak praca dla / usr / sbin / sendmail (lub gdziekolwiek mieszka na twojej dystrybucji)?
mysqldump mysqldumpoptions | sendmail [email protected]
większość uniksowych MTA zawiera polecenie / usr / sbin / sendmail i wszystkie one rozumieją mniej więcej te same opcje i działają mniej więcej w ten sam sposób. w prawie wszystkich przypadkach nie musisz dbać o to, którego konkretnego MTA / implementacji sendmaila używasz.
istnieje również kilka innych alternatyw, w tym mail / mailx
źródło
Opcja Mutt -a konkretnie używa typów MIME zdefiniowanych w /etc/mime.types. Żaden wirtualny typ pliku, który Twoim zdaniem nie jest prawidłowym typem MIME, nie jest zarejestrowany, więc nie sądzę, aby załącznik mutt działał. Tylko dla potwierdzenia tej koncepcji możesz spróbować zainstalować pakiet obsługi mime (który zapewnia pliki binarne dostępu do plików mime, takie jak zobacz, edytuj itp.) I uruchomić zobacz przeciwko plikowi wirtualnemu (powiedzmy potoku), zobaczysz, że to robi nie rozpoznać tego. Podstawową kwestią jest to, że zwykle plik wirtualny przechowuje dane w pamięci, a nie na dysku, obiekt pliku jest tylko wskaźnikiem. Możesz nawet spróbować owinąć wirtualny plik za pomocą tar / gz i uszczęśliwić mutta, ale wątpię, czy uzyskasz coś przydatnego z drugiego końca ... :)
źródło