এটি একটি সীমাবদ্ধতা find। POSIX মান নির্দিষ্ট করে ফেরত অবস্থা findহয় 0 যদি না একটি ত্রুটি ডিরেক্টরি ঢোঁড়ন যখন ঘটেছে; এক্সিকিউটড কমান্ডগুলির রিটার্নের স্থিতি এর মধ্যে প্রবেশ করে না।
আপনি কোনও আদেশে কোনও ফাইল বা কোনও বর্ণনাকারীর কাছে কমান্ডগুলি তাদের স্থিতি লিখতে পারেন:
find_status_file=$(mktemp findstatus)
: >"$find_status_file"
find … -exec sh -c 'trap "echo \$?" EXIT; invalid_command "$0"' {} \;
if [ -s "$find_status_file" ]; then
echo 1>&2 "An error occurred"
fi
rm -f "$find_status_file"
অন্য একটি পদ্ধতি, যেমন আপনি আবিষ্কার করেছেন , তা হল জার্গেজ ব্যবহার করা। xargsকমান্ডগুলি সর্বদা সমস্ত ফাইল প্রক্রিয়া করে তবে কমান্ডগুলির মধ্যে যদি কোনও ননজারো স্থিতি দেয় তবে স্থিতি 1 প্রদান করে।
find … -print0 | xargs -0 -n1 invalid_command
তবুও আরেকটি পদ্ধতি হ'ল findপরিবর্তে শেলের মধ্যে পুনরাবৃত্ত গ্লোববিং রোধ করা এবং ব্যবহার করা: **/যার অর্থ উপ-ডিরেক্টরিগুলির কোনও গভীরতা। এর জন্য বাশের 4 বা তার বেশি সংস্করণ প্রয়োজন; ম্যাকোস 3.x সংস্করণে আটকে আছে তাই আপনাকে এটি কোনও বন্দর সংগ্রহ থেকে ইনস্টল করতে হবে। set -eননজারো স্থিতি ফিরিয়ে দেওয়া প্রথম কমান্ডে স্ক্রিপ্টটি থামানোর জন্য ব্যবহার করুন ।
shopt -s globstar
set -e
for x in **/*.xml; do invalid_command "$x"; done
সাবধান থাকুন যে ব্যাশ ৪.০ থেকে ৪.২ এর মধ্যে, এটি কাজ করে কিন্তু ডিরেক্টরিগুলির সাথে প্রতীকী লিঙ্কগুলি অনুসরণ করে, যা সাধারণত কাম্য নয়।
আপনি যদি ব্যাশের পরিবর্তে zsh ব্যবহার করেন তবে পুনরাবৃত্ত গ্লোব্বিং কোনও গোটাকস ছাড়াই বাক্সের বাইরে চলে। জেডএসএস ওএসএক্স / ম্যাকোস এ ডিফল্টরূপে উপলব্ধ। Zsh এ, আপনি কেবল লিখতে পারেন
set -e
for x in **/*.xml; do invalid_command "$x"; done
xargsপদ্ধতির সাধারণ কাজ করে কিন্তু একরকম উপর ভঙ্গbash -cকমান্ড। উদাহরণস্বরূপ:find . -name '*.xml' -print0 | xargs -0 -n 1 -I '{}' bash -c "foo {}"। এটি একাধিকবার কার্যকর করা হয় যেখানেfind . -name '2*.xml' -print0 | xargs -0 -n 1 -I '{}' foo {}একবার মৃত্যুদন্ড কার্যকর করা হয় এবং ব্যর্থ হয়। কোন ধারণা কেন?