আমি জানি, প্রদত্ত l="a b c",
echo $l | xargs ls
উৎপাদনের
ls a b c
যা ফলন তৈরি করে
mycommand -f a -f b -f c
আমি জানি, প্রদত্ত l="a b c",
echo $l | xargs ls
উৎপাদনের
ls a b c
যা ফলন তৈরি করে
mycommand -f a -f b -f c
উত্তর:
এটি করার একটি উপায়:
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যুক্তিগুলির তালিকা খুব দীর্ঘ হয়ে গেলে এটি চলমান বাতিল করে দেবে ।
mycommand। আপনি সর্বদা -xশেষ যোগ করতে পারে xargs।
xargsকরা নয় এবং এটি ব্যবহার findকরা যেতে পারে তবে কেবল ব্যবহার করুন । এই সমাধান বিপজ্জনক; আপনার উত্তরে ব্যর্থতার ক্ষেত্রে আপনার কমপক্ষে সতর্ক করা উচিত।
findভাল সাধারণ সমাধান হতে পারে, বিশেষত যখন প্রাথমিক যুক্তি ফাইল-নাম নয়। :)
-f, এবং উদাহরণের lsজন্য একটি উদাহরণ সরঞ্জাম ব্যবহৃত হয়েছে, @ নন-এ-ব্যবহারকারী ফাইলের সাথে কাজ করছেন। এবং প্রদত্ত findঅফার -execযুক্তি, যা আপনি করতে পারবেন গঠন করা একটি কম্যান্ড-লাইন, এটা ঠিক আছে। (এত দিন যতক্ষণ mycommandনা একাধিকবার মৃত্যুদণ্ড কার্যকর করার অনুমতি দেওয়া হয় it's এটি যদি না হয় তবে আমাদের xargsএখানে ব্যবহারের সাথে আরও একটি সমস্যা আছে ...)
এটির সমাধানের আরও ভাল উপায় হ'ল:
ইন 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 "$@"
for i; do args+=('-f' "$i");done; mycommand "${args[@]}"। আইডি কে যদি এটি দ্রুত হয় তবে অ্যারেতে 2 টি উপাদান যুক্ত করা মনে হয় এটি ও (এন) হওয়া উচিত, যখন আপনার setলুপ সম্ভবত প্রতিবার জমা হওয়া আরগ তালিকাকে অনুলিপি করে এবং পুনরায় পার্স করে (O (n ^ 2))।
ARG_MAXএবং ছাড়ানোর একটি সুন্দর কুৎসিত ঝুঁকিটি চালান-f।