آموزش‌های خط فرمانی

این وبلاگ تلاش می‌کند گامی در حد بضاعت در جهت آموزش خط فرمان و اسکریپت‌نویسی پوسته گنو-لینوکس بردارد.

آموزش‌های خط فرمانی

این وبلاگ تلاش می‌کند گامی در حد بضاعت در جهت آموزش خط فرمان و اسکریپت‌نویسی پوسته گنو-لینوکس بردارد.

سیگنال‌ها و trapها


ارسال و به دام انداختن سیگنالها

سیگنال‌ها ابزار اصلی برای ارتباطات میان‌پردازشی غیر همزمان می‌باشند. یعنی یک پردازش ‎(A)‎ می‌تواند به پردازش دیگر ‎(B)‎ بگوید در یک زمانی که به جای پردازش B توسط پردازش A انتخاب شده، کاری را انجام بدهد. (مانند جستجوی یک فایل توسط پردازش B هر چند ثانیه یکبار، این عمل polling نامیده می‌شود و زمان‌بندی آن به جای پردازش A توسط پردازش B کنترل می‌شود.)

سیستم عامل تعداد محدودی سیگنال فراهم می‌نماید که می‌توانند برای گفتن انجام کاری به یک پردازش ارسال بشوند. سیگنالها هیچ اطلاعات اضافی را حمل نمی‌کنند، تنها اطلاعاتی که پردازش به دست می‌آورد آن است که سیگنال دریافت شده است. پردازش حتی نمی‌داند که چه کسی سیگنال را ارسال نموده.

غیر از اینکه پردازش از قبل فرمان خاصی بگیرد، اکثر سیگنالها کُشنده هستند، یعنی عمل پیش‌فرضی که یک پردازش به مجرد دریافت یک سیگنال انجام خواهد داد، یک خروج بی‌درنگ است. (استثناها: SIGCHLD به طور پیش‌فرض صرفنظر می‌گردد، SIGSTOP پردازش را متوقف می‌سازد، و SIGCONT پردازش را از سر می‌گیرد.) برخی سیگنالها (از قبیل SIGQUIT) نیز باعث می‌شوند پردازش علاوه بر خروج یک فایل core باقی بگذارد.

1. تله‌ها، یا اداره‌کنندگان سیگنال

یک پردازش ممکن است به جای خروج بواسطه دریافت یک سیگنال، انجام عمل متفاوتی را انتخاب کند. این عمل توسط تنظیم یک گرداننده سیگنال (یا trap) انجام می‌شود. trap باید قبل از اینکه سیگنال دریافت شود تنظیم شده باشد. وقتی پردازش بواسطه اینکه یک trap برای آن تنظیم شده است یک سیگنال دریافت می‌کند، گفته می‌شود سیگنال را در تله انداخته است.

ساده‌ترین کاری که برای انجام دادن با یک پردازش می‌تواند انتخاب شود، نادیده گرفتن سیگنال است. قاعدتاً یک ایده نامناسب است، مگر اینکه برای یک مقصود خیلی خاص انجام گردد. صرفنظر نمودن از سیگنالها غالباً منجر به پردازشهای فراری می‌گردد که تمام قدرت CPU را مصرف می‌کنند.

به طور عمومی‌تر trapها می‌توانند برای جلوگیری کردن از یک سیگنال کُشنده، انجام پاکسازی، و سپس خروج موقرانه تنظیم گردند. برای مثال، برنامه‌ای که فایلهای موقتی ایجاد می‌کند و مایل است قبل از خروج آنها را حذف نماید. اگر برنامه توسط یک سیگنال مجبور به خروج بشود، قادر نخواهد شد فایلها را حذف کند مگر اینکه سیگنال را در تله بیاندازد.

در یک اسکریپت پوسته، trap فرمان مورد استفاده برای برقرار کردن یک گرداننده سیگنال است. فرمان trap به پنج روش مختلف می‌تواند استفاده شود:

ادامه مطلب

منطقه


منطقه

1. کد گذاری‌های کاراکتری

در عمل کامپیوترها نمی‌توانند کاراکترها و علائم را ذخیره کنند، آنها فقط اعداد را ذخیره می‌کنند. روشهای بیشماری برای نمایش دادن کاراکترهای زبان انسانی( مانند حرف A، علامت به اضافه، وغیره ) به عنوان عدد، وجود دارد، و این امر که روشهای متفاوت بسیار زیادی، واقعاً به کار برده شد، به بی‌نظمی منجر گردیده است.

کامپیوترهای اولیه (حداقل در ایالات متحده) در دو استاندارد برای طرح‌ریزی(نگاشت) کاراکترهای ‎ US English‎ به اعداد و بالعکس، به یکدیگر نزدیک شدند: ASCII و EBCDIC. دومی به تدریج تا اواخر قرن بیستم منسوخ گردید و ASCII ( کد استاندارد امریکایی برای تبادل اطلاعات) را به عنوان استاندارد اصلی باقی گذاشت.

مشکل با ASCII آن است که برای زبانهای غیر از انگلیسی، یا حتی برای برخی کلمات انگیسیِ وابسته به مزیت‌های انشایی نویسنده، یا شاید نوشته شده با آوا نماها (به عنوان مثال rôle و naïve) خیلی محدود است. ASCII تنها بیست و شش حرف از الفبای انگلیسی (بزرگ و کوچک)، ارقام 0 تا 9، و مقداری نشانه‌گذاری اصلی را پوشش می‌دهد -- به طور معمول آنهایی که شما در صفحه کلید US کامپیوتر می‌بینید. در ماشین‌های یونیکسی برای دیدن فهرست آنها می‌توانید ‎man ascii‎ را تایپ کنید.

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

(بسیاری از کاربران ‎DOS/Windows‎ مایکروسافت باور دارند که ASCII تمام دامنه 0 تا 255 را با صورتک‌های خندان و کاراکترهای ترسیم خطوط و مانند آن پوشش می‌دهد. این تصور نادرست است. مجموعه کاراکتر معروف DOS در حقیقت ‎IBM code page 437‎ است، که یکی از چندین فوق‌مجموعه ASCII می‌باشد. ASCII خودش منحصر به 127 کاراکتر است.)

ادامه مطلب

فایل‌های الگو


فایلهای قالب پوسته

پرسش‌های بسیاری در باره چگونگی استفاده ار یک فایل الگو دریافت نموده‌ایم، این به معنای یک فایل با placeholder(جای نگهدارنده)هایی در آن است، که می‌خواهیم در زمان اجرا با کمیت‌ها جایگزین نماییم. چند شکل متفاوت از این پرسش وجود دارد، و به طوریکه انتظار دارید، چند پاسخ متفاوت بر اساس نیازمندی‌های واقعی.

اساسی‌ترین نیاز آن است که autoconf گنو به کار می‌برد: یک فایل الگوی پیش‌ساخته با مواردی %PLACEHOLDER% در آن، و کمیت‌هایی در متغیرهای ویژه پوسته که می‌خواهیم استفاده کنیم. بر این وظیفه بخصوص، sed بسیار خوب منطبق می‌شود:

 sed -e "s/%PLACEHOLDER%/$variable/g" \
     -e "s/%FIRSTNAME%/$firstname/g" \
     ... "$templatefile" > "$outputfile"

نشانه‌گذاری %FOO% همان است که autoconf عملاً برای placeholderهایش استفاده می‌کند، انتخابش به این جهت است. اگر متغیرها بتوانند شامل کاراکترهای / یا سطر جدید در محتوایشان باشند، آنوقت گام‌های متناسب باید برداشته شود -- یک جدا کننده غیر از / می‌تواند برای فرمان ‎sed s///‎ استفاده بشود، اما برای سطر جدید به شما توصیه می‌شود یک پرسش و پاسخ متداول پیشرفته sed را کنکاش نمایید. خوشبختانه، وضعیتی که افراد بخواهند سطرهای جدید را به جایگزینی‌هایشان ضمیمه کنند، در این شکل از پرسش، تا اندازه‌ای غیر معمول است.

یک شکلِ جایگزین این پرسش عبارت است از، «من یک فایل با بسط پارامترهای پوسته در آن دارم، مانند ‎$foo‎. من از قبل نمی‌دانم کدام متغیرها استفاده خواهند شد، بنابراین نمی‌توانم دقیقاً یک لیست از تمام آنها دریک فرمان تنومند sed بسازم.» (در اینجا سطرهای جدید داخل متغیرها خیلی بیشتر معمول هستند، اما خوشبختانه آنها مشکلی در راه حلی که ارایه می‌دهیم نشان نمی‌دهند.)

این مشکل می‌تواند به وسیله ساختن یک HereDocument و تغذیه نتیجه به یک پوسته برای بسط یافتن، حل بشود:

 { echo "cat <<EOF"
   cat "$templatefile"
   echo "EOF"
 } | sh > "$outputfile"

توجه: اگر یک نتیجه غیرمنتظره که شامل EOF در انتهای خروجی است، به دست می‌آورید، احتمالاً فایل الگوی شما فاقد کاراکتر سطرجدید در انتها می‌باشد.

به خاطر بیاورید تا زمانی که رشته نگهبان (در موقعیت ما EOF) در سطر اول نقل‌قولی نشده باشد در بدنه یک HereDocument جایگزینی‌ها انجام می‌شوند. ما در اینجا از این مطلب بهره‌گیری می‌کنیم.

همچنین، توجه نمایید که جایگزینی در یک پوسته جدید sh (یا bash یا ksh، هر چه که شما لازم دارید) انجام می‌شود، نه در پوسته جاری. بنابراین، هر متغیری که شما می‌خواهید استفاده کنید باید export شده باشد.

چون هر جایگزینی فرمان در فایل الگو به عنوان کُد پوسته اجرا خواهد شد، اهمیت دارد که هر فایل الگویی که به این طریق استفاده می‌شود تحت کنترل شما باشد، و توسط یک کاربر تولید نشده باشد. به شما هشدار داده می‌شود.


CategoryShell

فایلهای الگو (آخرین ویرایش ‎2010-08-26 15:12:58‎ توسط cei-gla-cpk2)


حالت vi و emacs


وضعیت‌های Emacs و Vi در Bash

دو گزینه‌ای که می‌توانند با فرمان set تنظیم بشوند و تا اندازه‌ای برای کاربر جالب خواهند بود، ‎"-o vi"‎ و ‎"-o emacs"‎ می‌باشند. همچون تمام فرمانهای ویرایش محیط اینها می‌توانند در اعلان فرمان تایپ بشوند یا در فایل مناسب درج گردند.

وضعیت Emacs

  • ‎$ set -o emacs‎
  • در محیط bash این وضعیت معمولاً حالت پیش‌فرض ویرایش است و به معنای آن است که شما برای حرکت اشاره‌گر، بریدن و چسباندن متن، یا خنثی نمودن ویرایش قادر به استفاده از فرمانهایی هستید که در Emacs وجود دارند (تعریف شده در کتابخانه Readline) .

  • فرمانهای مورد استفاده در وضعیت Emacs پوسته bash:
    • ctrl-a حرکت اشاره‌گر به ابتدای سطر
    • ctrl-e حرکت اشاره‌گر به انتهای سطر
    • meta-b حرکت اشاره‌گر یک کلمه به عقب
    • meta-f حرکت اشاره‌گر یک کلمه به جلو
    • ctrl-w بریدن آخرین کلمه
    • ctrl-u بریدن هر چیز قبل از اشاره‌گر
    • ctrl-k بریدن هر چیز بعد از اشاره‌گر
    • ctrl-y چسباندن آخرین مورد بریده شده
    • ctrl-_ بی اثر کردن
    • توجه: ‎ctrl-‎ یعنی نگه داشتن کنترل، ‎meta-‎ یعنی نگه داشتن meta (که در آن meta معمولاً کلید alt یا escape است).
    • یک ترکیب ‎ctrl-u‎ برای بریدن سطر که با ‎ctrl-y‎ همراه گردد می‌تواند بسیار مفید باشد. اگر شما در میانه تایپ یک فرمان هستید و لازم است برای بازیابی اطلاعات بیشتر به اعلان بازگردید، می‌توانید از ‎ctrl-u‎ برای ذخیره آنچه تایپ کرده‌اید استفاده نمایید و پس از به دست آوردن اطلاعاتِ مورد نیاز، ترکیب ‎ctrl-y‎ آنچه را بریده بودید بازیابی خواهد کرد.

وضعیت Vi

  • ‎$ set -o vi‎
  • وضعیت vi موقعی که در اعلان bash هستید، استفاده از فرمانهای مانند vi را میسر می‌کند. وقتی این وضعیت را تنظیم کنید در آغاز در وضعیت درج خواهید بود (قادر به تایپ کردن در اعلان فرمان، برخلاف موقعی که وارد vi می‌شوید). با فشردن کلید escape وارد حالت دستوری می‌شوید.
  • فرمانهای قابل استفاده در وضعیت Vi در bash:
    • h حرکت اشاره‌گر به چپ
    • l حرکت اشاره‌گر به راست
    • A حرکت اشاره‌گر به به انتهای سطر و قرار گرفتن در حالت درج
    • 0 (صفر) حرکت اشاره‌گر به ابتدای سطر (در حالت درج قرار نمی‌گیرد)
    • i رفتن به حالت درج در محل فعلی
    • a رفتن به وضعیت درج بعد از کاراکتر فعلی
    • dd حذف سطر (ذخیره شده برای چسباندن)
    • D حذف متن بعد از محل فعلی (ذخیره شده برای جسباندن)
    • p چسباندن متنی که حذف شده بود
    • j حرکت به بالا میان تاریخچه فرمانها
    • k حرکت به پایین میان تاریخچه فرمانها
    • u خنثی نمودن


CategoryShell

set-o-vi-emacs (آخرین ویرایش ‎2013-07-15 13:16:33‎ توسط static-173-71-130-68)


IFS


متغیر IFS در پوسته‌ها(Bourne، POSIX، ksh، bash) به عنوان جداکننده فیلد ورودی (یا جداکننده داخلی فیلد) به کار می‌رود. در اصل، رشته‌ای از کاراکترهای خاصی است، که موقع تجزیه یک سطر از ورودی، باید با آنها به عنوان جداکننده مابین کلمات/فیلدها، رفتار بشود.

مقدار پیش‌فرض IFS، فاصله، tab، سطرجدید است. (یک رشته سه کاراکتری.) اگر IFS برقرار نباشد(unset)، مانند آن عمل می‌کند که به این مقدار پیش‌فرض تنظیم شده باشد. (این احتمالاً برای سادگی در پوسته‌هایی است که از ترکیب دستوری ‎ $'...'‎ برای کاراکترهای خاص پشتیبانی نمی‌کنند.) اگر IFS به یک رشته تهی تنظیم گردد (که خیلی متفاوت با عدم برقرار بودن--unset-- آن است!)، تجزیه‌ای انجام نخواهد شد.

این متغیر در چند محل مختلف به کار می‌رود. با تعابیر کمی متفاوت:

  • در فرمان read، در صورتیکه چندین نام متغیر به عنوان شناسه فرمان تعیین شده باشند، IFS برای تجزیه سطر ورودی به طریقی که هر متغیر یک فیلد منفرد از ورودی را دریافت نماید، به کار می‌رود. (اگر فیلدهای بیشتری نسبت به متغیرها وجود داشته باشد، آخرین متغیر تمام فیلدهای باقیمانده را دریافت می‌کند.)

  • موقع انجام تفکیک کلمه در یک بسط نقل‌قولی نشده، IFS برای تجزیه محتوای بسط به چندین کلمه، به کار می‌رود.

  • موقع اجرای بسط ‎ "$*"‎ یا‎ "${array[*]}"‎ (* همان @ نیست، و نقل‌قولی شده است -- یادداشت ویژه را ببینید!)، برای ساختن رشته خروجی نهایی، کاراکتر اول از IFS ، بین عناصر جای می‌گیرد

  • ادامه مطلب