EOF का उपयोग किए बिना एक बैश स्क्रिप्ट से स्वचालित इनपुट को स्वचालित करना


10

मैं उबंटू लिनक्स चला रहा हूं। मान लीजिए कि एक कार्यक्रम कहा जाता है myprogram। यह कार्यक्रम उपयोगकर्ता को इनपुट के लिए संकेत देता है; विशेष रूप से, उपयोगकर्ता को एक पूर्णांक लिखना चाहिए जब संकेत दिया जाए और दबाएं Enter। मैं एक बैश स्क्रिप्ट का उपयोग करके इस प्रक्रिया को स्वचालित करना चाहूंगा। विशेष रूप से, मैं कहना चाहूंगा myprogram, 100 बार (एक काउंटर का उपयोग करके iजो कि जाता 1है 100)। के प्रत्येक निष्पादन पर myprogram, मैं iसंकेत दिए जाने पर वर्तमान मूल्य दर्ज करना चाहूंगा ।

(वैसे, myprogramविकल्प / स्विच लेता है -options, जो सभी स्थिर होंगे और इस प्रकार बैश स्क्रिप्ट के भीतर निर्दिष्ट किए जाएंगे।)

इस बैश स्क्रिप्ट का एक अधूरा कंकाल हो सकता है:

#!/bin/bash
for i in {1..100}
do
   myprogram -options
done

अब मैं उपरोक्त कोड को संशोधित करना चाहूंगा ताकि iकार्यक्रम द्वारा संकेत दिए जाने पर वर्तमान मूल्य में प्रवेश किया जा सके। इसे करने का बेहतरीन तरीका क्या है?

सॉफ्टवेयर मैं उपयोग कर रहा हूँ की वेबसाइट से पता चलता है का उपयोग कर <<EOFके अंत में myprogram -optionsलाइन। मुझे लगता है कि यह इनपुट के लिए "फाइल के अंत" को देखने के लिए बैश बताता है। लेकिन क्या होगा अगर मैं फ़ाइल के अंत में इनपुट नहीं रखना चाहता ? क्या होगा अगर मैं इसे तुरंत <<या उसके बाद रखना चाहूंगा <?

कारण यह है कि चीजें अधिक जटिल हो जाएंगी। उदाहरण के लिए, मैं एक पूर्णांक काउंटर पेश कर सकता हूं jजो कुछ गैर-रैखिक, गैर-अनुक्रमिक तरीके से बदलता है। मैं तो के वर्तमान मूल्य को खिलाने के लिए चाहते हो जाएगा jकरने के लिए myprogramप्रत्येक यात्रा पर है, लेकिन का मूल्य jकरने के लिए कॉल के बीच बदल सकता है myprogram -optionsऔर फ़ाइल के अंत EOF

क्या तुम्हारे पास कोई सुझाव है?


जवाबों:


14

लगभग सभी कार्यक्रमों के लिए, दोनों को काम करना चाहिए echo $i | myprogram -optionsऔर मानक इनपुट के माध्यम से myprogram -options <<<$iकार्यक्रम को खिलाना चाहिए $i

<fooफ़ाइल की सामग्री fooको स्टडिन के रूप में उपयोग करेगा ।

<<fooउस और एक लाइन के बीच पाठ का उपयोग करेगा जिसमें पूरी तरह से fooमानक इनपुट शामिल है। यह यहां एक दस्तावेज (हेरेडोक) है, जैसा कि गिल्स ने कहा; EOFवास्तव में फ़ाइल के अंत का मतलब यह नहीं है, यह सिर्फ एक सामान्य वंशानुगत अपराधी है (हम इस उदाहरण में इसके बजाय "फू" का उपयोग करते हैं)।

<<<fooमानक इनपुट के रूप में स्ट्रिंग "फू" का उपयोग करेगा। आप एक चर भी निर्दिष्ट कर सकते हैं $foo, और शेल अपनी सामग्री का उपयोग स्टड के रूप में करेगा, जैसा कि मैंने ऊपर दिखाया। इसे एक हेस्टिंग्रिंग कहा जाता है , क्योंकि यह एक पूरे ब्लॉक के विपरीत एक शॉर्ट स्ट्रिंग का उपयोग करता है, जैसा कि एक हेरेडोक में होता है। बगुला बाश में काम करता है, लेकिन अंदर नहीं /bin/sh


9

इस वेबसाइट द्वारा सुझाए गए सिंटैक्स को यहाँ दस्तावेज़ कहा जाता है । फ़ाइल प्रोग्राम का इनपुट लाइन वाले लाइन के ठीक नीचे शुरू होता है <<EOF, और यह स्क्रिप्ट के अंत तक समाप्त नहीं होता है, लेकिन वास्तव में टेक्स्ट वाली लाइन के द्वारा EOF(अतिरिक्त व्हाट्सएप का ख्याल न रखें)। वैसे, आप किसी भी अंतिम मार्कर का उपयोग कर सकते हैं जिसमें कोई विशेष शेल EOFनहीं है : यह एक कीवर्ड नहीं है, यह केवल पारंपरिक है।

#!/bin/bash
for i in {1..100}
do
   myprogram -options <<EOF
$i
EOF
   for j in {1..42}; do
     myprogram2 <<EOF
$i
$j
EOF
   done
done

दूसरे शब्दों में, इस संदर्भ में ईओएफ का मतलब है एक अंत-फ़ाइल मार्कर , न कि स्क्रिप्ट फ़ाइल का वास्तविक अंत। पाठ "EOF" कोई भी मनमाना पाठ है - << वर्णों के तुरंत बाद आप जो भी उपयोग करते हैं वह यहाँ-अब दस्तावेज़ के अंत का संकेत देगा। मैं आमतौर पर उपयोग EOF क्योंकि यह बाहर खड़ा है और बहुत herenow दस्तावेज़ अगर, उदाहरण के लिए, मैं प्रोग्राम के रूप जेनरेट कर रहा हूँ खोल स्क्रिप्ट (जो मैं अक्सर करते हैं) के अंदर होने की संभावना नहीं है।
कैस

बोल्ड किए गए ईओएफ को <अंडरस्कोर> <अंडरस्कोर> ईओएफ <अंडरस्कोर> <अंडरस्कोर>
कैस

इस तरह के दस्तावेजों का उपयोग करते हुए, मैंने अक्सर अंतिम मार्कर को कुछ अधिक सार्थक (और "बेतरतीब ढंग से" मिलान किए जाने की संभावना कम) में बदल दिया है, जैसे END_OF_WHATEVER_FUNCTION। कभी-कभी, अंतरिक्ष / आकार को "बचाने" की कोशिश करना वास्तव में प्रयास की बर्बादी है क्योंकि यह वास्तव में जो हो रहा है उसके रूप में अस्पष्टता का कारण बनता है।
हत्यारोपी

sleepस्क्रिप्ट से पढ़ी गई आज्ञाओं के बीच आप कैसे हो सकते हैं ?

@ अप्रत्याशित 62 मुझे समझ नहीं आ रहा है कि आप क्या पूछ रहे हैं। आपको इस साइट पर एक नया प्रश्न पूछना चाहिए। पर्याप्त संदर्भ देना सुनिश्चित करें।
गिल्स एसओ- बुराई को रोकना '

3

यहां केविन और गाइल्स दोनों द्वारा उल्लिखित दस्तावेज़, या सरल पाइपिंग कई मामलों में काम करेंगे।

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

Expect और इसी तरह के टूल का सामान्य विचार प्रोग्राम के आउटपुट में एक निर्दिष्ट स्ट्रिंग या पैटर्न की प्रतीक्षा करना है, और फिर जो इनपुट चाहते हैं, उसे फीड करें।

एक सामान्य उदाहरण का उपयोग लॉगिन को स्वचालित करने के लिए है, "उम्मीद" (यानी "स्ट्रिंग" ओगिन: "की प्रतीक्षा करके, लॉगिन-नाम भेजें, फिर स्ट्रिंग" शब्द: "की उम्मीद करें और पासवर्ड भेजें।

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

... और अपने पैच को मायप्रोग्राम बैक अपस्ट्रीम में सबमिट करना न भूलें :) भले ही वे जिस तरह से आपको इसे कोडित करने के तरीके को पसंद नहीं करते हैं, वे स्वयं को जोड़ने के लिए पर्याप्त विचार पसंद कर सकते हैं। अपस्ट्रीम देवता उन लोगों की सराहना करते हैं जो अपने चूतड़ से उतरते हैं और मांग या शिकायत के बजाय योगदान करते हैं।

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