उदाहरण के लिए, जबकि यह काम करता है:
$ इको फू foo
यह नहीं है:
$ / बिन / श-सी गूंज फू
जबकि यह करता है:
$ / बिन / श-सी 'गूंज फू; इको बार ' foo बार
क्या कोई स्पष्टीकरण है?
उदाहरण के लिए, जबकि यह काम करता है:
$ इको फू foo
यह नहीं है:
$ / बिन / श-सी गूंज फू
जबकि यह करता है:
$ / बिन / श-सी 'गूंज फू; इको बार ' foo बार
क्या कोई स्पष्टीकरण है?
जवाबों:
से 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
यह समझने के लिए पहला भाग था; दूसरा मामला सरल है और मुझे स्पष्टीकरण की आवश्यकता नहीं है, मुझे लगता है।
sh -c 'echo "$@"' fnord a b c d ...
sh -c 'echo $0' foo
सबसे अच्छा विकल्प नहीं है, यह ध्यान में रखते हुए कि प्रश्नकर्ता पहले से ही जानता है कि /bin/sh -c 'echo foo; echo bar'
काम करता है, आप बस कमांड का जवाब देने का जवाब दे सकते हैं/bin/sh -c 'echo foo'
$ echo foo
foo
यह echo
तर्क फू और फू के साथ कॉल मुद्रित है।
$ /bin/sh -c echo foo
यह तर्क के साथ शेल को आमंत्रित echo
करता है और तर्क के रूप में फू प्रदान करता है
$0
। echo
एक नई लाइन आउटपुट और आप त्यागने 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
इस आदेश में:
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'
जिसे पूरे तर्क के रूप में व्याख्या किया गया है; "कमांड स्ट्रिंग" के रूप में।
संरचना 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
उद्धृत करने के लिए निष्पादित कमांड को एक "शब्द" के रूप में रखें।
sh -c 'echo $1' echo foo