... تنگناهای مبهمی در پوسته Bourne وجود دارد، و اشخاص تمام آنها را به کار میبرند. --Chet Ramey |
فرمان exit یک اسکریپت را خاتمه میدهد، درست همانند آن در یک برنامه C. این فرمان میتواند یک مقدار را که برای پردازش والد آن قابل دسترس است، برگشت بدهد.
هر فرمانی یک وضعیت خروج برگشت میدهد (گاهی اوقات با عنوان وضعیت بازگشت یا کد خروج اشاره میشود). یک فرمان موفق 0 را برگشت میدهد، در حالیکه یک فرمان ناموفق مقداری غیر صفر را برگشت میدهد که معمولاً میتواند به عنوان یک کد خطا تفسیر گردد. فرمانها، برنامهها، و ابزارهای خوش رفتار UNIX، به محض پایان موفق یک کد خروج 0 برگشت میدهند، اگرچه تعدادی استثنا وجود دارد.
به همچنین، توابع داخل یک اسکریپت و خود اسکریپت یک وضعیت خروج برگشت میدهند. آخرین فرمان اجرا شده در تابع یا اسکریپت وضعیت خروج را تعیین میکند. داخل یک اسکریپت، یک فرمان exitnnn (که nnn باید یک عدد صحیح در محدوده 0 - 255 باشد) میتواند وضعیت خروج nnn به پوسته تحویل بدهد.
وقتی اسکریپتی با یک فرمان exit که پارامتری ندارد خاتمه مییابد، وضعیت خروج اسکریپت وضعیت خروج آخرین فرمان اجرا شده در اسکریپت (فرمان قبل از exit) است.
#!/bin/bash COMMAND_1 . . . COMMAND_LAST # exit معادل یک exit بدون پارامتر، exit $? یا حتی فقط ذکر نکردن exit است. #!/bin/bash COMMAND_1 . . . COMMAND_LAST # exit $? #!/bin/bash COMMAND1 . . . COMMAND_LAST # |
$? وضعیت خروج آخرین فرمان اجرا شده را میخواند. پس از برگشت یک تابع، $? وضعیت خروج آخرین فرمان اجرا شده در تابع را بیان میکند. این روش Bash در بیان کردن «مقدار برگشتی» توابع است.[1]
بعد از اجرای یک لوله، متغیر $? وضعیت خروج آخرین فرمان اجرا شده در لوله را بیان میکند.
پس از خاتمه یافتن یک اسکریپت، یک $? در خط فرمان، وضعیت خروج اسکریپت، یعنی آخرین فرمان اجرا شده در اسکریپت را بیان میکند، که مطابق قرارداد در صورت موفقیت، 0 یا در صورت خطا یک عدد صحیح در محدوده 1 - 255 است.
#!/bin/bash echo hello echo $? # lskdf # echo $? # echo exit 113 # # # #+ #
$? بویژه برای بررسی نتیجه یک فرمان در اسکریپت مفید است ( مثال 16-35 و مثال 16-20 را ببینید).
کاراکتر خاص !، توصیفکننده نفی منطقی، حاصل یک بررسی یا فرمان را برعکس میکند، و این بر وضعیت خروج آن تاثیر میکند.
مثال 6-2. منفی کردن یک شرط با ! true # echo "exit status of \"true\" = $?" # ! true echo "exit status of \"! true\" = $?" # # # # # true !true # # # # ls | bogus_command # echo $? # ! ls | bogus_command # echo $? # # # # # |
برخی کدهای خروج دارای معانی ذخیره شده هستند و نباید در یک اسکریپت به طور دستی استفاده شوند. |
[1] |
در آن نمونههایی که یک return پایان بخش تابع وجود ندارد. |