ত্রুটিতে স্ক্রিপ্ট থেকে প্রস্থান করুন


141

আমি একটি শেল স্ক্রিপ্ট তৈরি করছি যা এর ifমতো একটি ফাংশন রয়েছে :

if jarsigner -verbose -keystore $keyst -keystore $pass $jar_file $kalias
then
    echo $jar_file signed sucessfully
else
    echo ERROR: Failed to sign $jar_file. Please recheck the variables
fi

...

আমি চাই ত্রুটি বার্তাটি প্রদর্শনের পরে স্ক্রিপ্টটির সম্পাদন শেষ হবে। আমি কীভাবে এটি করতে পারি?

উত্তর:


137

আপনি খুঁজছেন exit?

এটি চারপাশের সেরা বাশ গাইড। http://tldp.org/LDP/abs/html/

প্রেক্ষাপটে:

if jarsigner -verbose -keystore $keyst -keystore $pass $jar_file $kalias
then
    echo $jar_file signed sucessfully
else
    echo ERROR: Failed to sign $jar_file. Please recheck the variables 1>&2
    exit 1 # terminate and indicate error
fi

...


এই বাশ লিঙ্কগুলি দুর্দান্ত! বাশএফএকিউটি বাশআরসিপস হিসাবে আরও ভাল অবস্থানে থাকবে।
পিট অ্যালভিন

337

আপনি যদি set -eকোনও স্ক্রিপ্টে রাখেন , এর অভ্যন্তরের কোনও কমান্ড ব্যর্থ হওয়ার সাথে সাথে স্ক্রিপ্টটি সমাপ্ত হবে (অর্থাত্ কোনও আদেশ কমন একটি ননজারো স্থিতি দেয়)) এটি আপনাকে নিজের বার্তা লিখতে দেয় না, তবে প্রায়শই ব্যর্থ কমান্ডের নিজস্ব বার্তা যথেষ্ট।

এই পদ্ধতির সুবিধাটি হ'ল এটি স্বয়ংক্রিয়: আপনি কোনও ত্রুটির ক্ষেত্রে মোকাবেলা করতে ভুলে যাওয়ার ঝুঁকিটি চালান না।

কমান্ডগুলির যার স্থিতি শর্তসাপেক্ষে পরীক্ষা করা হয় (যেমন if, &&বা ||) স্ক্রিপ্টটি শেষ করে না (অন্যথায় শর্তসাপেক্ষ অর্থহীন হবে)। মাঝে মাঝে কমান্ডের একটি প্রতিমা যার ব্যর্থতা গুরুত্বপূর্ণ নয় command-that-may-fail || true। আপনি set -eস্ক্রিপ্টের একটি অংশের সাথেও বন্ধ করতে পারেন set +e


3
মাইউইকি.ইউইউইলজিইআরইউজিএন / বাশএফএকিউ १०০৫ - এর মতে - এই বৈশিষ্ট্যটির অনিশ্চিত ও সংশ্লেষিত হওয়ার ইতিহাস রয়েছে যা নির্ধারণ করে যে কমান্ডগুলির ত্রুটি কোডগুলি স্বয়ংক্রিয়ভাবে প্রস্থান করতে পারে। তদ্ব্যতীত, "নিয়মগুলি একটি বাশ সংস্করণ থেকে অন্যটিতে পরিবর্তিত হয়, কারণ বাশ এই 'বৈশিষ্ট্যটির' অত্যন্ত পিচ্ছিল পোসিক্স সংজ্ঞা ট্র্যাক করার চেষ্টা করে। আমি @Dennis উইলিয়ামসন এবং গৃহীত উত্তর সাথে একমত stackoverflow.com/questions/19622198/... ব্যবহার ফাঁদ 'error_handler' ছিল ERR -। ফাঁদ হলেও!
বন্ডলিন

3
আপনার প্রোগ্রামটি যেখানে প্রস্থান -xকরতে চলেছে সেখানে প্রায়শই পতাকা সহ পতাকা ব্যবহার করা -eআপনার ট্রেস যথেষ্ট। এর দ্বারা বোঝা যায় যে স্ক্রিপ্টটির ব্যবহারকারীও বিকাশকারী।
অ্যালেক্স

দুর্দান্ত তবে আমি মনে করি একটি স্ব-সংজ্ঞায়িত ব্যতিক্রম থেকে স্ক্রিপ্টটি প্রস্থান করার জন্য ওপি দরকার ছিল।
ভিডিজেন

42

অন্ধভাবে প্রস্থান করার পরিবর্তে আপনি যদি কোনও ত্রুটি পরিচালনা করতে চান তবে ব্যবহারের পরিবর্তে সিউডো সিগন্যালে set -eএকটি ব্যবহার trapকরুন ERR

#!/bin/bash
f () {
    errorCode=$? # save the exit code as the first thing done in the trap function
    echo "error $errorCode"
    echo "the command executing at the time of the error was"
    echo "$BASH_COMMAND"
    echo "on line ${BASH_LINENO[0]}"
    # do some error handling, cleanup, logging, notification
    # $BASH_COMMAND contains the command that was being executed at the time of the trap
    # ${BASH_LINENO[0]} contains the line number in the script of that command
    # exit the script or return to try again, etc.
    exit $errorCode  # or use some other value or do return instead
}
trap f ERR
# do some stuff
false # returns 1 so it triggers the trap
# maybe do some other stuff

অন্যান্য যাত্রীর সঙ্গের নিজলটবহর স্বাভাবিক ইউনিক্স সংকেত প্লাস অন্যান্য ব্যাশ ছদ্ম সংকেত সহ অন্যান্য সংকেত, হ্যান্ডেল করতে সেট করা যেতে পারে RETURNএবং DEBUG


8

এটি করার উপায় এখানে:

#!/bin/sh

abort()
{
    echo >&2 '
***************
*** ABORTED ***
***************
'
    echo "An error occurred. Exiting..." >&2
    exit 1
}

trap 'abort' 0

set -e

# Add your script below....
# If an error occurs, the abort() function will be called.
#----------------------------------------------------------
# ===> Your script goes here
# Done!
trap : 0

echo >&2 '
************
*** DONE *** 
************
'

স্টারারের কাছে কেন ডোন বার্তা নেই?
ম্যাটবিয়ানকো

1
এটি একটি সাধারণ অনুশীলন তাই আপনার স্ক্রিপ্ট আউটপুটটি স্টাডআউটে পাইপ করতে পারেন যাতে অন্য কোনও প্রক্রিয়া মাঝখানে তথ্য বার্তা না রেখেই এটি পেতে পারে।
সুপারকোবার

2
স্টাডারের উপর যে কোনও কিছুকে সমস্যার ইঙ্গিত হিসাবে বিবেচনা করা সম্ভবত সমান প্রচলিত অভ্যাস।
ম্যাটবিয়ানকো

1
অতীতে 'সেট-ই' সর্বদা আমার পক্ষে কাজ করেছিল তবে আজ রাতে আমি আলপাইন লিনাক্স ডকারের চিত্রের এমন একটি পরিস্থিতি পেরিয়ে গিয়েছিলাম যেখানে এর কোনও প্রভাব ছিল না .. এই সমাধানটি আমার পক্ষে কাজ করেছে এবং আমাকে হাতের কাজটিতে ফিরে পেয়েছে। অনেক প্রশংসিত.
সিনথেসাইজারপেটেল

@ সুপেরকোবড়া সাধারণ অনুশীলন? কোথায়?
থরবজর্ন রাভন অ্যান্ডারসন

-8

exit 1আপনার যা দরকার তা হল। 1তাই আপনি এটি যদি তুমি চাও বলে পরিবর্তন করতে পারেন, একটি ফিরতি কোড 1একটি সফল রান মানে এবং -1একটি ব্যর্থতা বা ওই জাতীয় কিছু মানে।


13
ইউনিক্সে, সাফল্য সর্বদা 0 থাকে using ব্যবহার testবা &&বা ব্যবহারের সময় এটি সহায়তা করতে পারে ||
mouviciel

5
মউভিচিলের মন্তব্যে প্রসারিত করার জন্য: শেল স্ক্রিপ্টগুলিতে 0 সর্বদা সাফল্য এবং 1 থেকে 255 এর অর্থ ব্যর্থতা। -1 এর সীমা ছাড়িয়ে গেছে (এবং প্রায়শই 255 এর মতোই প্রভাব ফেলবে, সুতরাং 1 এর মতো ব্যর্থতা)।
গিলস 'অশুভ হওয়া বন্ধ করুন'

@ মউভিসিয়েল, @ গিলস: অতিরিক্ত তথ্যের জন্য ধন্যবাদ। আমি বাশকে ডিল করার পরে অনেকক্ষণ হয়ে গেছে।
ডিজিএইচ

এটি রিটার্ন কোড ব্যবহারের একটি খারাপ উদাহরণ, অন্যথায় এটি দুর্দান্ত উত্তর হবে।
ব্র্যাড কোচ

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