-অ্যাসেক ব্যর্থ হলে আমি কীভাবে ব্যর্থ হব?


29

আমি যখন শেলটিতে এই কমান্ডটি চালাচ্ছি (একটি খালি নয় এমন ডিরেক্টরিতে):

find . -exec invalid_command_here {} \;

বুঝতে পেরেছি:

find: invalid_command_here: No such file or directory
find: invalid_command_here: No such file or directory
find: invalid_command_here: No such file or directory

(এবং প্রতিটি ফাইলের জন্য তাই)

findপ্রথম ত্রুটির পরে আমার ব্যর্থ হওয়া দরকার । এটি কাজ করার কোন উপায় আছে? আমি ব্যবহার করতে পারি না xargs, যেহেতু আমার পথে ফাঁকা স্থান রয়েছে, তবে ত্রুটি কোডটি ফিরিয়ে আনার জন্য আমার এটিকে কল করার স্ক্রিপ্ট দরকার।

উত্তর:


34

এটি একটি সীমাবদ্ধতা findPOSIX মান নির্দিষ্ট করে ফেরত অবস্থা 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 {}একবার মৃত্যুদন্ড কার্যকর করা হয় এবং ব্যর্থ হয়। কোন ধারণা কেন?
DKroot

@ ডিক্রুট {}ভিতরে কখনও ব্যবহার করবেন না bash -c। এটি ফাইলের নাম নেয় এবং এটি শেল কমান্ডের ভিতরে সরাসরি সন্নিবেশ করায়। যদি ফাইলের নামের শেলগুলিতে স্পেসগুলির মতো বিশেষ অর্থ রয়েছে এমন অক্ষর থাকে তবে শেলটি এই বিশেষ অক্ষরগুলিকে ব্যাখ্যা করে। যদি আপনার শেলের প্রয়োজন হয় তবে {}আলাদা আর্গুমেন্ট হিসাবে পাস করুন , যেমন bash -c 'foo "$0"' {}(চারদিকে ডাবল উদ্ধৃতিগুলিও নোট করুন $0)।
গিলস 'অশুভ হওয়া বন্ধ করুন'

ঠিক আছে, প্রশ্নগুলি অন্যদিকে রেখে, নীচেরগুলি কেন প্রথম ত্রুটিতে থামছে না ?? find . -name '*' -print0 | xargs -0 -n 1 -I '{}' bash -c 'foo "$0"' {}
DKroot

@ ডিক্রুট এটি ত্রুটির কারণে থামবে কেন? xargs সর্বদা সমস্ত আইটেমের কমান্ড চালায়।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন' ২

আমি এই উত্তরটি ব্যবহার করার চেষ্টা করছি: xargs ( find . -print0 | xargs -0 -n1 invalid_command) পদ্ধতির। এই প্রথম ত্রুটি স্টপ সঠিকভাবে: find . -name '*' -print0 | xargs -0 -n 1 -I '{}' foo {}। গ্রেট! তবে একই পদ্ধতির bash -c(উপরে) কাজ করে না । দুজনের মধ্যে একমাত্র পার্থক্য bash -c
ডিক্রুট


4

xargsএকটি বিকল্প। তবে এটির পরিবর্তে findব্যবহার করে এটি করা তুচ্ছভাবে সহজ+\;

-exec  utility_name  [argument ...]   {} +

থেকে POSIX ডকুমেন্টেশন :

যদি প্রাথমিক এক্সপ্রেশনটি একাধিক চিহ্ন দ্বারা বিরামচিহ্নযুক্ত হয় তবে প্রাথমিকটি সর্বদা সত্য হিসাবে মূল্যায়ন করবে এবং যে পথের নামগুলির জন্য প্রাথমিক মূল্যায়ন করা হয় সেগুলিকে সেটে একত্রিত করা হবে। ইউটিলিটি ইউটিলিটি_নাম একবারে একত্রিত পাথ-নেমগুলির জন্য সেট করা হবে। প্রতিটি অনুরোধটি সেটটিতে শেষ প্যাথনাম একত্রিত হওয়ার পরে শুরু হবে এবং অনুসন্ধানের ইউটিলিটিটি প্রস্থান করার আগে এবং পরবর্তী সেটটিতে প্রথম পাথনামটি (প্রাথমিকভাবে) যদি এই প্রাথমিকটির জন্য একত্রিত হওয়ার পূর্বে সম্পন্ন হবে, তবে অন্যথায় এই আহ্বানটি অনির্দিষ্ট কিনা অন্যান্য প্রাথমিকের মূল্যায়নের আগে, সময় বা পরে occurs যদি কোনও অনুরোধ প্রস্থান স্থিতি হিসাবে একটি শূন্য-মান প্রদান করে, সন্ধানের ইউটিলিটিটি একটি শূন্য-বহির্গমন স্থিতি ফিরে আসবে।কেবলমাত্র দুটি অক্ষর "{}" সমন্বিত একটি যুক্তি একত্রিত প্যাথনামগুলির সেট দ্বারা প্রতিস্থাপিত হবে এবং প্রতিটি পথের নাম একইভাবে ক্রমযুক্ত অনুরোধের জন্য পৃথক যুক্তি হিসাবে পাস করা হবে। দুটি বা ততোধিক পথের নামের যে কোনও সেটের আকার সীমাবদ্ধ থাকবে যেমন ইউটিলিটি কার্যকর করা সিস্টেমের {ARG_MAX} সীমা অতিক্রম করতে পারে না। যদি কেবলমাত্র দুটি অক্ষর "{}" সমন্বিত একাধিক যুক্তি উপস্থিত থাকে তবে আচরণটি অনির্দিষ্ট।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.