2010-08-12 17 views
7

मैंने पाइप का उपयोग करके कमांड चलाने की कोशिश की।चर से स्क्रिप्ट कमांड कैसे चलाएं?

बेसिक:

single="ls -l" 
$single 

जो अपेक्षा के अनुरूप

पाइप्स काम करता है:

multi="ls -l | grep e" 
$multi 
ls: |: No such file or directory 
ls: grep: No such file or directory 
ls: e: No such file or directory 

... कोई आश्चर्य की बात

bash < $multi 

$multi: ambiguous redirect 
,210

अगले कोशिश

bash $multi 
/bin/ls: /bin/ls: cannot execute binary file 

केवल

echo $multi > tmp.sh 
bash tmp.sh 

काम किया।

निष्पादन के लिए स्क्रिप्ट बनाने के बिना अधिक जटिल कमांड निष्पादित करने का कोई तरीका है?

+0

सी [BashFAQ/050] (http://mywiki.wooledge.org/BashFAQ/050)। –

उत्तर

11

आप खोल और कर्नेल के बीच अंतर का प्रदर्शन कर रहे हैं।

"ls -l" सिस्टम execve() कॉल द्वारा निष्पादन योग्य है। विवरण के लिए आप man execve कर सकते हैं, लेकिन यह शायद आपके लिए बहुत अधिक जानकारी है।

"ls -l | grep e" को पाइप सेट अप करने के लिए खोल व्याख्या की आवश्यकता है। एक खोल का उपयोग किए बिना, '|' चरित्र को ls के लिए एक तर्क के रूप में निष्पादित() में पारित किया गया है। यही कारण है कि आप "ऐसी कोई फ़ाइल या निर्देशिका" त्रुटियां नहीं देखते हैं।

समाधान:

cmd="ls -l | grep e" 
bash -c "$cmd" 
+0

धन्यवाद, कोई विचार क्यों "bash -c" आउटपुट को एक पंक्ति में प्रिंट करता है? मैं कमांड लाइन पर मैन्युअल रूप से दर्ज के समान आउटपुट रखना चाहता हूं। – stacker

+0

@stacker मुझे नहीं लगता कि यह सच है।मुझे कमांड लाइन के समान परिणाम मिलते हैं। शायद आपका grep केवल एक लाइन लौट रहा है? – bukzor

+0

यह खुशी है क्योंकि मैं चरम कोट्स में चर को घेरना भूल गया था। – stacker

-3

जब आप पाइप के साथ आदेशों को चलाने के लिए, बस इसे चलाते हैं चाहता हूँ। आदेश को किसी चर में कभी न रखें और इसे चलाने का प्रयास न करें। सीधे शब्दों में निष्पादित यह

ls -l |grep

आप आउटपुट को कैप्चर करना चाहते हैं,()

var=$(ls -l |grep ..)

+0

आदेश एक अलग सर्वर से आओ और लक्ष्य मशीन पर निकाला जाना चाहिए। इस प्रकार यह कठिन कोडित नहीं किया जा सकता है। – stacker

+0

देखें http://mywiki.wooledge.org/BashFAQ/050 – ghostdog74

0

$ का उपयोग आप एक heredoc जरूरत इस सही ढंग से करने के लिए। POSIX compliant way to see if a function is defined in an sh script के उत्तर में, मैंने एक चर में एक स्क्रिप्ट को पढ़ने के तरीके का विस्तार किया है, प्रोग्रामेटिक रूप से जानकारी के लिए इसे पार्स करें और/या इसे आवश्यकतानुसार संशोधित करें, फिर इसे किसी अन्य स्क्रिप्ट या शैल फ़ंक्शन से निष्पादित करें। वह मूल रूप से आप क्या करने की कोशिश कर रहे हैं क्या, और heredoc बनाता है यह संभव है क्योंकि यह एक फ़ाइल वर्णनकर्ता प्रदान करता है:

% multi='ls -l | grep e' 
% sh <<_EOF_ 
> ${multi} 
> _EOF_ 
< desired output > 

कि आपके सरल उदाहरण मामले का समाधान होगा। अधिक के लिए मेरा दूसरा जवाब देखें।

-माइक

संबंधित मुद्दे