فصل 6- خروج و وضعیت خروج

 

... تنگناهای مبهمی در پوسته ‎Bourne‎ وجود دارد، و اشخاص تمام آنها را به کار می‌برند.

--Chet Ramey

فرمان exit یک اسکریپت را خاتمه می‌دهد، درست همانند آن در یک برنامه C. این فرمان می‌تواند یک مقدار را که برای پردازش والد آن قابل دسترس است، برگشت بدهد.

هر فرمانی یک وضعیت خروج برگشت می‌دهد (گاهی اوقات با عنوان وضعیت بازگشت یا کد خروج اشاره می‌شود). یک فرمان موفق 0 را برگشت می‌دهد، در حالیکه یک فرمان ناموفق مقداری غیر صفر را برگشت می‌دهد که معمولاً می‌تواند به عنوان یک کد خطا تفسیر گردد. فرمانها، برنامه‌ها، و ابزارهای خوش رفتار UNIX، به محض پایان موفق یک کد خروج 0 برگشت می‌دهند، اگرچه تعدادی استثنا وجود دارد.

به همچنین، توابع داخل یک اسکریپت و خود اسکریپت یک وضعیت خروج برگشت می‌دهند. آخرین فرمان اجرا شده در تابع یا اسکریپت وضعیت خروج را تعیین می‌کند. داخل یک اسکریپت، یک فرمان exitnnn ‏(که nnn باید یک عدد صحیح در محدوده 0 - 255 باشد) می‌تواند وضعیت خروج nnn به پوسته تحویل بدهد.

note وقتی اسکریپتی با یک فرمان exit که پارامتری ندارد خاتمه می‌یابد، وضعیت خروج اسکریپت وضعیت خروج آخرین فرمان اجرا شده در اسکریپت (فرمان قبل از exit) است.

#!/bin/bash

COMMAND_1

. . .

COMMAND_LAST

#  .خارج خواهد شد COMMAND_LAST‎ با وضعیت خروج‎

exit

معادل یک exit بدون پارامتر، ‎exit $?‎ یا حتی فقط ذکر نکردن exit است.

#!/bin/bash

COMMAND_1

. . .

COMMAND_LAST

#  .خارج خواهد شد COMMAND_LAST‎ با وضعیت خروج‎

exit $?

#!/bin/bash

COMMAND1

. . . 

COMMAND_LAST

#  .خارج خواهد شد COMMAND_LAST‎ با وضعیت خروج‎

‎$?‎ وضعیت خروج آخرین فرمان اجرا شده را می‌خواند. پس از برگشت یک تابع، ‎$?‎ وضعیت خروج آخرین فرمان اجرا شده در تابع را بیان می‌کند. این روش Bash در بیان کردن «مقدار برگشتی» توابع است.[1]

بعد از اجرای یک لوله، متغیر ‎$?‎ وضعیت خروج آخرین فرمان اجرا شده در لوله را بیان می‌کند.

پس از خاتمه یافتن یک اسکریپت، یک ‎$?‎ در خط فرمان، وضعیت خروج اسکریپت، یعنی آخرین فرمان اجرا شده در اسکریپت را بیان می‌کند، که مطابق قرارداد در صورت موفقیت، 0 یا در صورت خطا یک عدد صحیح در محدوده ‎1 - 255‎ است.

مثال ‎6-1‎. خروج-وضعیت خروج

#!/bin/bash

echo hello
echo $?    # . زیرا فرمان با موفقیت اجرا گردیده است ‎0‎ برگشت دادن وضعیت خروج‎

lskdf      #                                                .فرمان ناشناخته‎
echo $?    #   .چون اجرای فرمان ناموفق بوده ‎--‎ وضعیت خروج غیر صفر برگشت شده‎

echo

exit 113   #                               .را به پوسته برگشت خواهد داد ‎113‎
           #.را تایپ کنید ‎"echo $?"‎ برای بررسی صحت این، پس از خاتمه اسکریپت‎

           #               .نشان‌دهنده موفقیت است ‎'exit 0'‎ مطابق قرارداد، یک‎
           #+  .در حالیکه مقدار غیرصفر به معنی یک خطا یا وضعیت غیر عادی است‎
           #                     .پیوست «کدهای خروج با معنای خاص» را ببینید‎

‎$?‎ بویژه برای بررسی نتیجه یک فرمان در اسکریپت مفید است ( مثال ‎16-35‎ و مثال ‎16-20‎ را ببینید).

note کاراکتر خاص !، توصیف‌کننده نفی منطقی، حاصل یک بررسی یا فرمان را برعکس می‌کند، و این بر وضعیت خروج آن تاثیر می‌کند.

مثال ‎6-2‎. منفی کردن یک شرط با !

true                                    #            ‎true‎ فرمان داخلی
echo "exit status of \"true\" = $?"     #  0

! true
echo "exit status of \"! true\" = $?"   #  1
#                     .و فرمان  لازم است ‎"!"‎ توجه کنید که یک فاصله بین‎
#       .منجر می‌شود ‎"command not found"‎ ‏(بدون فاصله) به یک خطای !true‎
#
# .‎را احضار می‌کند Bash‎ پیشوند یک فرمان، مکانیسم تاریخچه فرمان !‎ عملگر‎

true
!true
#    .این مرتبه خطایی نیست، اما نفی هم نیست‎
# .را تکرار می‌کند ‎(true)‎ این فقط فرمان قبلی‎


# ============================================================== #
# .به یک لوله وضعیت خروج برگشتی را معکوس می‌کند ‎!‎ مقدم کردن عملگر  ‎
ls | bogus_command     #    bash: bogus_command: command not found
echo $?                #    127

! ls | bogus_command   #    bash: bogus_command: command not found
echo $?                #    0
#                 .اجرای لوله را تغییر نمی‌دهد ‎!‎ توجه کنید که عملگر‎
#                                     .فقط وضعیت خروج تغییر می کند‎
# ============================================================== #

# ‎Kristopher Newsome‎ و ‎Stéphane Chazelas‎ با تشکر از

Caution

برخی کد‌های خروج دارای معانی ذخیره شده هستند و نباید در یک اسکریپت به طور دستی استفاده شوند.

یادداشت‌ها

[1]

در آن نمونه‌هایی که یک return پایان بخش تابع وجود ندارد.