xargs - প্রতিটি প্যারামিটার দিয়ে যুক্তি যুক্ত করুন


উত্তর:


13

এটি করার একটি উপায়:

echo "a b c" | xargs printf -- '-f %s\n' | xargs mycommand

এই অনুমান a, bএবং cঐ খালি, নতুন লাইন, কোট বা ব্যাকস্ল্যাশ থাকে না। :)

জিএনইউ দিয়ে findutilআপনি সাধারণ কেস পরিচালনা করতে পারেন তবে এটি কিছুটা জটিল:

echo -n "a|b|c" | tr \| \\0 | xargs -0 printf -- '-f\0%s\0' | xargs -0 mycommand

আপনি প্রতিস্থাপন করতে পারেন |, কিছু অন্যান্য অক্ষর দিয়ে বিভাজক যে মনে হচ্ছে না a, bঅথবা c

সম্পাদনা: @ মিশেলমোল নোট হিসাবে , আর্গুমেন্টের খুব দীর্ঘ তালিকার সাথে যুক্তিগুলির সর্বাধিক দৈর্ঘ্যটি প্রবাহিত হওয়ার ঝুঁকি রয়েছে mycommand। যখন এটি হয়, xargsশেষগুলি তালিকাকে বিভক্ত করবে এবং এর অন্য অনুলিপি চালাবে mycommand, এবং এটি নির্বিঘ্নে ছেড়ে যাওয়ার ঝুঁকি রয়েছে -f। আপনি যদি সেই পরিস্থিতি নিয়ে চিন্তিত হন তবে আপনি xargs -0উপরের শেষটিকে এই জাতীয় কিছু দ্বারা প্রতিস্থাপন করতে পারেন:

... | xargs -x -0 mycommand

এটি সমস্যার সমাধান করবে না, তবে mycommandযুক্তিগুলির তালিকা খুব দীর্ঘ হয়ে গেলে এটি চলমান বাতিল করে দেবে ।


1
আপনি তার যুক্ত প্যারামিটারটি ছাড়িয়ে যাওয়ার ARG_MAXএবং ছাড়ানোর একটি সুন্দর কুৎসিত ঝুঁকিটি চালান -f
মাইকেল মোল

@ মিশেলমল এটি একটি ভাল বিষয়, তবে আমি মনে করি না যে পরিস্থিতি সম্পর্কে আরও কিছু না জেনে পরিচালনা করার কোনও অর্থবহ উপায় আছে mycommand। আপনি সর্বদা -xশেষ যোগ করতে পারে xargs
স্যাটাস কাতসুরা

আমি মনে করি সঠিক সমাধানটি সম্ভবত ব্যবহার xargsকরা নয় এবং এটি ব্যবহার findকরা যেতে পারে তবে কেবল ব্যবহার করুন । এই সমাধান বিপজ্জনক; আপনার উত্তরে ব্যর্থতার ক্ষেত্রে আপনার কমপক্ষে সতর্ক করা উচিত।
মাইকেল মোল

@ মিশেলমোল আমি সত্যিই দেখতে পাই না কীভাবে এর থেকে আরও findভাল সাধারণ সমাধান হতে পারে, বিশেষত যখন প্রাথমিক যুক্তি ফাইল-নাম নয়। :)
সাটস কাতসুরা

প্রাথমিক আর্গুমেন্টগুলি কী তা আমরা জানি না; আমরা কেবল প্রদত্ত উদাহরণ দেখি, পরিস্থিতিটি নয় যা প্রশ্নকে অনুপ্রাণিত করে। অন্তর্নিহিত পরামর্শ দেয় যে যুক্তির সাথে নাম দেওয়া হয়েছে -f, এবং উদাহরণের lsজন্য একটি উদাহরণ সরঞ্জাম ব্যবহৃত হয়েছে, @ নন-এ-ব্যবহারকারী ফাইলের সাথে কাজ করছেন। এবং প্রদত্ত findঅফার -execযুক্তি, যা আপনি করতে পারবেন গঠন করা একটি কম্যান্ড-লাইন, এটা ঠিক আছে। (এত দিন যতক্ষণ mycommandনা একাধিকবার মৃত্যুদণ্ড কার্যকর করার অনুমতি দেওয়া হয় it's এটি যদি না হয় তবে আমাদের xargsএখানে ব্যবহারের সাথে আরও একটি সমস্যা আছে ...)
মাইকেল মোল

5

এটির সমাধানের আরও ভাল উপায় হ'ল:

  • ইন zsh:

    l=(a b c)
    mycommand -f$^l
    

    বা অ্যারে জিপিং ব্যবহার করে যাতে যুক্তিটি বিকল্পটির সাথে সংযুক্ত না হয়:

    l=(a b c) o=(-f)
    mycommand "${o:^^l}"
    

    এইভাবে, এটি এখনও কাজ করে যদি lঅ্যারেতে ফাঁকা উপাদান বা উপাদানগুলির জন্য স্পেস বা অন্য কোনও সমস্যাযুক্ত চরিত্র থাকে xargs। উদাহরণ:

    $ l=(a '' '"' 'x y' c) o=(-f)
    $ printf '<%s>\n' "${o:^^l}"
    <-f>
    <a>
    <-f>
    <>
    <-f>
    <">
    <-f>
    <x y>
    <-f>
    <c>
    
  • ইন rc:

    l=(a b c)
    mycommand -f$l
    
  • ইন fish:

    set l a b c
    mycommand -f$l
    

(এএফআইকে, rcএবং fishকোনও অ্যারে জিপিং নেই)

পুরানো স্টাইলের বোর্ন-জাতীয় শেলগুলির মতো bash, আপনি সর্বদা করতে পারতেন (এখনও $@অ্যারের উপাদানগুলিতে কোনও চরিত্রকে মঞ্জুর করে):

set -- a b c
for i do set -- "$@" -f "$i"; shift; done
mycommand "$@"

1
ব্যাশে এটি করার আরেকটি উপায় হ'ল নামযুক্ত অ্যারে ভেরিয়েবল। for i; do args+=('-f' "$i");done; mycommand "${args[@]}"। আইডি কে যদি এটি দ্রুত হয় তবে অ্যারেতে 2 টি উপাদান যুক্ত করা মনে হয় এটি ও (এন) হওয়া উচিত, যখন আপনার setলুপ সম্ভবত প্রতিবার জমা হওয়া আরগ তালিকাকে অনুলিপি করে এবং পুনরায় পার্স করে (O (n ^ 2))।
পিটার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.