इको / बिन / श-सी इको फू आउटपुट कुछ भी क्यों नहीं कहा जाता है?


15

उदाहरण के लिए, जबकि यह काम करता है:

$ इको फू
foo

यह नहीं है:

$ / बिन / श-सी गूंज फू

जबकि यह करता है:

$ / बिन / श-सी 'गूंज फू; इको बार '
foo
बार

क्या कोई स्पष्टीकरण है?

जवाबों:


21

से man sh

-c string   If the -c option is present, then commands are read from string. 
            If there are arguments after the string, they are assigned to the
            positional parameters, starting with $0

इसका अर्थ है कि आपकी आज्ञा इस प्रकार होनी चाहिए:

 $ sh -c 'echo "$0"' foo 
 foo

इसी तरह:

$ sh -c 'echo "$0 $1"' foo bar
foo bar

यह समझने के लिए पहला भाग था; दूसरा मामला सरल है और मुझे स्पष्टीकरण की आवश्यकता नहीं है, मुझे लगता है।


2
एक सख्त, मानक अनुरूप तरीका होगाsh -c 'echo $1' echo foo
jlliagre

1
sh -c 'echo "$@"' fnord a b c d ...
zwol

3
IMHO स्पष्टीकरण काफी अच्छा था, लेकिन sh -c 'echo $0' fooसबसे अच्छा विकल्प नहीं है, यह ध्यान में रखते हुए कि प्रश्नकर्ता पहले से ही जानता है कि /bin/sh -c 'echo foo; echo bar'काम करता है, आप बस कमांड का जवाब देने का जवाब दे सकते हैं/bin/sh -c 'echo foo'
X3MBoy

1
@ X3MBoy प्रश्नकर्ता पहले से ही जानता है कि / बिन / श-सी 'इको फू' ठीक काम करता है। वह उसके बाहर कुछ प्रतिध्वनित करना चाहता था, जिसे मैंने समझाया
एजाज़ अहमद खान

18
$ echo foo
foo

यह echoतर्क फू और फू के साथ कॉल मुद्रित है।

$ /bin/sh -c echo foo

यह तर्क के साथ शेल को आमंत्रित echoकरता है और तर्क के रूप में फू प्रदान करता है $0echoएक नई लाइन आउटपुट और आप त्यागने foo । यदि आप फू का उत्पादन करना चाहते हैं , तो तर्क को उद्धृत करें:

sh -c 'echo foo'

या दिए गए तर्क का उपयोग करें:

sh -c 'echo $0' foo

इस उदाहरण में

$ /bin/sh -c 'echo foo; echo bar'
foo
bar

शेल को तर्क के साथ लागू किया जाता है echo foo; echo barजो आउटपुट देता है

foo
bar

8

इस आदेश में:

echo foo

echoद्विआधारी (या अंतर्निहित कमांड) है और fooपहला तर्क है।

यहाँ:

/bin/sh -c echo foo

/bin/shद्विआधारी, जिसका पहला तर्क है -c, जो खुद को पैरामीटर के रूप में "कमांड स्ट्रिंग" स्वीकार करता है। यह echoउपरोक्त उदाहरण में है। फिर एक तीसरा तर्क है: fooजो एक तर्क है /bin/sh, जिसके लिए नहीं है echo। इसलिए अपने तीसरे उदाहरण में:

/bin/sh -c 'echo foo; echo bar'

... दोनों छपे हैं। आपने तर्क उद्धृत किया। इस प्रकार: पहला तर्क है -c, और इस तर्क का पैरामीटर है 'echo foo; echo bar'जिसे पूरे तर्क के रूप में व्याख्या किया गया है; "कमांड स्ट्रिंग" के रूप में।


3

संरचना sh -c wordकेवल शब्द (एक शेल में) निष्पादित करती है।
जोड़े गए शब्दों का अर्थ है अन्य बातें, जैसे तर्क शून्य, एक, दो, आदि।

sh -c word zero one two three

एक कमांड रखने के लिए जिसमें एक शब्द के रूप में रिक्त स्थान है, उद्धृत करना आवश्यक है:

sh -c 'echo fnord' zero one two three

इसलिए, यह सभी तर्कों को छापता है:

$ sh -c 'echo "args=" "$0" "$@"' zero one two three
args = zero one two three

उदाहरण

आपके द्वारा प्रस्तुत उदाहरण में: /bin/sh -c echo fooपहला शब्द (विकल्पों के बाद) है echo, वह है जिसे निष्पादित किया गया है। और बिना किसी पाठ के एक प्रतिध्वनि केवल एक नई-पंक्ति छापेगी, और कुछ नहीं:

$ / बिन / श-सी गूंज फू

इसीलिए आपको खाली लाइन मिलती है।

यदि आप स्थान को उद्धृत करते हैं, तो आप "एक शब्द" (कोई रिक्त स्थान) निष्पादित नहीं करेंगे, इस प्रकार है:

$ / बिन / श-सी गूंज \ फू
foo
$ / बिन / श-सी "इको फू"
foo
$ / बिन / श-सी 'गूंज फू'
foo

निष्कर्ष

उद्धृत करने के लिए निष्पादित कमांड को एक "शब्द" के रूप में रखें।

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