GNU समानांतर काम "bash -c" के साथ क्यों नहीं करता है?


जवाबों:


11

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


4
सोम मरु! जीएनयू समानांतर के लेखक लिख सकते हैं की तुलना में यह एक बेहतर उत्तर है।
ओले तांगे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.