मैं अच्छी तरह से source(उर्फ .) उपयोगिता से अवगत हूं , जो एक फ़ाइल से सामग्री ले जाएगा और उन्हें मौजूदा शेल के भीतर निष्पादित करेगा।
अब, मैं कुछ पाठों को शेल कमांड में बदल रहा हूं, और फिर उन्हें निम्न प्रकार से चला रहा हूं:
$ ls | sed ... | sh
lsकेवल एक यादृच्छिक उदाहरण है, मूल पाठ कुछ भी हो सकता है। sedभी, केवल पाठ को बदलने के लिए एक उदाहरण। दिलचस्प बिट है sh। मुझे जो कुछ भी मिला मैं उसे पाइप करता हूं shऔर इसे चलाता है।
मेरी समस्या है, इसका मतलब है कि एक नया उप शेल शुरू करना। मैं बल्कि अपने वर्तमान शेल के भीतर कमांड चलाना चाहता हूं। जैसे मैं source some-fileएक पाठ फ़ाइल में आज्ञाओं के साथ कर सकता हूं।
मैं एक अस्थायी फ़ाइल नहीं बनाना चाहता क्योंकि गंदा लगता है।
वैकल्पिक रूप से, मैं अपने वर्तमान शेल के समान सटीक विशेषताओं के साथ अपना उप शेल प्रारंभ करना चाहूंगा।
अपडेट करें
ठीक है, बैकटीक का उपयोग करने वाले समाधान निश्चित रूप से काम करते हैं, लेकिन मुझे अक्सर ऐसा करने की आवश्यकता होती है जब मैं जाँच कर रहा हूं और आउटपुट बदल रहा हूं, इसलिए मैं बहुत पसंद करूंगा यदि परिणाम को अंत में किसी चीज में पाइप करने का कोई तरीका हो।
दुखद अद्यतन
आह, /dev/stdinबात बहुत सुंदर लग रही थी, लेकिन, एक अधिक जटिल मामले में, यह काम नहीं किया।
तो, मेरे पास यह है:
find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/git mv -f $1 $2.doc/i' | source /dev/stdin
यह सुनिश्चित करता है कि सभी .docफाइलों का विस्तार कम हो।
और जो संयोगवश, के साथ संभाला जा सकता है xargs, लेकिन वह बिंदु के अलावा है।
find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/$1 $2.doc/i' | xargs -L1 git mv
इसलिए, जब मैं पूर्व भागता हूं, तो यह तुरंत बाहर निकल जाएगा, कुछ भी नहीं होता है।