आप मैन पेज की गलत व्याख्या कर रहे हैं। सबसे पहले, --
विकल्पों के अंत के बारे में संकेत देने के बारे में वह हिस्सा जो आप करने की कोशिश कर रहे हैं, के लिए अप्रासंगिक है। -c
ओवरराइड उस बिंदु से कमांड लाइन के बाकी, ताकि यह भविष्य में जा रहा नहीं है सब पर पार्टी के विकल्प से निपटने के माध्यम से, जिसका अर्थ है कि --
आदेश के माध्यम से पारित किया जाएगा, विकल्प मार्कर की अंत के रूप में पार्टी द्वारा नियंत्रित नहीं।
दूसरी गलती यह है कि अतिरिक्त तर्कों को शेल प्रक्रिया के लिए स्थितीय मापदंडों के रूप में असाइन किया गया है, जो कमांड के लिए तर्कों के रूप में पारित नहीं किया गया है। इसलिए, आप जो करने की कोशिश कर रहे हैं, वह इनमें से एक के रूप में किया जा सकता है:
/bin/bash -c 'echo "$0" "$1"' foo bar
/bin/bash -c 'echo "$@"' bash foo bar
पहले मामले में, मापदंडों को प्रतिध्वनित करते हुए $0
और $1
स्पष्ट रूप से, और दूसरे मामले में, "$@"
$ 0 को छोड़कर "सभी स्थितीय मापदंडों" के रूप में सामान्य रूप से विस्तार करने के लिए। ध्यान दें कि उस स्थिति में हमें कुछ उपयोग करने के लिए पास करना होगा $0
; मैंने "बैश" चुना है क्योंकि यह $0
सामान्य रूप से होगा, लेकिन कुछ और काम करेगा।
इस कारण से यह इस तरह से किया गया है, आप जो भी निर्देश देते हैं, उसे आप सीधे कमांड लिस्ट में पास करने के बजाय: ध्यान दें कि प्रलेखन कहता है कि "कमांड एस स्ट्रिंग से पढ़ी जाती है", बहुवचन। दूसरे शब्दों में, यह योजना आपको ऐसा करने की अनुमति देती है:
/bin/bash -c 'mkdir "$1"; cd "$1"; touch "$2"' bash dir file
लेकिन, ध्यान दें कि अपने मूल लक्ष्य को पूरा करने का एक बेहतर तरीका env
इसके बजाय उपयोग करना हो सकता है bash
:
/usr/bin/env -- "ls" "-l"
यदि आपको किसी ऐसी सुविधा की आवश्यकता नहीं है जो एक शेल प्रदान कर रही है, तो इसका उपयोग करने का कोई कारण नहीं है - env
इस मामले में उपयोग करना तेज, सरल और कम टाइपिंग होगा। और आपको यह सुनिश्चित करने के लिए मुश्किल नहीं है कि यह सुरक्षित रूप से शेल मेटाचैकर या व्हॉट्सएप युक्त फ़ाइलनाम को संभालना होगा।