خروج و وضعیت خروج

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

 

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

--Chet Ramey

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

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

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

note وقتی اسکریپتی با یک فرمان 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‎ است.

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

#!/bin/bash

echo hello
echo $?    # 

lskdf      #                                                
echo $?    #   

echo

exit 113   #                               
           #

           #               
           #+  
           #                    

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

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

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

true                                    #          
echo "exit status of \"true\" = $?"     # 

! true
echo "exit status of \"! true\" = $?"   # 
#                    
#       
#
# 

true
!true
#   
# 


# 
# 
ls | bogus_command     #   
echo $?                #   

! ls | bogus_command   #  
echo $?                #   
#                
#                                     
# 

# 

Caution

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

یادداشت‌ها

[1]

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