फ़ाइल की अपेक्षा करने के लिए पाठ पास करें


30

स्टैक ओवरफ्लो पर पूछे गए एक प्रश्न से संबंधित: कोड की कई पंक्तियों को wsadmin.sh में पास करना?

मेरे पास एक स्ट्रिंग के रूप में, इनपुट की कुछ पंक्तियाँ हैं जिन्हें मुझे एक कमांड में फीड करने की आवश्यकता है। हालाँकि, कमांड केवल इनपुट से भरी फाइल को स्वीकार करता है।

क्या कोई रास्ता है जो मैं एक अस्थायी फ़ाइल या पाइप में लाइनों को स्टोर कर सकता हूं जो वास्तव में डिस्क पर कभी नहीं लिखा जाता है और फिर उस प्रोग्राम में सीधे फ़ीड करता है?

मैं पाइप को प्राप्त करने के बारे में कैसे जाता हूं, इसमें इनपुट खिलाता हूं, उस पाइप को कमांड में पास करता हूं, और फिर पाइप से छुटकारा पाता हूं?


2
क्या आप अपने द्वारा उपयोग किए जा रहे कमांड का एक उदाहरण जोड़ सकते हैं, और इसे कैसे लागू किया जाना चाहिए?
ब्रेकथ्रू

2
क्या इसका मतलब यह है कि कार्यक्रम स्टैडिन को स्वीकार नहीं करता है?
लेओ लाम

मैं उपरोक्त दोनों टिप्पणीकारों से सहमत हूं। कार्यक्रम की ऐनक को जाने बिना कुछ भी सुझाना असंभव है।
लार्सेंड

जवाबों:


27

एक और उपाय उपयोग करना है , बश में प्रोसेस सब्स्टीट्यूशन । यदि आपके सिस्टम ने पाइप का नाम दिया है, तो आप इस सुविधा का उपयोग कर सकते हैं।

यह इस तरह प्रयोग किया जाता है:

program_expecting_a_file <(list)

जहां listशेल कमांड का एक अनुक्रम है (वास्तव में पाइपलाइन; पूर्ण विवरण यहां हैं )। listनिष्पादित किया जाएगा, और इसका आउटपुट पाइप से जुड़ा होगा। पाइप का नाम तब आपके प्रोग्राम में दिया जाता है।

नोट: रिक्त स्थान के बीच अनुमति नहीं है <और(

(अन्य प्रतिस्थापन >(list)भी आपकी अपेक्षा के अनुसार काम करता है।)

अपने विशिष्ट मामले में, आप उपयोग कर सकते हैं

program_expecting_a_file <(echo "$your_strings")

हालाँकि आपको @ meuh का समाधान अधिक सुरुचिपूर्ण लग सकता है।

अपडेट: उन्नत बैश स्क्रिप्टिंग गाइड में कई बेहतरीन उपयोग उदाहरणों पर पाए जाने हैं ।


अन्य दो मामलों के सबसे तुच्छ मामलों में भी काम नहीं किया। तुम्हारा अब तक मेरे द्वारा फेंके गए परीक्षणों को पास करता है। मैंने तुम्हारा अभी तक उत्थान किया है। मैं वापस आऊंगा और इसे स्वीकार करूंगा कि अगर मुझे हर चीज की जरूरत है तो इसे स्वीकार किया जाएगा।
ArtOfWarfare

तुम्हारी पूरी तरह से काम करता है। यदि आप चाहें, तो आप इसे StackOverflow पर संबंधित प्रश्न में जोड़ सकते हैं और मैं इसे वहाँ पर भी स्वीकार कर सकता हूँ। stackoverflow.com/questions/31374202/…
ArtOfWarfare

हाय @ArtOfWarfare, मदद की खुशी है। वहाँ एक ही प्रस्तावित समाधान के साथ पहले से ही एक टिप्पणी है, इसलिए मेरे लिए वहां एक उत्तर पोस्ट करना सही नहीं होगा।
एडवर्ड

आपने अपना समाधान पोस्ट करने से पहले किया। वैसे भी, मैंने उसे अपनी टिप्पणी को एक उत्तर में बदलने के लिए कहा है ताकि मैं इसे स्वीकार कर सकूं। यदि आप में से कोई भी उस प्रश्न पर ~ 24 घंटे के भीतर उत्तर पोस्ट नहीं करता है, तो मैं बस उत्तर खुद पोस्ट करूंगा, इसलिए मैं इसे स्वीकार कर सकता हूं (मुझे अपने सवालों को छोड़ना पसंद नहीं है क्योंकि एक बार मैंने पाया है कि उत्तर क्या है। भविष्य के पाठकों / प्रश्न के संभावित उत्तर देने वालों के लिए सिर्फ बुरा व्यवहार।)
आर्टऑफवर्फ

हाय @ArtOfWarfare, आप जो प्रस्ताव देते हैं उससे मैं बिल्कुल ठीक हूँ!
एडवर्ड

15

आप यहाँ bash -doc का उपयोग कर सकते हैं । उदाहरण के लिए,

$ cat -n <<<'a
> b'
 1  a
 2  b

यदि आपके पास बैश वैरिएबल में कुछ है तो आप इसे इंटरपोलेट भी कर सकते हैं: उदा <<<"path is $PATH"


यदि आपका आदेश एक फ़ाइल नाम पर जोर देता है, तो आप इसे दे सकते हैं /dev/stdin। उदाहरण के लिए:

$ sed -f /dev/stdin <<<'s/a/b/'

उत्पादन का उत्पादन s/b/b/:।


यह इस सवाल से स्पष्ट नहीं है कि क्या कमांड इनपुट को स्वीकार करता है stdin, और यदि नहीं, तो यह काम नहीं करेगा। मुझे उम्मीद है कि ओपी स्पष्ट करेगा।
डेविड जेड

1
:( - यह सुपर होनहार लग रहा था, लेकिन जब मैंने इसे आज़माया, तो मुझे त्रुटि संदेश मिला"-f" option must be followed by a file name.
ArtOfWarfare

स्टड के लिए यहाँ एक डॉक्टर है। यदि आपकी आज्ञा पूरी तरह से -fऔर एक फ़ाइल नाम की आवश्यकता है , तो फ़ाइल नाम प्रदान करें /dev/stdin। मेरा संपादन देखें।
मयूह

मुझे लगता है कि संपादन के बाद यह बिल्कुल एक व्यवहार्य विकल्प है!
एडवर्ड

1
/dev/stdinसुझाव के लिए +1 । जिस प्रोग्राम को मैं कॉल करने की कोशिश कर रहा हूं वह केवल एक फ़ाइल नाम को स्वीकार करता है, इसलिए मैंने /dev/stdinएक हेरेडोक के साथ जोड़ा है ।
हू वाल्टर्स

7

स्क्रिप्ट में क्या है, इसके आधार पर, आप विशेष फ़ाइल नाम - (माइनस) का उपयोग करने में सक्षम हो सकते हैं , जो स्टड के लिए खड़ा है

$ mycmd -
Line 1
Line 2
^D

एक अन्य विधि जो आपके लिए काम कर सकती है वह है फ़ाइल /dev/fd/0को फिर से खोलना जो स्टैड के लिए है ।

तीसरा विकल्प FIFO (फर्स्ट इन फर्स्ट आउट) बनाना हो सकता है । यह एक फ़ाइल की तरह है, लेकिन इसके दो छोर हैं - आप एक छोर पर लिखते हैं और दूसरे से पढ़ते हैं।

-- Process 1 --                  -- Process 2 --
$ mkfifo foo
$ cat foo
<waits>                          $ echo hello > foo
hello                            $
$ rm foo

3
यह ध्यान देने योग्य हो सकता है कि प्रोग्राम को -इस तरह व्याख्या करने के लिए लिखा जाना है - यह शेल या ऑपरेटिंग सिस्टम की विशेषता नहीं है। हालांकि अधिकांश मानक लिनक्स उपयोगिताओं इस सम्मेलन का पालन करते हैं, जहां तक ​​मुझे पता है।
डेविड जेड

1
नहीं। यह कार्यक्रम के लिए काम नहीं करता है। एक इंटरैक्टिव मोड है, लेकिन मैं इस प्रोग्राम को किसी अन्य प्रोग्राम से निष्पादित करने के लिए कमांड पास करना चाहता हूं, और मैं खरगोश-छेद में नहीं जाना चाहता expect
ArtOfWarfare

@ArtOfWarfare मैंने अभी एक तीसरा विकल्प जोड़ा है जो काम कर सकता है।
मैजेन्को

अच्छा जवाब! दूसरा और तीसरा विकल्प मूल रूप से <()समाधान की तरह हैं, लेकिन अधिक स्पष्ट - जो बहुत उपयोगी हो सकता है!
एडवर्ड

4

mycmd -समाधान के समान एक और विकल्प है , लेकिन यहां तक ​​कि उन कार्यक्रमों के लिए भी जो -विशेष रूप से संभाल नहीं करते हैं :

$ mycmd /dev/stdin
Line 1
Line 2
^D

/dev/stdin प्रतीत होता है कि ओएस-संबंधी और यह मेरे लिए डेबियन जीएनयू / लिनक्स पर काम करता है, लेकिन मुझे यकीन नहीं है कि यह कहां काम करेगा।


1
ऐसा लगता है कि यह काम कर सकता है, लेकिन क्या है ^D?
ArtOfWarfare

^DCtrl-D दबाने के लिए एक सामान्य अंकन है। ^ D के पास "इनपुट स्ट्रीम के अंत" का शब्दार्थ है। यह शायद अधिक बार देखा जाता है ^Cया ^Zजो Ctrl-Z दबाने के लिए क्रमशः Ctrl-C दबाने के लिए खड़े होते हैं।
एक्सल बेकर्ट

1
यह काम करने लगता है, लेकिन मैं कैसे प्रोग्रामेटिक रूप से सामान डालूंगा /dev/stdinऔर फिर इसे बंद कर दूंगा?
ArtOfWarfare

1
बस उस कमांड में कुछ पाइप करें और यह काम करना चाहिए, अर्थात cat content | mycmd /dev/stdin। बस catयहां से अलग-अलग कमांड की कल्पना करें।
एक्सल बेकर्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.