% echo -e '1\n2' | parallel "bash -c 'echo :\$1' '' {}"
:1
:2
% echo -e '1\n2' | parallel bash -c 'echo :\$1' '' {}
%
मुझे उम्मीद है कि दूसरी पंक्ति भी ऐसा ही करेगी।
% echo -e '1\n2' | parallel "bash -c 'echo :\$1' '' {}"
:1
:2
% echo -e '1\n2' | parallel bash -c 'echo :\$1' '' {}
%
मुझे उम्मीद है कि दूसरी पंक्ति भी ऐसा ही करेगी।
जवाबों:
parallelपहले से ही एक शेल में कमांड चलाता है (जो शेल को निर्धारित किया गया है वह parallelहेयुरिस्टिक्स का उपयोग करके निर्धारित किया गया है (एक ही शेल को लागू करने के इरादे से ) जिसे आप सेparallel आमंत्रित किया गया था )। आप शेल को ठीक करने के लिए चर सेट कर सकते हैं )।$PARALLEL_SHELL
यह वह कमांड नहीं है जिसे आप parallelपसंद कर रहे हैं जैसे आप envया xargsकमांड के लिए करेंगे , लेकिन एक शेल कमांड लाइन (जैसे आप evalकमांड के लिए चाहेंगे )।
जैसे eval, में parallel arg1 arg2, parallelउन तर्कों को बीच में रिक्त स्थान के साथ समेट रहा है (इसलिए यह बन जाता है arg1 arg2) और उस स्ट्रिंग को पास कर दिया जाता है <the-shell> -c।
तर्क पर पारित कर रहे हैं के लिए parallelके stdin, parallelउन्हें उद्धरण प्रारूप कि विशेष रूप से खोल द्वारा की उम्मीद में (एक कठिन और त्रुटि भरा कार्य है, जिसके कारण तुम वहाँ किया गया है में है कि चारों ओर से तय कीड़े का एक बहुत मिल जाएगा parallelके चैंज ( कुछ अभी भी 2017-03-06 के अनुसार तय नहीं किए गए हैं)) और इसे उस कमांड लाइन पर जोड़ दिया।
उदाहरण के लिए, अगर भीतर से बुलाया जाए bash,
echo "foo'bar" | parallel echo foo
समानांतर कॉल के लिए होता है bash -cके साथ echo foo foo\'barकमांड लाइन के रूप में। और अगर भीतर से कहा जाता है rc(या के साथ PARALLEL_SHELL=rc) rc -cके साथ echo foo foo''''bar।
अपने में:
parallel bash -c 'echo :\$1' '' {}
parallel उन तर्कों को समाप्त करता है जो देता है:
bash -c echo :$1 {}
और साथ {}विस्तार किया है और खोल आप कॉल कर रहे के लिए सही प्रारूप में उद्धृत parallelसे, गुजरता है कि करने के लिए <that-shell> -cजो कॉल करेंगे bash -c echoसाथ :$1में $0में मौजूदा बहस और $1।
यह कैसे parallelकाम करता है। यहाँ, आप शायद चाहते हैं:
printf '1\n2\n' | PARALLEL_SHELL=bash parallel 'echo :{}'
क्या parallelकरता है यह देखने के लिए , आप इसे strace -fe execve(या अपने सिस्टम पर समतुल्य नहीं तो लिनक्स के तहत ) चला सकते हैं ।
यहां, आप GNU का उपयोग कर सकते हैं xargsइसके बजाय parallelएक सरल प्रसंस्करण प्राप्त करने के लिए जो आप उम्मीद कर रहे हैं:
printf '1\n2\n' | xargs -rn1 -P4 bash -c 'echo ":$1"' ''
Https://lists.gnu.org/archive/html/bug-parallel/2015-05/msg0000.html.html पर चर्चा भी देखें
ध्यान दें bash -c 'echo foo' '' foo, आप $0इनलाइन-स्क्रिप्ट के लिए खाली स्ट्रिंग बना रहे हैं । मैं इससे बचता हूँ क्योंकि $0इसका उपयोग त्रुटि संदेशों में भी किया जाता है। की तुलना करें:
$ bash -c 'echo x > "$1"' '' /
: /: Is a directory
साथ में।
$ bash -c 'echo x > "$1"' bash /
bash: /: Is a directory
यह भी ध्यान दें कि चरों को अछूता छोड़ने का एक बहुत ही विशेष अर्थ है bashऔर echoइसका उपयोग आम तौर पर मनमाने डेटा के लिए नहीं किया जा सकता है।