के बाद पहला तर्क 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
में एक सिंटैक्स त्रुटि है। क्या आप अलग तरीके से समझा सकते हैं कि आप क्या करने की कोशिश कर रहे हैं?