/ बिन / श स्रोत से स्टड (अन्य कार्यक्रम से) फ़ाइल नहीं


14

एक मुश्किल से एक यह नाम के लिए ...

मूल रूप से मेरे पास एक कार्यक्रम है जो शेल चरों के सेट पर STDOUT पर प्रिंट करता है:

$ ./settings
SETTING_ONE="this is setting one"
SETTING_TWO="This is the second setting"
ANOTHER_SETTING="This is another setting".

मैं इसे शेल स्क्रिप्ट के भीतर से चलाना चाहता हूं जैसे कि STDOUT के साथ मूल्यांकन किया जा रहा था source

मैं कुछ ऐसा करना चाहूंगा ...

source `./settings`

... लेकिन निश्चित रूप से यह काम नहीं करता है।

मुझे पता है कि मैं कर सकता था:

./settings >/tmp/file
source /tmp/file

लेकिन मैं वास्तव में ऐसा नहीं करना चाहता।

कोई सुराग?

जवाबों:


16

आप उपयोग कर सकते हैं eval:

eval "$(./settings)"

eval "`./settings`"

क्षमा करें, उल्लेख किया जाना चाहिए, यह / बिन / श नहीं मार है। $ () काम नहीं करता है। मैंने सवाल अपडेट किया है।
मैजेंको

@ मैट: खैर, श ज्यादातर सिस्टम पर बैश है। जब तक कि आप हाल के उबंटू संस्करणों का अर्थ नहीं करते, जहां इसे डैश से बदल दिया गया है।
हैलो71

@ मैट: उस स्थिति में, बैकटिक्स को काम करना चाहिए। लेकिन आपको इसके सटीक संस्करण को shभी जोड़ना चाहिए - यह डैश, ऐश, बिजीबॉक्स के लिए एक सहानुभूति हो सकती है ... मैंने "असली 'श'" लाइव की एक प्रति नहीं देखी है।
user1686

1
@Matt: तो आप एक ... दिलचस्प प्रणाली वहाँ मिल गया है। विशेष रूप से लगभग सभी "श" विविधताओं का समर्थन करते हैं $( )- 4.3BSD में अल्मक्विस्ट के खोल से शुरू होता है - और यह पॉसिक्स भी है। (नोट: बहस नहीं, बस जिज्ञासु।)
user1686

$ () मौजूद है, यह सिर्फ इस परिस्थिति में काम नहीं करता है। फ्रीबीएसडी 8.2 / बिन / श
माज़ेंको

15

जहाँ /dev/fdउपलब्ध सिस्टम पर , bash प्रक्रिया प्रतिस्थापन का समर्थन करता है:

source <(./settings)

यहां, <( )स्वचालित रूप से निर्दिष्ट पथ तक विस्तारित किया जाएगा /dev/fd/...जिसके तहत आउटपुट को ./settingsपढ़ा जा सकता है।


1
बैश मैनुअल में, इसे "प्रक्रिया प्रतिस्थापन" कहा जाता है।
ग्लेन जैकमैन

6
declare `./settings`

या बेशक ...

export `./settings`

इसे जरूर टेस्ट करें ...

export `echo -e "asdf=test\nqwerty=dvorak"` ; echo $asdf $qwerty

व्हाट्सएप को हैंडल करना:

eval export `./settings`

अहा, exportचाल काम करती है! धन्यवाद
Majenko

अब - मैं एक मान में रिक्त स्थान कैसे संभाल सकता हूं?
माजेंको

@ मैट: मैं टिप्पणियों में बैकटिक्स का उपयोग नहीं कर सकता, इसलिए कृपया संपादित उत्तर देखें।
user1686

@ ग्रेविटी: हाँ आप कर सकते हैं ...a backtick --> ` <-- and here's another one --> ` <--
हैलो raw१

2

source /dev/stdin < ./settings

मुझे लगता है कि / dev / stdin एक लिनक्स ही है, हालाँकि।


यह सेटिंग्स की सामग्री को स्रोत करने की कोशिश करता है। यहां तक ​​कि'//settings 'के साथ भी विफल रहता है ।/settings': Ambiguous ('= backtick)
Majenko

/dev/stdinBSD और Cygwin पर भी काम करता है।
user1686

1
उपयोग करना |, हालांकि, काम करने वाला नहीं है (कम से कम बिल्कुल नहीं), क्योंकि पाइप के दोनों किनारे अलग-अलग उपप्रकार हैं, इसलिए खट्टा आदेश वर्तमान शेल को प्रभावित नहीं करेगा।
user1686

1
उसे प्रतिबिंबित करने के लिए संपादित किया गया।
लॉरेंस

1
मुझे यह /dev/stdinचाल पसंद है , लेकिन आपका उत्तर वास्तव में source ./settingsइसे निष्पादित किए बिना एक सादे के बराबर है। इसे दूर करने के लिए यहां एक दस्तावेज़ का उपयोग किया जा सकता है source /dev/stdin <<EOF \n $(./settings) \n EOF:।
tlwhitec

0

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

Var1="Foo"
Var2="Bar"
Var3="Baz"

जब मैं स्क्रिप्ट को निष्पादित करने की तैयारी कर रहा हूं, मैं बेसलाइन उपरोक्त मल्टीलाइन स्ट्रिंग को एनकोड करता हूं और इसे मेरी शेल स्क्रिप्ट में पाइप करता हूं:

echo base64EncodedParameters | build.sh

Build.sh में मैं स्टडिन, बेस 64 डिकोड से पढ़ता हूं और परिणाम निकालता हूं।

params=""
while read line; do params="${params}${line}"; done
eval `echo $params | base64 -D`

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