প্রস্থান কোডের ক্ষেত্রে বাশ ফাংশনগুলিতে returnএবং exitস্টেটমেন্টের মধ্যে পার্থক্য কী ?
প্রস্থান কোডের ক্ষেত্রে বাশ ফাংশনগুলিতে returnএবং exitস্টেটমেন্টের মধ্যে পার্থক্য কী ?
উত্তর:
থেকে man bashউপর return [n];
কোনও ক্রিয়াকলাপ কার্যকর করা বন্ধ করে এবং তার দ্বারা কলকারীকে n দ্বারা নির্দিষ্ট করা মানটি ফেরত দেয়। যদি এন বাদ দেওয়া হয় তবে ফাংশন বডিতে শেষ আদেশটি কার্যকর করা হবে বলে প্রত্যাবর্তন স্থিতি।
... চালু exit [n]:
এন এর একটি স্ট্যাটাস দিয়ে শেলটি প্রস্থান করার কারণ দিন। যদি n বাদ দেওয়া হয় তবে প্রস্থান স্থিতি হ'ল শেষ আদেশটি কার্যকর করা হয়। শেলটি শেষ হওয়ার আগে এক্সআইটি-তে একটি ফাঁদ কার্যকর করা হয়।
সম্পাদনা করুন:
আপনার প্রশ্নের সম্পাদনা অনুসারে, প্রস্থান কোডগুলি সম্পর্কে প্রস্থান কোডগুলির returnসাথে কোনও সম্পর্ক নেই। প্রস্থান কোডগুলি ক্রিয়াকলাপ নয়, অ্যাপ্লিকেশন / স্ক্রিপ্টগুলির উদ্দেশ্যে । সুতরাং এই ক্ষেত্রে, একমাত্র কীওয়ার্ড যা স্ক্রিপ্টের প্রস্থান কোড নির্ধারণ করে (যেটি $?শেল ভেরিয়েবল ব্যবহার করে কলিং প্রোগ্রামের দ্বারা ধরা যেতে পারে ) exit।
সম্পাদনা 2:
আমার শেষ বিবৃতি উল্লেখ exitকরে কিছু মন্তব্য ঘটছে। আলাদা হয়েছিল returnএবং exitও.পি. বোঝার জন্য, এবং আসলে, এ কোন একটি প্রোগ্রাম / শেল স্ক্রিপ্ট দেওয়া পয়েন্ট, exitকলিং প্রক্রিয়া করতে আপনার একটি প্রস্থান কোড সহ স্ক্রিপ্ট বিভক্তি একমাত্র উপায়।
প্রতিটি কমান্ড শেলের মধ্যে মৃত্যুদন্ড কার্যকর একটি স্থানীয় "প্রস্থান কোড" উত্পাদন করে: এটা সেট করে $?যে কোড পরিবর্তনশীল, এবং ব্যবহার করা যেতে পারে if, &&এবং শর্তসাপেক্ষে অন্যান্য অপারেটরদের অন্যান্য কমান্ডগুলো।
এই প্রস্থান কোডগুলি (এবং $?ভেরিয়েবলের মান) প্রতিটি কমান্ড প্রয়োগের মাধ্যমে পুনরায় সেট করা হয়।
ঘটনাক্রমে, স্ক্রিপ্ট দ্বারা সম্পাদিত শেষ কমান্ডের প্রস্থান কোডটি কলিং প্রক্রিয়া দ্বারা প্রদর্শিত স্ক্রিপ্টের নিজেই প্রস্থান কোড হিসাবে ব্যবহৃত হয়।
অবশেষে, ফাংশনগুলি, যখন ডাকা হয়, প্রস্থান কোডের সাথে শেল কমান্ড হিসাবে কাজ করে। ফাংশনের প্রস্থান কোড (ফাংশনের মধ্যে ) ব্যবহার করে সেট করা হয়েছে return। সুতরাং যখন একটি ফাংশন return 0চালানো হয়, ফাংশন সম্পাদন সমাপ্ত হয়, 0 এর একটি প্রস্থান কোড দেয়।
func(){ return 50; };func;echo $?50 প্রতিধ্বনিত হয় So সুতরাং $?শেল ভেরিয়েবলটি সীমাবদ্ধ বলে মনে হয় না exit।
$?সর্বাধিক সম্পাদিত সম্পাদিত অগ্রভাগের পাইপলাইনটির প্রস্থান স্থিতিতে প্রসারিত হয়" " সেই প্রস্থানটি শেল থেকে কল আকারে exit(বা স্ক্রিপ্টের শেষে আঘাত করা) আকারে বা returnকোনও ফাংশনের মধ্যে কল আকারে হতে পারে।
$? বর্তমান প্রক্রিয়া / স্ক্রিপ্টটিexit এই স্ক্রিপ্ট দ্বারা সম্পাদিত শেষ কমান্ডের ফলাফলের মধ্যেই সীমাবদ্ধ is সুতরাং, যদি আপনার শেষ স্ক্রিপ্ট লাইনটি সেই ফাংশনটিতে কল হয় এবং সেই ফাংশনটি 50 টি প্রত্যাবর্তন করে, হ্যাঁ, $?আপনি যে প্রক্রিয়াটিতে আপনাকে উত্পাদন করেছেন এটি 50 হয় However তবে যাইহোক, এটির সাথে কোনও সম্পর্ক নেই returnকারণ এটি হ'ল বর্তমান স্ক্রিপ্টে সীমাবদ্ধ। কেবলমাত্র এই ফাংশন কলটি স্ক্রিপ্টের শেষ বাক্য হলে তা ফেরত আসবে। exitতবে, সর্বদা স্ক্রিপ্ট শেষ করুন এবং $? কলিং প্রক্রিয়া হিসাবে সেই মানটি ফিরিয়ে দিন ।
returnপ্রস্থান কোডগুলির সাথে কোনও সম্পর্ক নেই।" পরীক্ষা আমাকে বলে যে কোনও ফাংশনের রিটার্ন কোড এবং স্ক্রিপ্টের প্রস্থান কোডের মধ্যে কোনও কার্যকরী পার্থক্য নেই।
returnবর্তমান ফাংশনটি সুযোগের বাইরে চলে যাবে, যখন exitস্ক্রিপ্টটি বলা হয় সেখানেই শেষ হবে। এটি ব্যাখ্যা করার জন্য এখানে একটি নমুনা প্রোগ্রাম রয়েছে:
#!/bin/bash
retfunc()
{
echo "this is retfunc()"
return 1
}
exitfunc()
{
echo "this is exitfunc()"
exit 1
}
retfunc
echo "We are still here"
exitfunc
echo "We will never see this"
$ ./test.sh
this is retfunc()
We are still here
this is exitfunc()
$?।
echo fnord | while read x; do exitfunc; done; echo "still here""এখনও এখানে" মুদ্রণ করা হবে। মনে হচ্ছে whileএই দৃশ্যে কেবলমাত্র উপ-শেলটি প্রস্থান করা হয়েছে।
done || exit $?কিন্তু এটি কুরুচিপূর্ণ এবং সুনির্দিষ্ট সমতুল্য নয়।
returnthe বর্তমান ফাংশন বা উত্সাহিত স্ক্রিপ্টটি সুযোগের বাইরে চলে যাবে ```
আমি মনে করি না কেউ এই প্রশ্নের পুরোপুরি সত্যই উত্তর দিয়েছে কারণ তারা কীভাবে দুটি ব্যবহার করা হয় তা বর্ণনা করে না। ঠিক আছে আমি মনে করি আমরা জানি যে প্রস্থানটি স্ক্রিপ্টটিকে হত্যা করে, যেখানে কখনও এটি বলা হয় এবং আপনি এটিতে একটি স্থিতি নির্ধারণ করতে পারেন যেমন প্রস্থান বা প্রস্থান 0 বা প্রস্থান 7 এবং আরও অনেক কিছু। এটি অন্য স্ক্রিপ্ট ইত্যাদি দ্বারা কল করলে স্ক্রিপ্টটি কীভাবে থামাতে বাধ্য হয়েছিল তা নির্ধারণ করতে ব্যবহার করা যেতে পারে ইত্যাদি প্রস্থান করার সময় যথেষ্ট।
যখন ডাকা হয় প্রত্যাবর্তন ফাংশনটির আচরণ, সাধারণত একটি 1 বা একটি 0. নির্দেশিত মানটি ফিরিয়ে দেয় example উদাহরণস্বরূপ:
#!/bin/bash
isdirectory() {
if [ -d "$1" ]
then
return 0
else
return 1
fi
echo "you will not see anything after the return like this text"
}
এই মত চেক করুন:
if isdirectory $1; then echo "is directory"; else echo "not a directory"; fi
বা এই মত:
isdirectory || echo "not a directory"
এই উদাহরণে, পরীক্ষাটি ডিরেক্টরিটি পাওয়া গেছে কিনা তা নির্দেশ করতে ব্যবহার করা যেতে পারে। লক্ষ্য করুন যে ফিরতি পরে কিছু কার্য সম্পাদন করা হবে না। 0 টি সত্য তবে শেলের মধ্যে 1 টি মিথ্যা, অন্যান্য অগ্রগতির চেয়ে পৃথক।
ফাংশন সম্পর্কিত আরও তথ্যের জন্য: http : //www.linuxj Journal.com/content/return-values-bash-funtions
দ্রষ্টব্য: আইসডিরেক্টরি ফাংশন কেবল নির্দেশমূলক উদ্দেশ্যে for আপনি আসল স্ক্রিপ্টে এই জাতীয় বিকল্পটি কীভাবে সম্পাদন করবেন এটি এমন হওয়া উচিত নয়।
test -d $1একই ফলাফল অর্জন করতে ব্যবহার করুন । কখনই করবেন না if <check> return else return। <check>আমি জানি কমপক্ষে সমস্ত ভাষায় একই কাজ করবে।
isdirectory() { [ -d "$1" ]; }আপনার এখানে যেমন রয়েছে ঠিক তেমন আচরণ করবে: শেল ফাংশনের ডিফল্ট রিটার্ন মান, তার কোডের শেষে পৌঁছানো বা returnকোনও যুক্তি ছাড়াই, তা হ'ল অতি সাম্প্রতিক কমান্ড।
returnবিবৃতিটির আচরণের কথা বলছেন । এটি সত্য যে তাঁর উদাহরণটি সরল এবং উত্পাদন ব্যবহারে ব্যবহৃত হবে না। তবে এটি সহজ, সুতরাং এটি তার কাজটি ঠিকঠাকভাবে সম্পাদন করে। এতে কোনও ভুল নেই।
মনে রাখবেন, ফাংশনগুলি কোনও স্ক্রিপ্টের অভ্যন্তরীণ এবং সাধারণত রিটার্ন স্টেটমেন্টটি ব্যবহার করে সেখান থেকে কল করা হয়েছিল। একটি বাহ্যিক স্ক্রিপ্ট কল করা সম্পূর্ণরূপে অন্য একটি বিষয় এবং স্ক্রিপ্টগুলি সাধারণত একটি প্রস্থান বিবৃতি দিয়ে শেষ হয়।
"বহির্গমন কোডের ক্ষেত্রে BASH ফাংশনগুলিতে রিটার্ন এবং প্রস্থান বিবরণীর মধ্যে পার্থক্য" খুব কম। উভয়ই প্রতি স্থিতির মান দেয় না, কোনও স্থিতি ফিরিয়ে দেয় । শূন্যের একটি স্থিতি সাফল্যের ইঙ্গিত দেয়, অন্য কোনও স্থিতি (1 থেকে 255) ব্যর্থতা নির্দেশ করে। রিটার্ন স্টেটমেন্টটি যেখানে বলা হয়েছিল সেখান থেকে স্ক্রিপ্টে ফিরে আসবে, যখন প্রস্থান বিবরণীটি যেখানেই আসবে সেখান থেকে পুরো স্ক্রিপ্টটি শেষ করে দেবে।
return 0 # returns to where the function was called. $? contains 0 (success).
return 1 # returns to where the function was called. $? contains 1 (failure).
exit 0 # exits the script completely. $? contains 0 (success).
exit 1 # exits the script completely. $? contains 1 (failure).
যদি আপনার ফাংশনটি সহজেই কোনও রিটার্ন বিবৃতি না দিয়ে শেষ হয় তবে মৃত্যুদন্ড কার্যকর করা শেষ কমান্ডের স্ট্যাটাসটি স্ট্যাটাস কোড হিসাবে ফিরে আসে (এবং এতে স্থাপন করা হবে $?)।
মনে রাখবেন, রিটার্ন করে প্রস্থান উপলব্ধ 255 0 থেকে একটি স্থিতি কোড ফেরত দিতে, $?। আপনি স্থিতির কোডে অন্য কোনও জিনিস স্টাফ করতে পারবেন না (যেমন "বিড়াল" ফেরান); এটি কাজ করবে না. তবে, কোনও স্ক্রিপ্ট স্থিতি কোডগুলি ব্যবহার করে ব্যর্থতার জন্য 255 টি ভিন্ন কারণ পিছনে যেতে পারে।
আপনি কলিং স্ক্রিপ্টে থাকা ভেরিয়েবলগুলি সেট করতে পারেন, বা ফাংশনটির প্রতিধ্বনি এবং কলিং স্ক্রিপ্টে কমান্ড প্রতিস্থাপন ব্যবহার করতে পারেন; তবে প্রত্যাবর্তন এবং প্রস্থানের উদ্দেশ্য হ'ল স্থিতি কোডগুলি পাস করা, মান বা গণনার ফলাফল নয় যা সি এর মতো প্রোগ্রামিং ভাষায় প্রত্যাশা করতে পারে not
কখনও কখনও, আপনি .বা ব্যবহার করে স্ক্রিপ্ট চালান source।
. a.sh
যদি আপনি এর মধ্যে একটি অন্তর্ভুক্ত exitকরেন তবে a.shএটি কেবল স্ক্রিপ্টটি শেষ করবে না, তবে আপনার শেল সেশনটি শেষ করবে।
যদি আপনি এর মধ্যে একটি অন্তর্ভুক্ত returnকরেন তবে a.shএটি স্ক্রিপ্টটি প্রক্রিয়াকরণ বন্ধ করে দেয়।
return: can only 'return' from a function or sourced scriptযা এটি একটি সাধারণ স্ক্রিপ্টের জন্য অনুপযুক্ত করে তোলে।
allপরিস্থিতিতে উপযুক্ত নয় । সাব-শেল তৈরির পরিবর্তে বর্তমান শেলটিতে স্ক্রিপ্টটি ব্যবহার .বা sourceচালাচ্ছে। স্ক্রিপ্টটি এটি ব্যবহার করতে হয় তা জানতে হবে। যে ব্যবহারকারী এটির বিপরীতে কাজ করে তাদের পক্ষে দুর্ভাগ্য। ব্যক্তিগতভাবে, আমি স্ক্রিপ্টগুলি প্রথমবার চালানোর আগে সেগুলি পড়ার পরামর্শ দিই।
trapফাংশন ব্যবহার করা ERR EXITএবং তারপরে প্রথমে একটি ব্যর্থ কমান্ডের প্রস্থান কোডটি সংরক্ষণ করুন errCode=$?এবং তারপরে স্ক্রিপ্টটি (উত্সাহিত বা না) দিয়ে বেরিয়ে আসুন return $errCode || exit $errCodeযেখানে ||"যদি আমি ফিরে না আসতে পারি কারণ আমি ফিরে না আসতে পারি কারণ পরিবর্তে কেবল প্রস্থান করুন "।
সহজ কথায় (মূলত কোডিংয়ের ক্ষেত্রে নবাগত), আমরা বলতে পারি,
`return` : exits the function,
`exit()` : exits the program(called as process while running)
এছাড়াও যদি আপনি পর্যবেক্ষণ করেন তবে এটি খুব প্রাথমিক তবে ...
`return` : is the keyword
`exit()` : is the function
exitচেয়ে কম বা কম কোনও ফাংশন নেই return। তারা অন্তর্নির্মিত কমান্ড। এগুলি এমনকি সংরক্ষিত শব্দও নয়।
exitবর্তমান প্রক্রিয়া শেষ ; প্রস্থান কোড সহ বা ছাড়াই, এটিকে কোনও প্রোগ্রাম ফাংশনের চেয়ে বেশি সিস্টেম মনে করুন। মনে রাখবেন যে সোর্সিংয়ের পরে, exitশেলটি শেষ হবে, তবে চলমান সময় কেবল exitস্ক্রিপ্ট হবে।
returnকোনও ফাংশন থেকে কলটির পরে কোনও রিটার্ন কোড সহ বা ছাড়াই নির্দেশে ফিরে যান। returnalচ্ছিক এবং এটি ফাংশন শেষে অন্তর্ভুক্ত। returnশুধুমাত্র একটি ফাংশনের ভিতরে ব্যবহার করা যেতে পারে।
আমি এটি যুক্ত করতে চাই যখন এটি উত্সাহিত হওয়ার সময়, exitশেলটি না মেরে কোনও ফাংশন থেকে স্ক্রিপ্টের পক্ষে সহজ নয় । আমি মনে করি, একটি পরীক্ষা 'স্ক্রিপ্ট' স্ক্রিপ্টে আরও ভাল
#!/bin/bash
function die(){
echo ${1:=Something terrible wrong happen}
#... clean your trash
exit 1
}
[ -f /whatever/ ] || die "whatever is not available"
# now we can proceed
echo "continue"
নিম্নলিখিত করছেন:
user$ ./test
Whatever is not available
user$
test -আর - শেলটি বন্ধ হয়ে যাবে।
user$ . ./test
Whatever is not available
কেবলমাত্র testশেষ হবে এবং প্রম্পটটি প্রদর্শিত হবে।
সমাধানটি হ'ল সম্ভাব্য পদ্ধতিটি (এবং এর সাথে সংযুক্ত করা)
#!/bin/bash
function die(){
echo $(1:=Something terrible wrong happen)
#... clean your trash
exit 1
}
( # added
[ -f /whatever/ ] || die "whatever is not available"
# now we can proceed
echo "continue"
) # added
এখন, উভয় ক্ষেত্রেই কেবল testপ্রস্থান করা হবে।
(এবং )সেই অবরুদ্ধটিকে একটি সাব-শেলের মধ্যে রাখে, কার্যকরভাবে .(উত্স) কমান্ডটি অ-করণ করে এমনভাবে দেখা যায় যে আপনি পরীক্ষার স্ক্রিপ্টটি সাধারনত চালিত করেছেন যা একটি সাব-শেলের মধ্যে রয়েছে। যদি স্ক্রিপ্টটি চালিত হয় না .বা sourceতারপরে আপনার কাছে কার্যকরভাবে দুটি সাব-শেল রয়েছে।
ওপির প্রশ্ন: বহির্গমন কোডের ক্ষেত্রে BASH ফাংশনে রিটার্ন এবং প্রস্থান বিবৃতিটির মধ্যে পার্থক্য কী?
পরিষ্কারভাবে, কিছু স্পষ্টকরণ প্রয়োজন:
উপরের বুলেট তালিকায়, "(x | y)" থেকে সর্বদা প্রথম আইটেম বা সর্বদা দ্বিতীয় আইটেমটি যথাযথভাবে ফাংশন এবং রিটার্ন বা শেলস এবং প্রস্থান সম্পর্কে বিবৃতি পেতে চয়ন করুন।
কী স্পষ্ট হয় যে তারা উভয়ই বিশেষ পরিবর্তনশীল common এর সাধারণ ব্যবহার ভাগ করে নেয়? তারা সমাপ্তির পরে মানগুলি উপরের দিকে প্রেরণ করতে।
* এখন বিশেষ উপায়ে $? সেট করা যেতে পারে:
এটা লক্ষণীয় যে $? সাব শেলের মধ্যে প্রস্থানটি কল করে একটি মান নির্ধারণ করা যেতে পারে:
# (exit 259)
# echo $?
3
exit 259প্রতিধ্বনিত 3হয়। 259 % 256 = 3
প্রথমত, returnএকটি কীওয়ার্ড এবং exitআমার বন্ধুটি একটি ফাংশন।
এটি বলেছিল, এখানে একটি সহজ ব্যাখ্যা।
return
এটি একটি ফাংশন থেকে একটি মান প্রদান করে।
exit
এটি বর্তমান শেলটি থেকে বেরিয়ে যায় বা ত্যাগ করে।
returnকীওয়ার্ডের সময় প্রস্থানটি একটি ফাংশন । রিটার্ন কেবল প্রস্থান কোডগুলির চেয়ে অনেক বেশি যার কারণে তুলনাটি ন্যায্য নয়।
exitনা return"কীওয়ার্ড", বা, ব্যাশ ম্যানুয়াল কল তাদের, "সংরক্ষিত শব্দ" হিসেবে আছে। বাশ ফাংশনের অর্থে কোনও একটিই "ফাংশন" নয়। উভয়ই অন্তর্নির্মিত কমান্ড, বাশ ভাষায়। (সেখানে হয় একটি সি মান গ্রন্থাগার নামক ফাংশন exit(), এবং C প্রোগ্রামিং ভাষা একটি সংরক্ষিত শব্দ return, কিন্তু সেসব ব্যাশ কমান্ড দিয়ে গুলিয়ে ফেলা উচিত নয়, যদিও তাদের শব্দার্থবিদ্যা অদ্ভুতভাবে একই রকম।)
help <command>শেল বিল্টিন কী করবে তার তথ্য পেতে আপনার শেলটি টাইপ করুন। আপনার ক্ষেত্রেhelp returnএবংhelp exit