एक स्क्रिप्ट को "पढ़ने" के साथ बैश करने के लिए


10

मैं इसे माध्यम से पाइप द्वारा एक स्क्रिप्ट चलाने की जरूरत bashके साथ wget(बजाय इसे सीधे चल बैश के साथ)।

$ wget -O - http://example.com/my-script.sh | bash

यह काम नहीं कर रहा है क्योंकि मेरी स्क्रिप्ट में इसके readकथन हैं। किसी कारण से ये काम नहीं करते हैं जब पाइपिंग को कोसने के लिए:

# Piping to bash works in general
$ echo 'hi'
hi
$ echo "echo 'hi'" | bash
hi

# `read` works directly
$ read -p "input: " var
input: <prompt>

# But not when piping - returns immediately
$ echo 'read -p "input: " var' | bash
$

input:इसे रोकने और इसके बदले में वैसा ही मूल्य मांगने के बजाय , रीड कमांड को बस पास होना चाहिए bash

किसी को पता है कि कैसे मैं यह कर सकते हैं पाइप के साथ एक स्क्रिप्ट readके लिए bash?

जवाबों:


16

readमानक इनपुट से पढ़ता है। लेकिन बैश प्रक्रिया का मानक इनपुट पहले से ही स्क्रिप्ट द्वारा लिया गया है। शेल पर निर्भर करता है, या तो readकुछ भी नहीं पढ़ेगा क्योंकि शेल पहले ही पूरी स्क्रिप्ट को पढ़ और पार्स कर चुका है, या readस्क्रिप्ट में अप्रत्याशित लाइनों का उपभोग करेगा।

सरल समाधान:

bash -c "$(wget -O - http://example.com/my-script.sh)"

अधिक जटिल समाधान, इस विशेष परिदृश्य के लिए एक अच्छे समाधान का वर्णन करने के लिए शिक्षा के उद्देश्यों से अधिक:

echo '{ exec </dev/tty; wget -O - http://example.com/my-script.sh; }' | bash

बहुत अच्छे धन्यवाद। यह लगभग सुरुचिपूर्ण है।
रोबिन विंसलो

2

प्रक्रिया प्रतिस्थापन आप क्या चाहते हैं:

bash <(wget ...)

उन्होंने कहा, मुझे यहां आपकी प्रेरणा पर सवाल उठाना है। यदि आप वेबसर्वर को नियंत्रित करते हैं (और https का उपयोग करते हैं) तो शायद यह समझ में आए। लेकिन सिर्फ इंटरनेट ब्लाइंड से स्क्रिप्ट चलाना बहुत जोखिम भरा है।


just running a script from the internet blind is very risky- ऐ हम जानते हैं कि यह जोखिम भरा है, लेकिन लोग कुछ संगठनों से स्क्रिप्ट पर भरोसा कर सकते हैं। @ Xen2050 के उत्तर पर टिप्पणियों में चर्चा देखें।
रोबिन विंसलो

1

क्या कुछ गड़बड़ है:

wget -O tmpscript.sh http://example.com/my-script.sh
chmod +x tmpscript.sh
tmpscript.sh

?


'क्योंकि तब मुझे एक फाइल बनानी होगी। मेरा मतलब है कि यह काम करेगा, यह थोड़ा गड़बड़ है।
रोबिन विंसलो

1
सच। यद्यपि यह उपयोग करने का एक अच्छा कारण है /tmp, बहुत सारे प्रोग्राम अस्थायी फ़ाइलों का उपयोग करते हैं। मैं किसी भी डाउनलोड की गई स्क्रिप्ट को तुरंत पहले देखने के बिना चलाने की
कोशिश करूँगा

अच्छा तो यह है कि तुम्हारी पुकार है। बहुत सारी परियोजनाएँ इन वन-लाइनर्स की पेशकश करती हैं, उदाहरण के लिए डॉकर , ओमेज़्ज़श और अन्य जिन्हें मैं अभी याद नहीं कर सकता। इस मामले में यह एक सेटअप स्क्रिप्ट है जिसे मैं अपने स्वयं के भंडार से नई प्रणालियों पर चलाना चाहता हूं। मैं इसकी सामग्री के बारे में बहुत चिंतित नहीं हूं, जैसा कि मैंने इसे लिखा था।
रोबिन विंसलो

3
मैं किसी और के बारे में सोच रहा हूँ इस सवाल (एक पूरी तरह से नया उपयोगकर्ता शायद) किसी भी बेहतर पता नहीं हो सकता है।
1:20 बजे Xen2050
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.