উত্তর:
একটি পন্থা set -e
আপনার স্ক্রিপ্টের শুরুতে যুক্ত করা হবে । এর অর্থ (থেকে help set
):
-e Exit immediately if a command exits with a non-zero status.
সুতরাং আপনার কোনও আদেশ যদি ব্যর্থ হয় তবে স্ক্রিপ্টটি প্রস্থান করবে।
বিকল্পভাবে, আপনি exit
সম্ভাব্য ব্যর্থতার পয়েন্টগুলিতে সুস্পষ্ট বক্তব্যগুলি যুক্ত করতে পারেন :
command || exit 1
set -e
এটি করতে একমাত্র উপায়।
set -e
তা হ'ল sleep
( break
একটি বিশেষ বিল্টিন হওয়ায় বেশিরভাগ শেলগুলিতে ব্যর্থতার ফলে স্ক্রিপ্টটি প্রস্থান করতে পারে, কমান্ডগুলি if
বা বামে &&
প্রভাবিত হয় না set -e
, কেবল পঠনযোগ্য n=...
হলে ব্যর্থ হতে পারে n
, তবে তারপরে এটি set -e
পাশাপাশি ছাড়াই স্ক্রিপ্ট থেকে বেরিয়ে আসবে ), যাতে ব্যাখ্যাটি বেশ অসম্ভব বলে মনে হয়। আমি সম্মত হ'ল প্রশ্নটি খারাপভাবে বলা হচ্ছে।
আপনি কীওয়ার্ডটি ব্যবহার করে যে কোনও জায়গায় কোনও স্ক্রিপ্ট থেকে বেরিয়ে আসতে পারেন exit
। আপনার প্রোগ্রামটি বা কীভাবে আপনার স্ক্রিপ্টটি ব্যর্থ হয়েছে, উদাহরণস্বরূপ exit 1
বা exit 2
ইত্যাদির জন্য এটি নির্ধারণের জন্য আপনি একটি প্রস্থান কোডও নির্দিষ্ট করতে পারেন (কনভেনশন অনুসারে, প্রস্থান কোড 0 সাফল্যের জন্য এবং 0 এর চেয়ে বড় কিছু ব্যর্থতা নির্দেশ করে; তবে কনভেনশন দ্বারা, প্রস্থানও 127 এর উপরে কোডগুলি অস্বাভাবিক সমাপ্তির জন্য সংরক্ষিত (যেমন একটি সংকেত দ্বারা))।
জেনেরিক নির্মাণ ব্যর্থতা থেকে প্রস্থান করার জন্য হয়
if [ failure condition ]; then
exit n
fi
উপযুক্ত failure condition
এবং n
। তবে নির্দিষ্ট পরিস্থিতিতে আপনি আলাদাভাবে এগিয়ে যেতে পারেন। এখন আপনার মামলার জন্য আমি আপনার প্রশ্নের ব্যাখ্যা করছি যে যদি পাঁচটি নিমন্ত্রণের মধ্যে কোনওটি gksu
ব্যর্থ হয়, তবে আপনি প্রস্থান করতে চাইছেন। একটি উপায় এই জাতীয় ফাংশন ব্যবহার করা হয়
function try_command {
for i in 1 2 3 4 5 ; do
if gksu command ; then
return 0
fi
fi
exit 1
}
এবং তারপরে, লুপটি ডেকে আনুন try_command
।
আপনার প্রশ্নের সমাধান করার জন্য আরও (আরও) উন্নত বা পরিশীলিত উপায় রয়েছে। তবে, স্টিফেনের সমাধানের চেয়ে উপরের সমাধানটি প্রাথমিকভাবে আরও অ্যাক্সেসযোগ্য।
attempt=0
until gksu command; do
attempt=$((attempt + 1))
if [ "$attempt" -gt 5 ]; then
exit 1
fi
done
exit
স্ক্রিপ্টটি না ডাকলে স্ক্রিপ্টটি প্রস্থান করে। যদি স্ক্রিপ্টের যে অংশ একটি subshell হয়, উদাহরণস্বরূপ এটা মধ্যে কারণ (...)
বা $(...)
বা নল-লাইন অংশ, তাহলে এটি শুধুমাত্র থেকে প্রস্থান করা হবে যে subshell ।
সেক্ষেত্রে আপনি যদি স্ক্রিপ্টটি সাব-শেল ছাড়াও প্রস্থান করতে চান তবে আপনাকে exit
সেই সাবশেলটি থেকে বেরিয়ে আসার জন্য কল করতে হবে ।
উদাহরণস্বরূপ, এখানে সাবস্কেলের 2 নেস্টেড স্তর সহ:
(
life=hard
output=$(
echo blah
[ "$life" = easy ] || exit 1 # exit subshell
echo blih not run
) || exit # if the subshell exits with a non-zero exit status,
# exit as well with the same exit status
echo not run either
) || exit # if the subshell exits with a non-zero exit status,
# exit as well with the same exit status
সাবস্কেল কোনও পাইপলাইনের অংশ হলে এটি আরও জটিল হয়ে উঠতে পারে। bash
একটি বিশেষ হয়েছে $PIPESTATUS
এরে, অনুরূপ zsh
'র $pipestatus
এক যে আপনি এখানে সাহায্য করতে পারেন:
{
echo foo
exit 1
echo bar
} | wc -c
subshell_ret=${PIPESTATUS[0]}
if [ "$subshell_ret" -ne 0 ]; then
exit "$subshell_ret"
fi
ট্র্যাপ সিগন্যাল পাওয়ার পরে একটি ক্রিয়া সম্পাদন করবে।
trap "echo EXIT; exit" 0
trap "echo HUP; exit" 1
trap "echo CTL-C; exit" 2
trap "echo QUIT; exit" 3
trap "echo ERR; exit" ERR
n=0
until [ $n -ge 5 ]
do
n=$[$n+1]
echo $n
sleep 3
done
এটি চালান এবং এটিকে স্বাভাবিকভাবে প্রস্থান করতে দিন। এটি 0 সিগন্যালে আটকা পড়ে।
EXIT
এটি আবার চালাও এবং ^ C এর সাথে বাধা দিন। এটি সিগন্যাল 2 এবং সিগন্যাল 0 উভয়কেই ফাঁদে ফেলে।
CTL-C
EXIT
একটি শূন্য-বহির্গমন প্রস্থান স্থিতি ERR এ ফাঁদে যাবে
ERR
EXIT
set -e
বৈশিষ্ট্যটি ব্যবহার না করে সঠিক ত্রুটি পরিচালনার ক্ষেত্রে কিছুটা চিন্তাভাবনা করব । যদিও এটি এখানে সত্যই প্রয়োগ হয় না। কমান্ডটি চালানোর জন্য 5 টি ব্যর্থ চেষ্টার পরে ওপি স্ক্রিপ্টটি থেকে বেরিয়ে যেতে চায়।