खैर, "$@"
स्थितीय मापदंडों की सूची में फैलता है, प्रति तर्क एक पैरामीटर प्रतिमान।
जब तुम करोगे:
set '' 'foo bar' $'blah\nblah'
cmd "$@"
cmd
उन 3 तर्कों के साथ लागू किया जा रहा है: खाली स्ट्रिंग, foo bar
और blah<newline>blah
। शेल execve()
सिस्टम कॉल को कुछ इस तरह बुलाएगा:
execve("/path/to/cmd", ["cmd", "", "foo bar", "blah\nblah"], [envvars...]);
यदि आप एक शेल कमांड लाइन (जो कि शेल लैंग्वेज में कोड है) को फिर से संगठित करना चाहते हैं, जो उसी आह्वान को पुन: उत्पन्न करेगा, तो आप कुछ ऐसा कर सकते हैं:
awk -v q="'" '
function shellquote(s) {
gsub(q, q "\\" q q, s)
return q s q
}
BEGIN {
for (i = 1; i < ARGC; i++) {
printf "%s", sep shellquote(ARGV[i])
sep = " "
}
printf "\n"
}' cmd "$@"
या zsh
विभिन्न प्रकार के उद्धरणों के लिए पूछ रहे हैं:
$ set '' 'foo bar' $'blah\nblah'
$ print -r -- cmd "${(q)@}"
cmd '' foo\ bar blah$'\n'blah
$ print -r -- cmd "${(qq)@}"
cmd '' 'foo bar' 'blah
blah'
$ print -r -- cmd "${(qqq)@}"
cmd "" "foo bar" "blah
blah"
$ print -r -- cmd "${(qqqq)@}"
cmd $'' $'foo bar' $'blah\nblah'
या zsh
, bash
या , ksh93
( bash
अन्य गोले के साथ YMMV के लिए ):
$ set '' 'foo bar' $'blah\nblah'
$ printf cmd; printf ' %q' "$@"; printf '\n'
cmd '' foo\ bar $'blah\nblah'
आप शेल के xtrace विकल्प का भी उपयोग कर सकते हैं जो शेल को प्रिंट करने का कारण बनता है जो इसे निष्पादित करने जा रहा है:
$ (PS4=; set -x; : cmd "$@")
: cmd '' 'foo bar' 'blah
blah'
ऊपर, हमने तर्क के रूप में :
नो-ऑप कमांड cmd
और स्थितीय मापदंडों को चलाया । मेरे खोल ने उन्हें खोल के पुनर्निवेश के लिए उपयुक्त एक अच्छे उद्धृत फैशन में छापा। सभी गोले ऐसा नहीं करते हैं।
$
-एक्सपेशन और अन्य डबल-कोट्स की सुरक्षा में बहुत मददगार नहीं है । यही कारण है कि अन्य उत्तर स्ट्रिंग के अंदर सिंगल कोट्स को संभालने के लिए कुछ लंबाई में जाते समय सिंगल कोट्स का उपयोग करते हैं, या स्ट्रिंग के एक उद्धृत कॉपी के उत्पादन के लिए शेल की अपनी विशेषताओं का उपयोग करते हैं।