قدرت و کارایی عالی خط فرمان در گنو/لینوکس (7)

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

بعنوان مثال این فرمان رو یک زمانی برای تست ارسال ایمیل در پی اچ پی بصورت لوکال بکار میبردم؛ مقداری تست راجع به Header Injection لازم داشتم که با این فرمان به سرعت و سادگی و با خودکار کردن یکسری عملیات تکراری انجام میدادم. پس این فرمان فقط یک نمونه از برتری و کاربردهای بجای خط فرمان در مقابل رابط گرافیکی رو نشون میده و لزوما مورد عمومی یا مورد نیاز شما نیست:

alias chkmail='clear; echo %%%%%%%%%%; mailx -u test </dev/null; echo "%%%%%%%%%%"; mailx -u test2 </dev/null; echo %%%%%%%%%%; if [[ -n $(ls /var/mail/) ]]; then rm -f /var/mail/*; else echo There are no files in mail directory!; fi'

البته تذکر بدم که این فرمان بصورت سردستی و برای یک کاربرد موردی، با سرعت نوشته شده و لزوما بهینه ترین حالت و خیلی هوشمندانه نوشته نشده.
این فرمان یک alias با نام chkmail درست میکنه؛ یعنی در هربار فقط با اجرای فرمان chkmail تمام فرمانها و عملیاتی که به این نام اختصاص داده شده اجرا میشه. اگر از پست قبلی یادتون باشه، کاربرد alias، خیلی شبیه به توابع شل هست. اما بهرحال تفاوتهایی دارن، و بنابراین هرکدوم موارد کاربرد و یا ترجیح خاص خودشون رو دارن.
فرمانهایی رو که به این alias اختصاص داده شدن به ترتیب ذکر میکنم (فرمانها با سمیکالن از هم جدا شدن).
- ابتدا صفحه پاک میشه. برای تر و تمیزی و راحتی چشم و اشتباه نشدن با خروجیهای قبلی خیلی مفید هست.
- بعد یک خط جداکننده چاپ میکنیم که بازهم در کار نظم و خوانایی کمک خوبی هست.
- صندوق ایمیل کاربری بنام test رو چک میکنیم (یک کاربر عادی سیستم هست). اگر ایمیل یا ایمیلهایی داشته باشه توسط برنامهء mail با مقداری اطلاعات، مثل عنوان ایمیل، چاپ میشه.
- باز یک خط جداکنندهء دیگه چاپ میکنیم.
- صندوق ایمیل (Inbox) کاربر دیگر بنام test2 رو هم با برنامهء mail تست میکنیم؛ نکته اینکه روی سیستم بنده mailx یک سیمبلیک لینک (symbolic link – تقریبا معادل فایلهای شورتکات ویندوزی) به برنامهء mail بود، اما توجه داشته باشید که باوجود یکی بودن برنامهء هدف، گاهی ممکنه فراخوانی یک برنامه با نامهای مختلف نتایج مختلفی رو دربر داشته باشه (مثلا به علت رعایت استانداردهای مختلف و تطابق رفتار با نسخه های مختلف یک برنامه یا برنامه های متفاوتی که ممکنه در یک برنامه ادغام شده باشن).
توجه کنید که ورودی استاندارد برنامهء mail رو از /dev/null (دیوایس تهی؛ معادل nul در داس و فکر میکنم شل ویندوز) به اصطلاح ریدایرکت کردیم که باعث میشه برنامه تنها با گزارش لازم خارج بشه و داخل خط فرمان برنامهء mail باقی نمونیم (که نیاز به ورودی دستی برای خروج داره). البته گاهی برنامه ها ممکنه خودشون تمهیداتی برای این نوع عملیات داشته باشن و نیازی به اینکار نباشه و از طریق آپشنهای برنامه با فرم تمیزتر و استانداردی قابل انجام باشه.
- چک میکنیم که دایرکتوری ذخیرهء ایمیل ها حاوی فایل (هایی) هست یا خیر (ایمیلهای هر کاربر در فایلی با نام کاربری خودش در این دایرکتوری ذخیره میشن). مکانیزم این فرمان و تست شرط رو دیگه توضیح نمیدم؛ به رفرنس-منوال BASH مراجعه کنید.
- اگر ایمیل وجود داشت (درواقع ادامهء فرمان و ساختار شرط قبلی هست) تمام فایلهای ایمیل رو پاک میکنیم. توجه کنید که کل محتوای دایرکتوری ایمیل پاک میشه. این خط فرمان ساده سردستی و با استفادهء موردی نوشته شده؛ براحتی میشه کاملتر و هوشمندترش کرد. خلاصه گفتم نکنه یک وقت با این فرمان تمام ایمیلهای روی سیستمتون رو (تمام کاربران) پاک کنید و فردا به بنده بد و بیراه بگید!! بنده سیستم تک کاربره ای دارم و سیستم مثلا سرور نیست؛ بنابراین میتونم براحتی هرچی داخل دایرکتوری هست، که برای تست هم ایجاد شدن، پاک کنم.
- بازهم ادامهء فرمان شرطی هست که اینبار درصورت عدم صحیح بودن شرط، یعنی درصورت عدم وجود فایل در دایرکتوری ایمیل، اجرا میشه و بسادگی پیغامی رو مبنی بر خالی بودن دایرکتوری میل چاپ میکنه تا دقیقا بفهمیم وضعیت چی بوده (و مثلا اشتباها ایمیلی به کاربر دیگه ای ارسال نشده)، وگرنه از خروجی چاپ شده توسط برنامهء mail هم میشه بیشتر اطلاعات لازم رو فهمید.

خب، شما میبینید که بسادگی با یک خط فرمان میتونیم کلی عملیات رو بصورت ترکیبی و بسیار سریع انجام بدیم. تمام این کارها با یک کلاینت ایمیل گرافیکی هم امکان پذیر هست و درواقع ابتدا بنده از چنین برنامه ای استفاده کردم (روی سیستم خودم دوتا ایمیل کلاینت گرافیکی خوب نصب بود). اما در حالت گرافیکی شما امکان برنامه ریزی و فیلتر اطلاعات مورد نیازتون و انجام خودکار یکسری عملیات مورد نیاز رو ندارید و باید همهء این مراحل رو بصورت دستی انجام بدید که هم سخت و انرژی بر هست و هم زمان بیشتری میبره، و علت مهم انجام این عملیات اضافه این بوده که از بروز اشتباه و نیاز به دقت زیاد برای تشخیص جلوگیری بشه. بطور مثال با زیاد شدن تعداد ایمیل ها میشه فهمید که ایمیل جدیدی وارد شده و ظاهرا نیازی به پاک کردن ایمیل های قبلی نیست، ولی این روش حداقل طبق تجربهء بنده نیاز به دقت و بخاطر سپاری تعداد (در اینجا برای دو کاربر) داره که مستعد خطا و صرف انرژی و وقت بیشتری هست. چون مثلا شما روی برنامه و اپلیکیشن وب خودتون تمرکز کردید و ذهنتون معطوف مسایل پیچیدهء درگیر هست؛ پس نباید بیهوده این تمرکز رو از دست بدیم و نیاز به صرف انرژی و وقت بیشتر پیدا کنیم و نهایت هم به صحت تمام تستهامون اطمینان کمتری داشته باشیم. بجای چندین کلیک هم فقط دوتا کلید از کیبورد برای انجام همهء کارها کافیه!

راستی برای ارسال ایمیل بطور دستی در خط فرمان از این فرمان میتونید استفاده کنید (شاید برای تست فرمان مطرح شده در این پست بخواید ازش استفاده کنید):

mail user

user نام کاربری هست که ایمیل براش ارسال میشه.
بعد از اجرای این فرمان وارد خط فرمان برنامهء mail میشید که در اونجا موضوع/عنوان و بدنهء ایمیل رو تایپ میکنید؛ با وارد کردن یک خط فقط محتوی یک نقطه، یا زدن Ctrl+d، پایان متن ایمیل رو اعلام کنید. اگر درخواست ورودی Cc (ارسال نسخه های کپی به کاربران دیگر) شد میتونید Enter رو برای صرفنظر از این گزینه بزنید.

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

خب امیدوارم از این مطلب خوشتون اومده باشه.
تا مجالی دیگر بدرود.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>