फ़ीड स्रोत कमांड एक पाइप के साथ


25

पहले मैंने sourceइस तरह कमांड का उपयोग किया था:

source file_name

लेकिन मैं यह करने की कोशिश कर रहा हूं:

echo something | source

जो काम नहीं करता है।

जवाबों:


38

चूंकि source(या .) एक फ़ाइल को तर्क के रूप में लेता है, आप कोशिश कर सकते हैं:

source <(echo something)

1
काम किया, धन्यवाद। और नव वर्ष की शुभकामनाएँ!
डेसमंड ह्यूम

@ ममरू यह बहुत अच्छा काम करता है। ध्यान दें कि "| source / dev / stdin" में काम करने की उपस्थिति है, लेकिन यह वास्तव में सभी चर असाइनमेंट को छोड़ देगा। यकीन नहीं है कि क्यों। सिद्धांत में ठोस लगता है। यह पागलपन है।
डस्टिन ऑप्रे

2
@DustinOprea पाइप एक सबस्क्रिप्शन बनाते हैं, इसलिए वे सभी चर असाइनमेंट कभी भी पैरेंट शेल को प्रभावित नहीं करते हैं।
मूरू

8

आपके स्रोत कमांड को एक फ़ाइल तर्क की आवश्यकता है। आप एक प्रक्रिया प्रतिस्थापन के साथ कुछ गोले में प्राप्त कर सकते हैं, और इसका कारण यह है कि इसी तरह से खोल प्रतिस्थापित करता है ...

arg=$(echo hi)

... echoवहाँ सब-कमांड के आउटपुट के साथ कमांड-लाइन पर बिट, प्रक्रिया प्रतिस्थापन के मामले में यह उप-नाम को एक फ़ाइल के साथ बदल देता है - आमतौर पर /dev/fd/62या कुछ - एक फ़ाइल-डिस्क्रिप्टर के लिए कुछ लिंक। एक पाइप के साथ फाइल डिस्क्रिप्टर 0 है ...

echo 'echo hi' | . /dev/fd/0

... /dev/stdinया जैसा भी मामला हो सकता है किसी भी लिनक्स सिस्टम पर ठीक काम करना चाहिए - और इसके अलावा कई अन्य। आप यहाँ भी इसी तरह के दस्तावेजों का उपयोग कर सकते हैं:

. /dev/fd/3 3<<HI
$(echo 'echo hi')
HI

आप अपने शेल को प्रोसेस प्रतिस्थापन के तरीके को सत्यापित कर सकते हैं, जिस तरह से:

(set -x; readlink <(:))

... जो प्रिंट (में bash) :

+ set +x
+ readlink /dev/fd/63
++ :
pipe:[2212581]

... और इसलिए हम देख सकते हैं कि शेल प्रतिस्थापन कर रहा है और readlinkएक एनोमी पाइप से पढ़ रहा है जो फ़ाइल-डिस्क्रिप्टर 63 पर खुलता है।

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