% 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
इसका उपयोग आम तौर पर मनमाने डेटा के लिए नहीं किया जा सकता है।