समारोह का निर्यात इसे करना चाहिए (अप्राप्त):
export -f echo_var
seq -f "n%04g" 1 100 | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}
आप printfबाहरी के बजाय बिलिन का उपयोग कर सकते हैं seq:
printf "n%04g\n" {1..100} | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}
इसके अलावा, किसी भी त्रुटि मान का उपयोग करने return 0और exit 0उस तरह का उपयोग करना जो कि कमांड से पहले हो सकता है। इसके अलावा, अगर कोई त्रुटि नहीं है, तो यह डिफ़ॉल्ट है और इस प्रकार कुछ हद तक बेमानी है।
@ एफ़ोबिक में उल्लेख है कि बैश कमांड को सरल बनाया जा सकता है
bash -c 'echo_var "{}"'
{}सीधे उसके अंदर चल रहा है। लेकिन यह @Sasha द्वारा इंगित के रूप में कमांड इंजेक्शन के लिए असुरक्षित है ।
यहाँ एक उदाहरण है कि आपको एम्बेडेड प्रारूप का उपयोग क्यों नहीं करना चाहिए :
$ echo '$(date)' | xargs -I {} bash -c 'echo_var "{}"'
Sun Aug 18 11:56:45 CDT 2019
क्यों नहीं का एक और उदाहरण :
echo '\"; date\"' | xargs -I {} bash -c 'echo_var "{}"'
सुरक्षित प्रारूप का उपयोग करके यह आउटपुट है :
$ echo '$(date)' | xargs -I {} bash -c 'echo_var "$@"' _ {}
$(date)
यह इंजेक्शन से बचने के लिए पैरामीटर वाले SQL प्रश्नों का उपयोग करने के लिए तुलनीय है ।
मैं dateएक कमांड प्रतिस्थापन में उपयोग कर रहा हूं या rmसाशा की टिप्पणी में इस्तेमाल किए गए कमांड के बजाय यहां से बच गए उद्धरणों के बाद से यह गैर-विनाशकारी है।