के बाद पहला तर्क sh -c inline-scriptको जाता है $0(जो भी त्रुटि संदेश के लिए प्रयोग किया जाता है), और बाकी हिस्सों में जाना $1, $2...
$ sh -c 'blah; echo "$0"; echo "$1"' my-inline-script arg
my-inline-script: blah: command not found
my-inline-script
arg
इसलिए आप यह चाहते हैं:
sh -c 'find "$1"' sh /tmp
(पुराने दिनों में, आप shकार्यान्वयन पा सकते हैं, जहाँ पहले arg $1इसके बजाय गया था , इसलिए आप ऐसा करेंगे:
sh -c 'find "$1"' /tmp /tmp
या:
sh -c 'shift "$2"; find "$@"' sh 3 2 /tmp1 /tmp2
दोनों व्यवहारों के लिए खाता है, लेकिन वे गोले अब चले गए हैं कि POSIX प्रचलित और सार्वजनिक रूप से उपलब्ध है)।
यदि आप वर्तमान शेल के भीतर स्थानीय स्कोप में सेट करना चाहते हैं $1, $2तो वहीं आप फ़ंक्शंस का उपयोग करेंगे। बॉर्न-जैसे गोले में:
my_func() {
find "$1"
}
my_func /tmp
कुछ गोले अनाम कार्यों का समर्थन करते हैं। यह मामला है zsh:
(){find "$1"} /tmp
या es:
@{find $1} /tmp
वर्तमान स्थितीय मापदंडों को बदलने के लिए, स्थायी रूप से, वाक्यविन्यास शेल निर्भर है। dchirikov पहले से ही कवर किया है बॉर्न की तरह गोले (बॉर्न, कॉर्न, bash, zsh, POSIX, ash, yash...)।
वाक्य रचना है:
set arg1 arg2 ... argn
हालाँकि, आपको इसकी आवश्यकता है:
set --
उस सूची को खाली करने के लिए (या shift "$#") और
set -- -foo
के $1साथ शुरू करने के लिए कुछ सेट करने के लिए -या +, तो यह हमेशा के लिए उपयोग करने के लिए एक अच्छी आदत है set --विशेष रूप से जब मनमाना डेटा का उपयोग set -- "$@" other-argकरने के लिए जैसे कि स्थिति संबंधी पैरामीटर सूची के अंत में तर्क जोड़ने के लिए।
cshपरिवार के गोले ( csh, tcsh) में, आप argvसरणी पर असाइन करें :
set argv=(arg1 arg2)
के गोले में rcपरिवार ( rc, es, akanga), करने के लिए *सरणी:
*=(arg1 arg2)
यद्यपि आप व्यक्तिगत रूप से भी तत्व निर्दिष्ट कर सकते हैं:
2=arg2
fishस्थिति में , मानदंड केवलargv सरणी में हैं (नहीं $1, $@वहाँ):
set argv arg1 arg2
में zsh, साथ संगतता के लिए csh, आप भी करने के लिए प्रदान कर सकते हैं argvसरणी:
argv=(arg1 arg2)
argv[4]=arg4
और आप यह भी कर सकते हैं:
5=arg5
इसका मतलब है कि आप भी ऐसा कर सकते हैं:
argv+=(another-arg)
अंत में एक तर्क जोड़ने के लिए, और:
argv[-1]=()
argv[2]=()
अंत या बीच से एक तर्क को हटाने के लिए, जिसे आप आसानी से अन्य गोले के साथ नहीं कर सकते।
(find $1) /tmpएक वाक्यविन्यास त्रुटि है। वास्तव(any-command) more-argumentsमें एक सिंटैक्स त्रुटि है। क्या आप अलग तरीके से समझा सकते हैं कि आप क्या करने की कोशिश कर रहे हैं?