बैश कमांड आउटपुट से 'वर्चुअल फाइल' बनाएं?


36

मुझे आश्चर्य है कि अगर एक 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

क्या यह संभव है? यदि नहीं, तो क्यों?

यह शायद एक मूर्खतापूर्ण उदाहरण है और निश्चित रूप से ऐसा करने के लिए आसान तरीके हैं, लेकिन मुझे उम्मीद है कि यह एक अन्य कमांड के आउटपुट से एक आभासी फ़ाइल बनाने के बारे में मेरे प्रश्न की व्याख्या करता है।


1
मुझे काम नहीं मिला <() जब तक मुझे एहसास नहीं हुआ कि मैं बैश के बजाय श का उपयोग कर रहा हूं। यह बढ़िया काम कर रहा है। जब (यदि) मैं न्यूनतम आवश्यक प्रतिष्ठा तक पहुँचता हूं तो मैं उपयोगी प्रतिक्रियाओं को आगे बढ़ाऊंगा। सभी प्रतिक्रियाओं के लिए धन्यवाद।
पियरे

जवाबों:


53

यह वह सबसे साफ तरीका है जो आप करना चाहते हैं:

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

<()ऑपरेटर के लिए आप क्या पूछ रहे थे है; यह एक FIFO (या / dev / fd) बनाता है और एक प्रक्रिया की तलाश करता है और FIFO को FIFO से जोड़ता है। >()वही करता है, सिवाय इसके कि स्टड को FIFO के बजाय जोड़ता है। दूसरे शब्दों में, यह पर्दे के पीछे से आपके लिए सब कुछ करता है; या आधुनिक OS पर, इसे और भी बेहतर तरीके से करता है।

सिवाय इसके कि, म्यूट के साथ काम नहीं करता है, यह कहता है:

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

मुझे संदेह है कि समस्या फ़ाइल में तलाश करने की कोशिश कर रही है, जिसे आप किसी भी प्रकार के पाइप पर नहीं कर सकते। खोज करने के लिए फ़ाइल को स्कैन करना संभव है कुछ ऐसा है जैसे कि MIME टाइप क्या है और कौन सा एन्कोडिंग काम कर सकता है (यानी, फ़ाइल 7bit या 8bit है), और फिर फ़ाइल की शुरुआत में इसे वास्तव में संदेश में एनकोड करने की मांग करना ।

यदि आप जो भेजना चाहते हैं वह सादा पाठ है, तो आप इसे ईमेल की मुख्य सामग्री बनाने के लिए हमेशा कुछ ऐसा कर सकते हैं (आदर्श नहीं, लेकिन यह वास्तव में काम करता है):

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

2
बहुत बढ़िया! मैं पहली बार इस तरह के पुनर्निर्देशन को देख रहा हूं।
सौरभ बड़जात्या

अच्छी व्याख्या के लिए धन्यवाद! मैंने इसे पहले कभी नहीं देखा है, आई / ओ पुनर्निर्देशन के किसी भी ट्यूटोरियल में।
क्रिश्चियन मान

4

मुझे लगता है कि आप जिस चीज़ की तलाश कर रहे हैं वह एक फेनो है mknod

mknod /tmp/foo p

echo hello > /tmp/foo &

cat /tmp/foo

ध्यान दें, यदि कोई पढ़ने की प्रक्रिया नहीं है, तो लेखन प्रक्रिया अवरुद्ध हो जाएगी।

जैसे

mknod /tmp/foo p

mysqldump mysqldumpoptions > /tmp/foo &

mutt -a /tmp/foo

1

क्या लगाव होना जरूरी है? यदि यह एक संदेश के शरीर के रूप में दिखाई दे सकता है (7-बिट स्वच्छ एससीआई, इसमें सम्‍मिलित नहीं है। '' एक लाइन पर अपने आप को, आदि), तो ऐसा कुछ काम करेगा:

mysqldump mysqldumpoptions | mutt -s "आज का mysql डंप" admin@example.org


1

आप /dev/stdinम्यूट के साथ फ़ाइल नाम का उपयोग करने में सक्षम हो सकते हैं , जो इसके स्टड से पढ़ा जाएगा।

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

हम्म, मैंने अभी-अभी यह कोशिश की और शिकायत की:

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

ओह अच्छा। मुझे लगता है कि यह आपके सवाल का जवाब देता है, हालांकि -aविकल्प के साथ म्यूट एक नियमित फ़ाइल की अपेक्षा करता है, जिसका अर्थ है कि डिवाइस या पाइप नहीं।


1

एक फीफो शायद सबसे अच्छा तरीका है। हालाँकि आप mkfifo /path/to/fifoइसके बजाय उपयोग कर सकते हैं


0

मुझे यहाँ कुछ याद आ रहा है, लेकिन जब यह / usr / sbin / sendmail (या जहाँ यह आपके डिस्ट्रो पर रहता है) के लिए नौकरी की तरह लगता है तो म्यूट का उपयोग क्यों करें?

mysqldump mysqldumpoptions | sendmail admin@example.org

अधिकांश यूनिक्स एमटीए एक / usr / sbin / sendmail कमांड प्रदान करते हैं, और वे सभी को अधिक-या-कम समान विकल्पों को समझते हैं और उसी तरह कम-से-कम काम करते हैं। लगभग सभी मामलों में, आपको यह ध्यान रखने की आवश्यकता नहीं है कि आपके द्वारा उपयोग किए जा रहे Sendmail का कौन सा विशेष MTA / कार्यान्वयन है।

मेल / mailx सहित कई अन्य विकल्प भी हैं


1
तब यह एक लगाव नहीं है, जो प्राप्तकर्ता के लिए उपयोग करने के लिए कठिन होने की संभावना है
freiheit

1
उस स्थिति में, एक बेहतर समाधान होगा कि आप मेटामेल (1) या माइम-कंस्ट्रक्शन (1 पी) जैसे उपकरण का उपयोग करें या पर्ल एमएमईई जैसे कुछ का उपयोग करके अपना स्वयं का लेखन करें :: लाइट मॉड्यूल (मेरा व्यक्तिगत पसंदीदा क्योंकि यह करना आसान बनाता है सबसे आम माइम से संबंधित चीजें)।
कैस

0

Mutt -a विकल्प विशेष रूप से /etc/mime.types पर परिभाषित MIME प्रकारों का उपयोग करता है। वर्चुअल फ़ाइल प्रकारों में से कोई भी नहीं जो आपको लगता है कि वास्तव में एक वैध माइम प्रकार पंजीकृत है, इसलिए मुझे नहीं लगता है कि म्यूट अटैचमेंट काम करेगा। बस अवधारणा के प्रमाण के लिए, आप माइम-सपोर्ट पैकेज स्थापित करने का प्रयास कर सकते हैं (जो माइम फ़ाइल एक्सेस बायनेरी जैसे कि व्यू, एडिट आदि) प्रदान करता है और वर्चुअल फाइल (पाइप कहो) के खिलाफ रन देखें, आप देखेंगे कि यह करता है इसे पहचाना नहीं। मूल मुद्दा यह है कि आम तौर पर एक आभासी फ़ाइल मेमोरी में डेटा सामग्री रखती है, डिस्क पर नहीं, फ़ाइल ऑब्जेक्ट सिर्फ एक पॉइंटर है। तुम भी टार / gz के साथ एक आभासी फ़ाइल लपेटो कोशिश कर सकते हैं और उत्परिवर्ती खुश कर सकते हैं, लेकिन मुझे शक है कि आप दूसरे छोर से उपयोगी कुछ भी मिलेगा ... :) :)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.