ادامه یادداشت قبل
3. توصیفگرهای فایل
توصیفگرهای فایل (به طور کوتاه: FDها) روشی برای ارجاع برنامهها به فایلها، یا منابع دیگری که همانند فایلها کارمیکنند( از قبیل لولهها،دستگاهها، سوکتها، یا ترمینالها ) میباشند. FDها نوع مشابه اشارهگرها به منابع داده، یا محلهایی که اطلاعات میتوانند نوشته شوند، هستند. موقعی که چیزی از آن FD, خوانده یا در آن نوشته میشود، داده در حال نوشته شدن در منبع FD یا خوانده شدن از آن میباشد.
به طور پیشفرض، هر فرایند جدیدی با سه FD آغاز میشود. به این توصیفگرهای فایل با نامهای ورودی استاندارد، خروجی استاندارد و خطای استاندارد رجوع میشود.در حالت کوتاه شده به ترتیب stdin و stdout و stderr نامیده میشوند. در یک پوسته محاورهای، یا اسکریپت درحال اجرا در ترمینال، ورودی استاندارد طریقی است که bash کاراکترهای تایپ شده توسط شما در صفحه کلیدتان را میبیند. خروجی استاندارد جایی است که برنامه اکثر اطلاعات معمولیاش را به طوری که کاربر بتواند آن را ببیند، ارسال میکند، و خطای استاندارد جایی است که برنامه پیغامهای خطایش را میفرستد. آگاه باشید که برنامههای کاربردی رابط گرافیگی هنوز به همین روش عمل میکنند، اما رابط گرافیگی واقعی کاربر از طریق این FDها کار نمیکند.برنامههای رابط گرافیکی هنوز میتوانند از FDهای استاندارد بخوانند یا در آنها بنویسند، اما به طور معمول چنین نمیکنند. معمولاً، آنها تمام ارتباط متقابل با کاربر را از راه آن GUI انجام میدهند، که کنترل آن برای BASH را دشوار میسازد. در نتیجه، ما در برنامههای کاربردی ساده ترمینال خواهیم ماند. برنامههایی، که به آسانی دادهها را به ورودی استانداردشان بخورانیم، و دادهها را از خروجی استاندارد و خطای استانداردشان بخوانیم.
اجازه بدهید کمی این تعاریف را محسوستر کنیم. در اینجا یک نمایش تجربی از چگونگی کار ورودی استاندارد و خروجی استاندارد میآوریم:
$ read -p "What is your name? " name; echo "Good day, $name. Would you like some tea?"
What is your name? lhunath
Good day, lhunath. Would you like some tea?
read دستوری است که اطلاعات را از stdin میخواند و در یک متغیر ذخیره میکند. ما تعیین نمودهایم که name آن متغیر باشد. وقتی read یک سطر اطلاعات را از stdin بخواند، خاتمه یافته و echo اجازه مییابد یک پیغام نمایش دهد. echo از stdout برای ارسال خروجیاش استفاده میکند. stdin به دستگاه ورودی پایانه شما که احتمالاً صفحه کلید شما میباشد، متصل گردیده است. stdout به دستگاه خروجی پایانه شما متصل گردیده است، که ما فرض میکنیم نمایشگر کامپیوتر شما است. در نتیجه، شما میتوانید نام خود را تایپ نموده و با یک پیغام خوشآمد گویی دوستانه در نمایشگر خود به یک فنجان چای دعوت شوید.
پس stderr چیست؟ اجازه دهید نمایش بدهیم:
$ rm secrets
rm: cannot remove `secrets': No such file or directory
بدون داشتن فایلی به نام secrets در دایرکتوری جاری خودتان، آن دستور rm با شکست مواجه خواهد شد و یک پیغام خطا در تشریح آنچه اشتباه است، نمایش میدهد. چنین پیغام خطاهایی بر حسب قرارداد در stderr نمایش داده میشوند. stderr نیز به دستگاه خروجی پایانه شما متصل گردیده است، درست مانند stdout. در نتیجه، پیغامهای خطا در نمایشگر شما نشان داده میشوند درست مانند پیغامها در stdout. به هرحال، این افتراق، جدانگاه داشتن خطاها از پیغامهای معمول برنامهها را تسهیل میکند. بعضی افراد مایل هستند تمام خروجی در stderr را به رنگ قرمز بستهبندی کنند، به طوری که بتوانند پیغامهای خطا را واضحتر ببیند. این به طور کلی قابل توصیه نیست، اما یک مثال ساده ازامکانات بسیاری است که این جدایی برای ما فراهم میکند. تکنیک رایج دیگر، نوشتن stderr در یک فایل ثبت وقایع(log file) خاص است.
تکرار مفید:
به خاطر داشته باشید موقعی که اسکریپتها را ایجاد میکنید،شما باید پیغام خطاهای سفارشی خود را به توصیفگر stderr ارسال نمایید. این یک قرارداد است و پیروی برنامههای کاربردی از قرارداد بسیار مناسب است. به همین ترتیب, به طوریکه به زودی در باره تغییر مسیر خواهید آموخت، اما اجازه دهید من به سرعت اشارهای به آن داشته باشم:
echo "Uh oh. Something went really bad.." >&2
ادامه دارد...