আমি জানি, প্রদত্ত 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
।