% 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
স্ট্যান্ডিনে পাস হওয়া আর্গুমেন্টগুলির জন্য, 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
(বা লিনাক্স না হলে আপনার সিস্টেমের সমতুল্য) এর অধীনে চালাতে পারেন ।
এখানে, আপনি যেটা প্রত্যাশা করছেন তার আরও সহজ প্রক্রিয়াজাতকরণের xargs
পরিবর্তে আপনি জিএনইউ ব্যবহার করতে পারেন parallel
:
printf '1\n2\n' | xargs -rn1 -P4 bash -c 'echo ":$1"' ''
Https://lists.gnu.org/archive/html/bug-parallel/2015-05/msg00005.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
সাধারণত স্বেচ্ছাচারিত ডেটার জন্য ব্যবহার করা যায় না।