جدول E-1. کدهای خروج ذخیره شده Exit Codes
کد خروج | معنی | مثال | توضیحات |
---|---|---|---|
1 | کدی برای خطاهای عمومی | let "var1 = 1/0" | خطاهای مختلف، از قبیل «تقسیم بر صفر» و سایر عملیات غیر مجاز |
2 | استفاده نادرست از دستورات داخلی پوسته (بر طبق مستندات Bash) | empty_function() {} | غیبت کلید واژه یا فرمان، یا مشکل مجوز (و کد برگشتی diff در یک مقایسه ناموفق فایل باینری). |
126 | فرمان احضار شده نمیتواند اجرا گردد | /dev/null | مشکل مجوز یا فرمان یک فایل اجرایی نیست |
127 | «فرمان پیدا نشد» | illegal_command | مشکل احتمالی با $PATH یا یک اشتباه تایپی |
128 | شناسه نامعتبر برای exit | exit 3.14159 | exit فقط شناسههای صحیح در محدوده 0 تا 255 قبول می کند (زیرنویس اول را ببینید) |
128+n | خطای مهلک سیگنال «n» | kill -9 $PPID of script | $? کد 137 (128 + 9) را برگشت میدهد |
130 | اسکریپت به وسیله Control-C خاتمه داده شد | Ctl-C | Control-C یک سیگنال خطای مهلک 2 است، (130 = 128 + 2، بالا را ببینید) |
255* | وضعیت خروجِ خارج از حدود مجاز | exit -1 | exit فقط شناسههای عدد صحیح در محدوده 0 تا 255 میگیرد |
مطابق جدول فوق، کدهای خروجِ 1 - 2، 126 - 165، و 255 [1] دارای معانی خاصی هستند، و بنابراین کاربر باید از مشخص نمودن آنها به عنوان پارامتر exit پرهیز نماید. خاتمه یک اسکریپت با exit 127 به طور حتم موقع عیبیابی باعث سر در گمی میشود (آیا کد یک خطای «command not found» است یا یک خطای تعیین شده کاربر؟). به هر حال بسیاری از اسکریپتها یک exit 1 را به عنوان یک خطای کلی خروج به محض خطا، به کار میبرند. چون کد خروج 1 دلالت بر بسیاری از خطاهای محتمل مینماید، این مخصوصاً در اشکالزدایی مفید نیست.
کوششی برای با قاعده نمودن شمارههای وضعیت خروج به عمل آمده است (/usr/include/sysexits.h را ببینید)، اما این استاندارد برای برنامهنویسان C و C++ طراحی گردیده است. یک استاندارد مشابه برای اسکریپتنویسی میتواند مناسب باشد. نویسنده این سند منحصر نمودن کدهای خروج تعریف شده کاربر به محدوده 64 تا 113 (به اضافه 0 برای موفقیت) را، برای همنوایی با استاندارد C/C++ پیشنهاد میکند. این پیشنهاد 50 کد معتبر را تخصیص خواهد داد، و عیبیابی اسکریپتها را آسانتر میسازد. [2] تمام کدهای خروج تعریف شده کاربر در مثالهای همراه این سند از این استاندارد پیروی می کنند، به جز در جایی که شرایط موجود آن را باطل میکند، همچون در مثال 9-2.
پس از خروج اسکریپت پوسته، صادر نمودن یک $? از خط فرمان، فقط از اعلان Bash یا sh نتایج سازگار با جدول فوق را ارایه میدهد. اجرای C-shell یا tcsh ممکن است در برخی موارد مقادیر متفاوتی ارایه کند. |
[1] | مقادیر خروج بیرون از محدوده میتواند منجر به کدهای خروج غیر منتظره بشود. یک مقدار خروج بزرگتر از 255 یک کد خروج برابر با (modulo) باقیمانده تقسیم بر 256 را نتیجه میدهد. برای مثال، exit 3809 یک کد خروج 225 (3809 % 256 = 225) ارایه میدهد. |
[2] | یک به روزآوری از /usr/include/sysexits.h کدهای خروج استفاده نشده قبلی 64 - 78 را واگذار میکند. شاید پیشبینی شده باشد که محدوده کدهای خروج اختصاص نیافته در آینده بیشتر محدود خواهد شد. نویسنده این سند برای همنوایی با تغییر استاندارد، اصلاحاتی روی مثالهای اسکریپتنویسی انجام نخواهد داد. این نباید باعث مشکلی بشود، چون هیچ همپوشانی یا تصادمی در کاربرد کدهای خروج بین باینریهای کامپایل شده C/C++ و اسکریپتهای پوسته وجود ندارد. |