প্যাটার্ন পাওয়া না গেলে শেল স্ক্রিপ্ট থেকে অকাল প্রস্থান রোধ করার জন্য `সেট -e` এবং` গ্রেপ আইডিয়াম


15

সহায়তা প্রয়োজন - একটি জিএনইউ / লিনাক্স ব্যাশে শেল স্ক্রিপ্টিংয়ের প্রসঙ্গে:

আমি সবসময় ব্যবহার করি set -e। প্রায়শই, আমি চাই grepএবং সর্বদা চাই না যে স্ক্রিপ্টটি নির্বাহের অবসান ঘটুক যদি ইঙ্গিত দেওয়া প্যাটার্নটি খুঁজে পাওয়া না যায় তবে grepexit1

আমি যে সমস্যাটি এই সমস্যাটি সমাধান করার চেষ্টা করেছি সেগুলি নিম্নরূপ:

(আমি চেষ্টা করুন)
যদি set +o pipefailএবং এরকম grep 'p' | wc -lকোনও কিছুর সাথে গ্রাপের আবেদন করি তবে ভবিষ্যতের রক্ষণাবেক্ষণকারী সক্ষম না হওয়া পর্যন্ত আমি পছন্দসই আচরণটি পাই pipefail। এছাড়াও, আমি সক্ষম করতে চাই pipefailযাতে এটি আমার পক্ষে কাজ করে না।

(দ্বিতীয় চেষ্টা করুন)
এক sedবা awkকেবল মুদ্রিত লাইনগুলি মেলে এমন প্যাটার্ন ব্যবহার করুন, তারপরে ম্যাচ করা প্যাটার্নটির wcজন্য পরীক্ষার জন্য মিলিত লাইনগুলি। আমি এই বিকল্পটি পছন্দ করি না কারণ এটি ব্যবহার sedকরে grepআমার সত্যিকারের সমস্যার মতো কাজ করা উচিত।

(তৃতীয় চেষ্টা করে দেখুন)
এটি আমার সবচেয়ে প্রিয় - এটির মতো:set +e; grep 'p'; set-e

যে কোনও অন্তর্দৃষ্টি / মূর্খতা সর্বাধিক প্রশংসা হবে - আপনাকে ধন্যবাদ।

উত্তর:


19

আপনি একটি ifশর্তে গ্রেপ লাগাতে পারেন , বা যদি আপনি প্রস্থান স্থিতি সম্পর্কে চিন্তা না করেন তবে যুক্ত করুন || true

উদাহরণ: grepখোলকে মেরে ফেলে

$ bash
$ set -e
$ echo $$
33913
$ grep foo /etc/motd
$ echo $$
9233

সমাধান 1: অ-শূন্য প্রস্থান স্থিতি ফেলে দিন

$ bash
$ set -e
$ echo $$
34074
$ grep foo /etc/motd || true
$ echo $$
34074

সমাধান 2: প্রস্থান স্থিতি স্পষ্টভাবে পরীক্ষা করুন

$ if ! grep foo /etc/motd; then echo not found; fi
not found
$ echo $$
34074

আলোচিত বাশ ম্যান পৃষ্ঠা থেকে set -e:

শেলটি প্রস্থান করে না যদি কমান্ডটি ব্যর্থ হয় কমান্ড তালিকার সাথে সাথে কিছুক্ষণ পরে বা কীওয়ার্ড অবধি ব্যর্থ হয় তবে পরীক্ষার অংশ যদি নীচের অংশে বা এলিফ সংরক্ষিত শব্দের সাথে থাকে, একটি && বা ││ তালিকার বাইরে চালানো কোনও কমান্ডের অংশ বাদে চূড়ান্ত && বা following অনুসরণ করে কমান্ড , পাইপলাইনে কোনও কমান্ড শেষ কিন্তু শেষ, অথবা যদি কমান্ডের ফেরতের মানটি উল্টানো হচ্ছে !


দীর্ঘ দিন ধরে এই বাশ দেওয়া হয়েছে - এটি সঠিকভাবে কার্যকর হয়নি, এমন হতে পারে যে ডকুমেন্টেশন এখনও সঠিক হয়নি। পাঠ্যটি যেমন ব্যাশ -৩.x ম্যান পৃষ্ঠার সাথে অভিন্ন বলে মনে হচ্ছে, দয়া করে নোট করুন: bash4.0 এর পূর্বে সমস্ত বাশ সংস্করণ ভুলভাবে প্রয়োগ করেছে e
স্কিলি

আরও মনে রাখবেন যে
পসিক্সের মানটিও

1
@ শিচিলি দয়া করে পয়েন্টারগুলি দিন যেখানে কোনওটি খুঁজে পেতে পারে যে -'র 'সঠিক' আচরণটি কী, ব্যাশ <4 কী আলাদাভাবে করেছে এবং পসিকসে কী পরিবর্তন হয়েছিল।
zwol

ব্যাশ -৩ এর বাগগুলি মূলত এটিকে অযোগ্য করে তোলে makeকারণ এটি সর্বদা ত্রুটিতে প্রস্থান করে না। সম্পর্কিত পসিএক্স
স্কিচলি

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