यह सबसे सुरक्षित संस्करण लगता है।
tr '[\n]' '[\0]' < a.txt | xargs -r0 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
( -0
हटाया जा सकता है और tr
एक रीडायरेक्ट के साथ बदल दिया (या फ़ाइल एक अशक्त साथ बदला जा सकता बजाय फ़ाइल विभाजित)। यह वहाँ में मुख्य रूप से है, क्योंकि मैं मुख्य रूप से उपयोग करने xargs
के साथ find
साथ -print0
उत्पादन) (यह भी पर प्रासंगिक हो सकता है xargs
बिना संस्करणों -0
विस्तार)
यह सुरक्षित है, क्योंकि आर्ग्स इसे निष्पादित करते समय एक सरणी के रूप में शेल को पैरामीटर पास करेगा। शेल (कम से कम bash
) तब उन्हें अन्य प्रक्रियाओं के लिए एक अनछुए सरणी के रूप में पारित करेगा जब सभी का उपयोग करके प्राप्त किया जाता है["$@"][1]
यदि आप उपयोग करते हैं ...| xargs -r0 -I{} bash -c 'f="{}"; command "$f";' ''
, तो स्ट्रिंग दोहरे उद्धरण में होने पर असाइनमेंट विफल हो जाएगा। यह प्रत्येक संस्करण का उपयोग करने -i
या के लिए सही है -I
। (इसे एक स्ट्रिंग में बदलने के कारण, आप हमेशा इनपुट डेटा में अनपेक्षित वर्ण (जैसे उद्धरण, बैकटिक्स या डॉलर संकेत) सम्मिलित करके कमांड इंजेक्ट कर सकते हैं)
यदि आदेश एक समय में केवल एक पैरामीटर ले सकते हैं:
tr '[\n]' '[\0]' < a.txt | xargs -r0 -n1 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
या कुछ हद तक कम प्रक्रियाओं के साथ:
tr '[\n]' '[\0]' < a.txt | xargs -r0 /bin/bash -c 'for f in "$@"; do command1 "$f"; command2 "$f"; done;' ''
यदि आपके पास विस्तार के xargs
साथ GNU या कोई अन्य है -P
और आप समानांतर में 32 प्रक्रियाएँ चलाना चाहते हैं, तो प्रत्येक में प्रत्येक कमांड के लिए 10 से अधिक पैरामीटर नहीं हैं:
tr '[\n]' '[\0]' < a.txt | xargs -r0 -n10 -P32 /bin/bash -c 'command1 "$@"; command2 "$@";' ''
यह इनपुट में किसी विशेष वर्ण के खिलाफ मजबूत होना चाहिए। (यदि इनपुट को अलग कर दिया गया है।) tr
यदि कुछ पंक्तियों में नई-नई लाइनें हैं, तो संस्करण को कुछ अमान्य इनपुट मिलेंगे, लेकिन यह एक नई पंक्तिबद्ध फ़ाइल के साथ अपरिहार्य है।
इसके लिए रिक्त पहला पैरामीटर bash -c
इसके कारण है: ( bash
मैन पेज से ) (साभार @clacke)
-c If the -c option is present, then commands are read from the first non-option argument com‐
mand_string. If there are arguments after the command_string, the first argument is assigned to $0
and any remaining arguments are assigned to the positional parameters. The assignment to $0 sets
the name of the shell, which is used in warning and error messages.