بررسی متغیر "؟"
این متغیر وضعیت اجرای آخرین دستور را توسط یک کد با مقدار 0 تا 255 نشان می دهد. به این کد، کد خروج (Exit Code) نیز می گویند. در صورتی که مقدار متغیر ؟ برابر با صفر شود، بدین معنی است که دستور به درستی اجرا گردیده و در غیر این صورت، نشان دهنده عدم موفقیت اجرای دستور می باشد.
& مقادیر رایج برای متغیر ؟ را در چند مثال بررسی می کنیم.
* مثال 1 : مقدار متغیر ؟ برابر با صفر باشد.
همانطور که در بالا اشاره شد، در صورت اجرای صحیح یک دستور مقدار این متغیر برابر با صفر می شود.
[masih@mypc ~]$ date
Wed Jun 19 14:37:11 +0430 2019
[masih@mypc ~]$ echo $?
0
در اینجا دستور date بدون مشکل اجرا شده و زمان سیستم را در خروجی نمایش می دهد. با استفاده از دستور echo به صورت بالا، مقدار فعلی متغیر ؟ مشخص می شود. (برای دیدن مقدار یک متغیر، کافیست نام متغیر بعد از عبارت $ echo در خط فرمان قرار گیرد)
[masih@mypc ~]$ echo $نام متغیر
* مثال 2 : مقدار متغیر ؟ برابر با یک باشد.
در صورت بروز خطاهای عمومی در اجرای دستورات، مقدار متغیر ؟ برابر با یک می شود.
[masih@mypc ~]$ cd /root
bash: cd: /root: Permission denied
[masih@mypc ~]$ echo $?
1
در این مثال کاربر masih با استفاده از دستور cd قصد تغییر مکان به دایرکتوری root/ را دارد که به دلیل دارا نبودن سطح دسترسی، دستور اجرا نمیشود.
* مثال 3 : مقدار متغیر ؟ برابر با 2 باشد.
این حالت در زمانی که از دستورات Bash بصورت نادرست استفاده شود، بروز می دهد.
[masih@mypc ~]$ ls abcdef
ls: cannot access 'abcdef': No such file or directory
[masih@mypc ~]$ echo $?
2
در بالا، اجرای دستور ls برای نشان دادن محتویات دایرکتوری که وجود ندارد، با خطا همراه میشود و در نتیجه متغیر ؟ عدد 2 را بر می گرداند. در مثال زیر نیز آرگومان استفاده شده در دستور cd اشتباه می باشد.
[masih@mypc ~]$ cd -w /root
bash: cd: -w: invalid option
cd: usage: cd [-L|[-P [-e]] [-@]] [dir]
[masih@mypc ~]$ echo $?
2
* مثال 4 : مقدار متغیر ؟ برابر با 6 باشد.
[masih@mypc ~]$ curl www.learnlinux.ir
curl: (6) Could not resolve host: www.learnlinux.ir
[masih@mypc ~]$ echo $?
6
از ابزار curl برای ارسال و دریافت اطلاعات از طریق URL استفاده می شود. به دلیل عدم شناسایی آدرس توسط دستور curl ، مقدار برگشتی متغیر ؟ برابر با عدد 6 می باشد.
* مثال 5 : مقدار متغیر ؟ برابر با 126 باشد.
[masih@mypc ~]$ ll
-rw-------. 1 masih masih 29 Jun 20 12:55 test.sh
[masih@mypc ~]$ ./test.sh
bash: ./test.sh: Permission denied
[masih@mypc ~]$ echo $?
126
فایل test.sh با سطح دسترسی 600، اسکریپتی است که در زمان اجرا بدلیل نداشتن مجوز Execute، با خطا مواجه میگردد.
* مثال 6 : مقدار متغیر ؟ برابر با 127 باشد.
[masih@mypc ~]$ abcdef
bash: abcdef: command not found
[masih@mypc ~]$ echo $?
127
هر زمان که عبارت وارد شده در خط فرمان برای bash نامفهوم باشد، مقدار متغییر ؟ برابر با 127 می شود.
* مثال 7 : چنانچه اجرای یک دستور با بروز سیگنال مختل شود، مقدار متغییر ؟ چگونه محاسبه می شود؟
اگر اجرای یک فرمان با ارسال سیگنال قطع شود، مقدار متغیر ؟ برابر با جمع عدد 128 با شماره آن سیگنال می باشد. با دستور زیر میتوان لیست سیگنال های سیستم را به همراه شماره ی آن ها دید.
[masih@mypc ~]$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
برای نمایش وضعیت متغیر ؟ در زمان قطع اجرای یک دستور توسط سیگنال، بصورت زیر عمل می کنیم.
در ترمینال اول دستور زیرا اجرا می شود. دستور sleep سبب ایجاد تأخیر و عدم دسترسی به خط فرمان به مدت 500 ثانیه می گردد.
[masih@mypc ~]$ sleep 500
در ترمینال دیگری دستور ps را اجرا می کنیم. با اینکار شماره PID دستور sleep بدست می آید.
[masih@mypc ~]$ ps -a
PID TTY TIME CMD
4210 pts/1 00:00:00 sleep
4211 pts/2 00:00:00 ps
با اجرای دستور زیر فرایند انجام دستور sleep با ارسال سیگنال شماره 5 ملغی می شود.
[masih@mypc ~]$ kill -s 5 4210
در ترمینال اول پیغام زیر نمایش داده شده و خط فرمان در اختیار کاربر قرار می گیرد. در نهایت متغیر ؟ از جمع اعداد 128 و 5 برابر با 133 میشود.
Trace/breakpoint trap (core dumped)
[masih@mypc ~]$ echo $?
133
* مثال 8 : مقدار متغیر ؟ برابر با 130 باشد.
[masih@mypc ~]$ cp learnlinux.pdf /Desktop
^C
[masih@mypc ~]$ echo $?
130
در دستور بالا اجرای فرایند کپی، توسط کلیدهای Ctrl+c لغو می شود. متغیر ؟ در این حالت برابر با 130 شده که این مقدار از جمع عدد 128 با شماره سیگنال SIGINT بدست می آید.
* مثال 9 : مقدار متغیر ؟ برابر با 148 باشد.
[masih@mypc ~]$ cp learnlinux.pdf /Desktop
^Z
[masih@mypc ~]$ echo $?
148
در دستور بالا اجرای فرایند کپی، توسط کلیدهای Ctrl+z متوقف می شود. مقدار متغیر ؟ در این حالت برابر با 148 می شود.
* مثال 10 : استفاده از متغیر ؟ در اسکریپت.
متغیر ؟ کاربرد فراوانی در اسکریپت نویسی دارد، به طور مثال، زمانی که اجرای دستور فعلی منوط به اجرای صحیح دستور قبلی باشد، کاربر با بررسی مقدار این متغیر روند اجرای دستورات را کنترل می نماید.
اسکریپت زیر جهت ایجاد فایل و نمایش پیغام مناسب می باشد.
[masih@mypc ~]$ vi script.sh
touch /root/file_test
if [ $? = 0 ]
then
echo " Succeeded to created file"
else
echo "Could not create file"
fi
[masih@mypc ~]$ ./script.sh
touch: cannot touch '/root/file_test': Permission denied
Could not create file
[root@mypc ~]$ /home/masih/script.sh
Succeeded to created file
مشخص است که اجرای اسکریپت توسط کاربر masih به دلیل عدم مجوز دسترسی این کاربر به مسیر root/ با خطا همراه بوده و پیغام عدم ساخت فایل در خروجی نمایش داده می شود. و در مقابل اجرای اسکریپت توسط کاربر root به درستی انجام گرفته و پیغام ساخته شدن فایل نمایش می یابد.