একটি উপাধি শেলের অভ্যন্তরীণ যেখানে এটি সংজ্ঞায়িত করা হয়েছে। এটি অন্যান্য প্রক্রিয়াগুলিতে দৃশ্যমান নয়। একই শেল ফাংশন জন্য যায়। xargs
একটি পৃথক অ্যাপ্লিকেশন, যা শেল নয়, তাই উপকরণ বা ফাংশনগুলির ধারণা নেই।
আপনি এক্সারগসকে grep
সরাসরি ডাকার পরিবর্তে একটি শেল ডেকে আনতে পারেন । তবে কেবল শেলটি চাওয়া যথেষ্ট নয়, আপনাকে সেই শেলের মধ্যেও উপনামটি সংজ্ঞায়িত করতে হবে। যদি উপনামটি আপনার মধ্যে সংজ্ঞায়িত করা হয় তবে .bashrc
আপনি সেই ফাইলটি উত্স করতে পারেন; তবে এটি আপনার .bashrc
অন্যান্য কাজগুলি সম্পাদন করতে পারে না যা একটি অ-ইন্টারেক্টিভ শেলের মধ্যে অর্থবোধ করে না।
find . -name '*.py' | xargs bash -c '. ~/.bashrc; grep -E regex_here "$@"' _
Regexp টাইপ করার সময় নেস্টেড কোটিংয়ের জটিলতাগুলি সম্পর্কে সতর্ক থাকুন। আপনি শেলের একটি প্যারামিটার হিসাবে রেজিএক্সপ্যাস পাস করে আপনার জীবনকে সহজ করতে পারেন।
find . -name '*.py' | xargs bash -c '. ~/.bashrc; grep -E "$0" "$@"' regex_here
আপনি স্পষ্টরূপে উলামের অনুসন্ধান করতে পারেন। তারপরেও xargs
দেখবেন grep -n --color=always
।
find . -name '*.py' | xargs "${BASH_ALIASES[grep]}" regex_here
জেডএসে:
find . -name '*.py' | xargs $aliases[grep] regex_here
যাইহোক, নোট করুন যে find … | xargs …
স্পেস (অন্যদের মধ্যে) রয়েছে এমন ফাইলের নামগুলিতে বিরতি । নাল-সীমাবদ্ধ রেকর্ডে পরিবর্তন করে আপনি এটি ঠিক করতে পারেন:
find . -name '*.py' -print0 | xargs -0 "${BASH_ALIASES[grep]}" regex_here
বা ব্যবহার করে -exec
:
find . -name '*.py' -exec "${BASH_ALIASES[grep]}" regex_here {} +
কল করার পরিবর্তে find
, আপনি শেলের ভিতরে পুরোপুরি সবকিছু করতে পারেন। গ্লোব প্যাটার্ন **/
ডিরেক্টরিগুলি পুনরাবৃত্তভাবে অনুসরণ করে। ব্যাশে, আপনাকে shopt -s globstar
প্রথমে এই গ্লোব প্যাটার্ন সক্ষম করতে চালানো দরকার ।
grep regex_here **/*.py
এর কয়েকটি সীমাবদ্ধতা রয়েছে:
- যদি অনেকগুলি ফাইল মিলে যায় (বা তাদের দীর্ঘ পথ রয়েছে) তবে কমান্ডটি ব্যর্থ হতে পারে কারণ এটি সর্বাধিক কমান্ড লাইনের দৈর্ঘ্য ছাড়িয়েছে।
- বাশ ≤4.2 এ (তবে আরও সাম্প্রতিক সংস্করণগুলিতে বা ksh বা zsh- তে নয়)
**/
ডিরেক্টরিগুলির প্রতীকী লিঙ্কগুলিতে পুনরাবৃত্তি হয়।
আর একটি পদ্ধতি হ'ল প্রক্রিয়া প্রতিস্থাপনটি ব্যবহার করা, যেমন মারিয়াসম্যাটুয়িয়ে প্রস্তাবিত ।
grep regex_here <(find . -name '*.py')
**/
প্রযোজ্য না হলে এটি কার্যকর: জটিল find
অভিব্যক্তির জন্য বা ব্যাশ .24.2-এ যখন আপনি প্রতীকী লিঙ্কগুলির অধীনে পুনরাবৃত্তি করতে চান না। নোট করুন যে এটি ফাঁকা ফাইলগুলির নামের সাথে বিরতি দেয়; একটি ওয়ার্কঅ্যারাউন্ড হয় সেট IFS
এবং অক্ষম globbing , কিন্তু এটা একটি বিট জটিল হতে শুরু করছে চারপাশ:
(IFS=$'\n'; set -f; grep regex_here <(find . -name '*.py') )