Xargs সহ শেল ফাংশন কল করা হচ্ছে


168

সমান্তরালে আরও জটিল ফাংশনটি কল করতে আমি xargs ব্যবহার করার চেষ্টা করছি।

#!/bin/bash
echo_var(){
    echo $1
    return 0
}
seq -f "n%04g" 1 100 |xargs -n 1 -P 10 -i echo_var {} 
exit 0

এটি ত্রুটি প্রদান করে

xargs: echo_var: No such file or directory

এটি সম্পন্ন করতে আমি কীভাবে xargs ব্যবহার করতে পারি বা অন্য কোনও সমাধান (গুলি) সম্পর্কে কোনও ধারণা স্বাগত।


2
বিপদ, ব্যবহারকারী 1148366, বিপদ! সমান্তরাল প্রোগ্রামিংয়ের জন্য ব্যাশ ব্যবহার করবেন না- আপনি অনেক সমস্যার মধ্যে চলে যাবেন। সি / সি ++ এবং অজানা থ্রেড, বা জাভা থ্রেড বা এমন কোনও কিছু ব্যবহার করুন যা আপনাকে কী করছে সে সম্পর্কে আপনাকে দীর্ঘ এবং কঠোর মনে করতে বাধ্য করে কারণ সমান্তরাল প্রোগ্রামিং সঠিক হওয়ার জন্য অনেক চিন্তাভাবনা করে।
ডেভিড সাউদার

27
@ ডেভিডসৌথার যদি কাজগুলি স্বতন্ত্র থাকে যেমন এই সমস্ত চিত্র ফাইলগুলিকে পিএনজিতে রূপান্তর করা হয় তবে চিন্তা করবেন না। এটি যখন আপনার সিঙ্ক্রোনাইজেশন হয় (সমস্ত শেষ হওয়ার অপেক্ষার বাইরে) এবং যোগাযোগ হয় যে এটি অগোছালো হয়ে যায়।
ctrl-alt-delor

@ ডেভিডসৌথার - আমি দীর্ঘ সময় ধরে জাভা দেব এবং আমি দেরীতে গ্রোভির কাজ করছি। এবং আমি লোকদের বলতেই থাকি: বন্ধুরা বন্ধুদের বাশ স্ক্রিপ্ট লিখতে দেয় না। আর, আমি নিজেকে এই পোস্টে / সমাধান দিকে তাকিয়ে এটি কারণ (দু: খিত মুখ :() আমি ব্যাশ মধ্যে সমান্তরাল প্রক্রিয়াজাতকরণ নিযুক্ত করছি আমি নির্দ্ধিধায় খাঁজকাটা / জাভা এটা করতে পারে
খ্রিস্টান Bongiorno

উত্তর:


172

ফাংশন রফতানিতে এটি করা উচিত (অরীক্ষিত):

export -f echo_var
seq -f "n%04g" 1 100 | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}

আপনি printfবাইরের পরিবর্তে বিল্টিন ব্যবহার করতে পারেন seq:

printf "n%04g\n" {1..100} | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}

এছাড়াও, ব্যবহার করে return 0এবং এর exit 0মতো কোনও ত্রুটি মানকে পূর্ববর্তী কমান্ড দ্বারা উত্পাদিত হতে পারে ks এছাড়াও, যদি কোনও ত্রুটি না থাকে তবে এটি ডিফল্ট এবং এভাবে কিছুটা অপ্রয়োজনীয়।

@ ফবিক উল্লেখ করেছেন যে বাশ কমান্ডটি সরল করা যেতে পারে

bash -c 'echo_var "{}"'

এটি {}সরাসরি ভিতরে সরানো । কিন্তু এটা কমান্ড ইনজেকশন প্রবন হিসাবে @Sasha দ্বারা নির্দিষ্ট।

আপনি এম্বেড থাকা বিন্যাসটি ব্যবহার করবেন না কেন তা এখানে একটি উদাহরণ :

$ echo '$(date)' | xargs -I {} bash -c 'echo_var "{}"'
Sun Aug 18 11:56:45 CDT 2019

কেন না এর আরেকটি উদাহরণ :

echo '\"; date\"' | xargs -I {} bash -c 'echo_var "{}"'

এটিই নিরাপদ বিন্যাসটি ব্যবহার করে আউটপুট হয় :

$ echo '$(date)' | xargs -I {} bash -c 'echo_var "$@"' _ {}
$(date)

এটি ইনজেকশন এড়ানোর জন্য প্যারামিটারাইজড এসকিউএল কোয়েরিগুলি ব্যবহার করে তুলনীয় ।

আমি সাশার মন্তব্যে ব্যবহৃত কমান্ডের dateপরিবর্তে কমান্ডের বিকল্পে বা পালানো উদ্ধৃতিগুলিতে rmব্যবহার করছি কারণ এটি অ-ধ্বংসাত্মক।


14
আরও কিছুটা আলোচনা: xargs নামের প্রক্রিয়াটির সম্পূর্ণ নতুন ইভেন্টটি কার্যকর করে। এই ক্ষেত্রে, আপনি নামটি সরবরাহ করেন echo_varযা এই স্ক্রিপ্টের একটি ফাংশন, আপনার PATH তে কোনও প্রক্রিয়া (প্রোগ্রাম) নয়। ডেনিসের সমাধানটি যা করে তা হ'ল চাইল্ড ব্যাশ প্রসেসগুলি ব্যবহারের জন্য ফাংশনটি রফতানি করা হয়, তারপরে সাবপ্রসেসগুলিতে কাঁটাচামচ করে সেখানে কার্যকর করা হয়।
ডেভিড সাউদার

7
এর তাত্পর্য কী _এবং \তাদের ছাড়া এটি আমার পক্ষে কাজ করে না
হ্যাশব্রাউন

9
@Hashbrown: আন্ডারস্কোর ( _) জন্য একটি জায়গা ধারক প্রদান করে argv[0]( $0) এবং প্রায় কিছু সেখানে ব্যবহার করা যেতে পারে। আমি ব্যাকস্ল্যাশ-সেমিকোলণ (যোগ \;) সসীম এর ব্যবহার কারণ -execএ ধারা find, কিন্তু তা এখানে এটা ছাড়া আমার জন্য কাজ করে। আসলে, যদি ফাংশনটি এর $@পরিবর্তে ব্যবহার করা হয় $1তবে এটি সেমিকোলনটিকে প্যারামিটার হিসাবে দেখত, তাই এটি বাদ দেওয়া উচিত।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

4
-আর জার্গসের প্রতি যুক্তিটি হ্রাস করা হয়েছে। পরিবর্তে -I (মূলধন i) ব্যবহার করুন।
নিকোলাই এস

11
আপনি বাশ এর সাথে কমান্ড স্ট্রিংয়ের xargs থেকে যুক্তি যুক্ত করে এটি সহজ করতে পারেন bash -c 'echo_var "{}"'। সুতরাং আপনার শেষে _ {need লাগবে না।
ফোবি

16

জিএনইউ সমান্তরাল ব্যবহারটি দেখতে দেখতে এমন দেখাচ্ছে:

#!/bin/bash
echo_var(){
    echo $1
    return 0
}
export -f echo_var
seq -f "n%04g" 1 100 | parallel -P 10 echo_var {} 
exit 0

আপনি যদি 20170822 সংস্করণটি ব্যবহার করেন তবে আপনি যতক্ষণ না এটি চালিয়েছেন ততক্ষণ আপনার এমনকি করতে হবে না export -f:

. `which env_parallel.bash`
seq -f "n%04g" 1 100 | env_parallel -P 10 echo_var {} 

আমি কোথায় আক্স জন্য শপ্ট পেতে পারি?
নিক

এনভিএম এটি zsh এ সেটআপ্ট
নিক

এটি নীচের ইরিয়ার ওলে sh: parallel_bash_environment: line 67: unexpected EOF while looking for matching '' sh: সমান্তরাল_বাশ_ইনভায়রনমেন্ট: লাইন :৯: সিনট্যাক্স ত্রুটি: ফাইলের অপ্রত্যাশিত সমাপ্তি: parallel_bash_environment' /usr/local/bin/bash: parallel_bash_environment: line 67: unexpected EOF while looking for matching '' / usr / স্থানীয় / বিন / ব্যাশ: সমান্তরাল_ব্যাশ_মোজনাল: লাইন 79: সিনট্যাক্স ত্রুটি: অপ্রত্যাশিত শেষে ফাইল / ইউএসআর / স্থানীয় / বিন / বাশ: for ... এর জন্য ফাংশন সংজ্ঞা আমদানিতে ত্রুটি ...
নিক

আপনি শেলফটারশকড হয়েছেন: শেলশক সরাসরি জিএনইউ প্যারালালকে প্রভাবিত করেনি। শেলশকের সমাধানটি অবশ্য এটি করেছে: এটি সম্পূর্ণভাবে ভেঙেছে - এএনভি এবং এনভ_প্যারালাল ট্রিক্স। এটি গিট সংস্করণে স্থির করা হয়েছে বলে মনে করা হয়: git.savannah.gnu.org/cgit/parallel.git/snapshot/…
ওলে

1
আমি এই উত্তরটি পছন্দ করি, কারণ এটি আমাকে সমান্তরাল সরঞ্জামটি আবিষ্কার করতে
পেরেছিল


1

হতে পারে এটি খারাপ অভ্যাস, তবে আপনি যদি কোনও .bashrcবা অন্য স্ক্রিপ্টে ফাংশনগুলি সংজ্ঞায়িত করে থাকেন তবে আপনি ফাইলটি বা কমপক্ষে ফাংশন সংজ্ঞাটি একটি সেটিং সহ মোড়ানো করতে পারেন allexport:

set -o allexport

function funcy_town {
  echo 'this is a function'
}
function func_rock {
  echo 'this is a function, but different'
}
function cyber_func {
  echo 'this function does important things'
}
function the_man_from_funcle {
  echo 'not gonna lie'
}
function funcle_wiggly {
  echo 'at this point I\'m doing it for the funny names'
}
function extreme_function {
  echo 'goodbye'
}

set +o allexport
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.