নমচা ​​দেওয়ার ক্ষেত্রে গ্রেপকে প্রস্থান করা থেকে বিরত করুন


29

এই স্ক্রিপ্টটি "পরে" প্রতিধ্বনি দেয় না:

#!/bin/bash -e

echo "before"

echo "anything" | grep e # it would if I searched for 'y' instead

echo "after"
exit

আমি -eশেবাং লাইনের বিকল্পটি সরিয়ে দিলে এটিও চাইবে , তবে আমি ত্রুটি থাকলে আমার স্ক্রিপ্টটি থামিয়ে দিতে চাই। আমি গ্রা্যাপের কোনও মিল খুঁজে পাওয়া ত্রুটি হিসাবে বিবেচনা করি না। আমি কীভাবে এটিকে এত তাড়াতাড়ি বেরিয়ে আসা থেকে আটকাতে পারি?


এটি কেবল পর্যবেক্ষণের জন্য বিবেচিত servation সম্ভবত এই লিপির যুক্তিটি আবার চিন্তা করা উচিত। যদি স্ট্রিংটি খুঁজে পাওয়া গুরুত্বপূর্ণ না হয় তবে এটি কেন অনুসন্ধান করবেন? গ্রেপের সংজ্ঞাটি এমন যে স্ট্রিংয়ের উপস্থিতি বা অনুপস্থিতির ভিত্তিতে সিদ্ধান্ত নেওয়া হয়। আপনি যদি কোনওভাবেই যত্নশীল না হন তবে তা গুরুত্বপূর্ণ নয়। এছাড়াও, মনে হয় -eআপনি যত্ন নিচ্ছেন: এতো বেশি যে কোনও সমস্যা বিপর্যয়কর।
অ্যান্ড্রু ফালঙ্গা

2
@ অ্যান্ড্রুফালঙ্গা আমি যেভাবেই যত্ন নিচ্ছি যেহেতু আমি আসলে যে বিষয়বস্তুটি নালাগুলি বিশ্লেষণ করছি var=$(complex command | grep complex_pattern)(যে ক্ষেত্রে আমার প্রোগ্রামটি শেষ না হওয়া উচিত)। এটি কেবল একটি সিদ্ধ ডাউন স্ক্রিপ্ট যা সমস্যা দেখা দেয়। এখানে যুক্তিতে কোন রূপকীয় ব্ল্যাকহোল নেই, তাই না? ;)
আইগো-লিটো

আপনি আউটপুট ক্যাপচার করার ইচ্ছা নিয়েছিলেন তা এখন জানা কিছু বিষয় স্পষ্ট করে। হিসাবে উপস্থাপিত, এটা আমার কাছে বিভ্রান্তিকর ছিল।
অ্যান্ড্রু ফালঙ্গা

উত্তর:


33
echo "anything" | grep e || true

ব্যাখ্যা:

$ echo "anything" | grep e
### error
$ echo $?
1
$ echo "anything" | grep e || true
### no error
$ echo $?
0
### DopeGhoti's "no-op" version
### (Potentially avoids spawning a process, if `true` is not a builtin):
$ echo "anything" | grep e || :
### no error
$ echo $?
0

"||" "বা" এর অর্থ। কমান্ডের প্রথম অংশটি যদি "ব্যর্থ" হয় (যার অর্থ "গ্রেপ ই" একটি শূন্য-বহির্গমন কোডটি দেয়) তবে "||" এর পরে অংশটি এক্সিকিউট করা হয়, সফল হয় এবং প্রস্থান কোড হিসাবে শূন্য ফিরে আসে ( trueসর্বদা শূন্য ফেরায়)।


3
এটির সংক্ষিপ্ত আকারের সংক্ষিপ্ততর সংস্করণ /bin/trueহ'ল: command || :(সুতরাং আপনার ক্ষেত্রে, set -e; grep 'needle' haystack || :)।
ডোপঘোতি

1
@ দোপগোতি, trueকয়েকটি শেলের মধ্যে অন্তর্নির্মিত (কমপক্ষে bash 4.3
আরএইচইএল-

3
বৈধ নয় কারণ প্রথম কমান্ড ব্যর্থ হলে এটি ত্রুটিটি আড়াল করবে। পাইপে প্রথম কমান্ড ব্যর্থ হলে একটি সঠিক সমাধান শূন্যহীনকে ফিরে আসা উচিত।
সোরিন

11

নিরাপদে এবং allyচ্ছিক grep বার্তাগুলির একটি শক্তিশালী উপায় :

echo something | grep e || [[ $? == 1 ]] ## print 'something', $? is 0
echo something | grep x || [[ $? == 1 ]] ## no output, $? is 0
echo something | grep --wrong-arg e || [[ $? == 1 ]] ## stderr output, $? is 1

পিক্স ম্যানুয়াল অনুসারে , প্রস্থান কোড 1 এর অর্থ কোনও লাইন নির্বাচিত নয় এবং> 1 এর অর্থ একটি ত্রুটি।


1
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, যেহেতু এটি কেবল সতর্কীকরণের প্রস্থান কোড (1) দমন করে যদি গ্রেপ কিছু না পায় তবে তবুও এটি সত্য ত্রুটিগুলি (প্রস্থান কোড> 1) কেটে যায়। এখানে অন্যান্য সমাধানগুলি সর্বদা সত্য ত্রুটিগুলি দমন করে, যা সাধারণত খারাপ।
হ্যারল্ডফিন্চ

7

অন্য বিকল্পটি হ'ল পাইপলাইনে আরেকটি কমান্ড যুক্ত করা - যা ব্যর্থ হয় না:

echo "anything" | grep e | cat

যেহেতু catএখন পাইপলাইনের শেষ কমান্ড, এটি পাইপলাইনটি ব্যর্থ হয়েছে কি না তা নির্ধারণের জন্য এটির প্রস্থান স্থিতি cat, নয় grep,



3

সমাধান

#!/bin/bash -e

echo "before"

echo "anything" | grep e || : # it would if I searched for 'y' instead

echo "after"
exit

ব্যাখ্যা

set -e অথবা set -o errexit

একটি পাইপলাইন (যা একটি সাধারণ কমান্ড সমন্বিত থাকতে পারে ), একটি তালিকা , বা একটি যৌগিক কমান্ড ( SHELL GRAMMARউপরে দেখুন) অবিলম্বে প্রস্থান করুন, যদি শূন্য-শর্তহীন স্থিতি উপস্থিত হয়। শেলটি প্রস্থান করে না যদি কমান্ডটি ব্যর্থ হয় তাত্ক্ষণিকভাবে একটি whileবা untilকীওয়ার্ড অনুসরণ করে কমান্ড তালিকার একটি অংশ হয়, পরীক্ষার অংশ ifবা elifসংরক্ষিত শব্দের পরে পরীক্ষার অংশ, কোনও আদেশের একটি অংশ &&বা ||চূড়ান্ত অনুসারে কমান্ড ব্যতীত একটি তালিকাতে কার্যকর করা হয়&& বা ||কোন পাইপলাইনে কমান্ডটি কিন্তু শেষ, অথবা যদি কমান্ডের ফেরতের মানটি উল্টানো হয়!। সাবসেল ব্যতীত অন্য কোনও যৌগিক কমান্ড যদি শূন্য-স্থিতি স্থিতি দেয় কারণ একটি কমান্ড -eউপেক্ষা করার সময় ব্যর্থ হয়, শেলটি প্রস্থান করে না। ERRশেলটি প্রস্থান করার আগে একটি ট্র্যাপ অন সেট করা থাকলে তা কার্যকর করা হয়। এই বিকল্পটি শেল এনভায়রনমেন্ট এবং প্রতিটি উপ-শেল এনভায়রনমেন্টের জন্য আলাদাভাবে প্রয়োগ করা হয় ( COMMAND EXECUTION ENVIRONMENTউপরে দেখুন), এবং সাবশেলের সমস্ত কমান্ড কার্যকর করার আগে সাবশেলগুলি প্রস্থান করতে পারে।

প্লাস, :বাশ-এ নো-ইফেক্ট কমান্ড।

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