it-swarm.asia

الفرق بين العودة والخروج في وظائف باش

ما الفرق بين بيان return و exit في Bash فيما يتعلق برموز الخروج؟

367
lecodesportif

من man bash on return [n]؛

يؤدي إلى توقف وظيفة عن التنفيذ وإرجاع القيمة المحددة بواسطة n إلى المتصل بها. إذا تم حذف n ، تكون حالة الإرجاع هي آخر أمر تم تنفيذه في نص الدالة.

... في exit [n]:

تسبب شل للخروج مع حالة ن. إذا تم حذف n ، فإن حالة الخروج هي حالة آخر أمر تم تنفيذه. يتم تنفيذ فخ على EXIT قبل انتهاء Shell.

تصحيح:

وفقًا لتعديلك للسؤال ، فيما يتعلق برموز الخروج ، return لا علاقة له برموز الخروج. رموز الخروج مخصصة لـ التطبيقات/البرامج النصية ، وليس الوظائف. لذلك ، في هذا الصدد ، الكلمة الرئيسية الوحيدة التي تحدد رمز الخروج من البرنامج النصي (الكلمة التي يمكن اكتشافها بواسطة برنامج الاتصال باستخدام متغير $? Shell) هي exit.

تحرير 2:

بياني الأخير الذي يشير إلى exit يسبب بعض التعليقات. تم إجراء للتمييز بين return و exit لفهم OP ، وفي الواقع ، عند any / نقطة معينة من البرنامج/Shell script ، exit هي الطريقة الوحيدة لإنهاء البرنامج النصي برمز خروج إلى عملية الاتصال.

ينتج عن كل أمر تم تنفيذه في Shell "رمز خروج" محلي: إنه يعيّن المتغير $? على هذا الرمز ، ويمكن استخدامه مع if و && ومشغلين آخرين لتنفيذ أوامر أخرى بشروط.

تتم إعادة تعيين رموز الإنهاء هذه (وقيمة المتغير $?) بواسطة كل تنفيذ للأوامر.

بالمناسبة ، يتم استخدام رمز الخروج للأمر الأخير الذي تم تنفيذه بواسطة البرنامج النصي كرمز خروج للبرنامج النصي نفسه كما تراه عملية الاستدعاء.

أخيرًا ، تعمل الوظائف عند استدعاء أوامر Shell فيما يتعلق برموز الخروج. يتم تعيين رمز الخروج من الدالة ( داخل الدالة) باستخدام return. لذلك عندما يتم تشغيل دالة return 0 ، ينتهي تنفيذ الوظيفة ، مع إعطاء كود خروج 0.

271
Diego Sevilla

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()
263
SiegeX

لا أعتقد أن أحداً قد أجاب على السؤال تمامًا لأنه لا يصف كيفية استخدام الاثنين. حسنًا ، أعتقد أننا نعلم أن الإنهاء يقتل البرنامج النصي ، في أي وقت يتم استدعاؤه ويمكنك تعيين حالة له مثل الخروج أو الخروج 0 أو الخروج 7 وما إلى ذلك. يمكن استخدام هذا لتحديد كيفية فرض البرنامج النصي للتوقف عند استدعائه بواسطة برنامج نصي آخر وما إلى ذلك. كفى عند الخروج.

إرجاع عند استدعاء سيعود القيمة المحددة للإشارة إلى سلوك الدالة ، عادة ما تكون 1 أو 0. على سبيل المثال:

    #!/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 صحيح ولكن false هو 1 في Shell ، مختلف عن اللغات بروغ الأخرى.

لمزيد من المعلومات حول الوظائف: http://www.linuxjournal.com/content/return-values-bash-functions

ملاحظة: وظيفة isdirectory لأغراض تعليمية فقط. هذا لا ينبغي أن يكون كيف يمكنك تنفيذ مثل هذا الخيار في برنامج نصي حقيقي.

45
Mike Q

تذكر أن الدالات داخلية لبرنامج نصي وعادةً ما تعود من حيث تم استدعائها باستخدام عبارة الإرجاع. يعد استدعاء البرنامج النصي الخارجي مسألة أخرى تمامًا ، وعادة ما تنتهي البرامج النصية ببيان الخروج.

الفرق "بين بيان الإرجاع والخروج في وظائف 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).

إذا كانت وظيفتك تنتهي ببساطة بدون بيان إرجاع ، يتم إرجاع حالة آخر أمر تم تنفيذه كرمز الحالة (وسيتم وضعها في $?).

تذكر ، أعد وارجع رمز الحالة من 0 إلى 255 ، وهو متاح في $?. لا يمكنك إدخال أي شيء آخر في رمز الحالة (مثل إرجاع "cat") ؛ لن يعمل. ولكن ، يمكن للبرنامج النصي تمرير 255 سببًا مختلفًا للفشل باستخدام رموز الحالة.

يمكنك ضبط المتغيرات الموجودة في البرنامج النصي للاتصال ، أو صدى النتائج في الوظيفة واستخدام استبدال الأوامر في البرنامج النصي للاتصال ؛ ولكن الغرض من العودة والخروج هو تمرير رموز الحالة ، وليس القيم أو نتائج الحساب كما قد يتوقع المرء بلغة برمجة مثل C.

28
user2100135

في بعض الأحيان ، تقوم بتشغيل برنامج نصي باستخدام . أو source.

. a.sh

إذا قمت بتضمين exit في a.sh ، فلن ينهي البرنامج النصي فحسب ، بل سينهي جلسة Shell.

إذا قمت بتضمين return في a.sh ، فهذا يتوقف ببساطة عن معالجة البرنامج النصي.

20
Juraj

بكلمات بسيطة (خاصة بالنسبة للمبتدئ في الترميز) ، يمكننا القول ،

`return` : exits the function,
`exit()` : exits the program(called as process while running)

أيضا إذا لاحظت ، هذا أمر أساسي للغاية ولكن ... ،

`return` : is the keyword
`exit()` : is the function
6
Jyo the Whiff
  • exit إنهاء الحالي العملية ؛ مع أو بدون رمز الخروج ، اعتبر هذا النظام أكثر من وظيفة برنامج. لاحظ أنه عند الاستعانة بمصادر خارجية ، سينتهي exit من Shell ، ومع ذلك ، عند التشغيل سوف يقوم فقط exit بالبرنامج النصي.

  • return من دالة ، انتقل إلى التعليمات بعد المكالمة ، مع أو بدون رمز الإرجاع. return اختياري وهو ضمني في نهاية الوظيفة. return لا يمكن استخدامه إلا داخل إحدى الوظائف.

أريد أن أضيف أنه بينما يتم الحصول على المصادر ، ليس من السهل exit البرنامج النصي من داخل دالة دون قتل Shell. أعتقد ، مثال على ذلك هو أفضل في البرنامج النصي "اختبار"

#!/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 فقط.

5
fcm

سؤال البروتوكول الاختياري: ما الفرق بين بيان العودة والخروج في وظائف BASH فيما يتعلق برموز الخروج؟

بحكم الأمر ، مطلوب بعض التوضيح:

  • جملة (return | exit) غير مطلوبة لإنهاء تنفيذ (دالة | Shell). سيتم إنهاء (function | Shell) عندما يصل إلى نهاية قائمة الرموز الخاصة به ، حتى مع عدم وجود عبارة (return | exit).
  • غير مطلوب عبارة (return | exit) لتمرير قيمة مرة أخرى من إنهاء (دالة | Shell). كل عملية لديها المدمج في متغير $؟ التي لديها دائما قيمة رقمية. إنه متغير خاص لا يمكن تعيينه مثل "؟ = 1" ، ولكن يتم تعيينه بطرق خاصة فقط (انظر أدناه *). قيمة دولار؟ بعد الأمر الأخير الذي سيتم تنفيذه في (يسمى الدالة | sub Shell) هي القيمة التي يتم تمريرها مرة أخرى إلى (دالة المتصل | الأصل Shell). هذا صحيح سواء كان الأمر الأخير الذي تم تنفيذه هو ("return [n]" | "exit [n]") أو عادي ("return" أو أي شيء آخر يحدث أن يكون الأمر الأخير في رمز الوظائف المدعومة.

في القائمة النقطية أعلاه ، اختر من "(x | y)" إما العنصر الأول دائمًا أو العنصر الثاني دائمًا للحصول على عبارات حول الوظائف والعودة أو الأصداف والخروج على التوالي.

ما هو واضح هو أنهما يشتركان في الاستخدام المشترك للمتغير الخاص $؟ لتمرير القيم إلى أعلى بعد أن تنتهي.

* الآن للطرق الخاصة التي $؟ يمكن تعيين:

  • عندما تنتهي وظيفة تسمى وتعود إلى المتصل ثم $؟ في المتصل سوف تكون مساوية للقيمة النهائية لل دولار؟ في وظيفة منتهية.
  • عندما ينتظر أحد الوالدين شل بشكل صريح أو صريح على شركة شل واحدة ويتم إطلاقها بإنهاء شركة شل الفرعية ، ثم $؟ في الأصل سوف شل تساوي القيمة النهائية لل دولار؟ في إنهاء شل الفرعية.
  • يمكن لبعض وظائف المدمج في تعديل $؟ اعتمادا على النتيجة. لكن البعض لا.
  • المدمج في وظائف "العودة" و "الخروج" ، عندما تليها حجة رقمية على حد سواء $؟ بحجة ، وإنهاء التنفيذ.

تجدر الإشارة إلى أن $؟ يمكن تعيين قيمة عن طريق استدعاء الإنهاء في شركة شل فرعية ، مثل هذا:

# (exit 259)
# echo $?
3  
2
Craig Hicks

بادئ ذي بدء ، return هي كلمة رئيسية و exit صديقي وظيفة.

ومع ذلك ، إليك أبسط التفسيرات.

returnتقوم بإرجاع قيمة من دالة.

exitيخرج من أو يتخلى عن شل الحالي.

1
Ahmad Awais