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

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

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

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

حالت 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 ، بین عناصر جای می‌گیرد

  • ادامه مطلب

تغذیه داده‌های محدود به اسکریپت


سند اینجا(here document) خصیصه‌ای از ترکیب دستوری(syntactic) پوسته بورن است، که تغذیه داده‌ها به برنامه را بدون ذخیره آنها در یک فایل خارجی میسر می‌سازد. این ویژگی به همان خوبی در پوسته‌های POSIX، Korn و Bash نیز کار می‌کند.

قالب اصلی عبارت است از:

someprogram <<WORD
داده‌های شما
go
here
WORD

در اینجا، someprogram می‌تواند هر برنامه‌ای باشد که از ورودی استاندارد می‌خواند (رایج‌ترین آنها cat است)، و WORD می‌تواند هر کلمه متمایز کننده‌ای که مایل هستید، باشد. (EOF یک انتخاب رایج است.)

سند اینجا(Here document)ها با این قالب خصوصیات ویژه‌ای دارند:

  • جایگزینی‌های پوسته( از قبیل ‎ $variable‎) در سند اینجا انجام می‌شوند.

  • دومین کلمه متمایز کننده خودش باید در یک سطر جداگانه و در ستون اول قرار داشته باشد.
  • هر فضای سفید داخل سند اینجا، حفظ می‌گردد، از جمله فضای سفید جداکننده سطر.

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

someprogram <<'WORD'
داده‌های شما
$go
`here`
WORD

اگر می‌خواهیم قادر به ایجاد تورفتگی در سنداینجا باشیم، می‌توانیم کاراکتر - (خط تیره) را پیشوند کلمه متمایزکننده نماییم:

if ...
    while ....
        someprogram <<-WORD
        this is
        an indented
        here document
        WORD
    done
fi

در این شکل تمام کاراکترهای tab پیشتاز (فاصله‌ها خیر!) حذف خواهند شد. هیچگونه مقرراتی برای حذف فاصله‌های پیشتاز سطر یا فاصله‌ها و tabهای همراه هم از ابتدای سطر وجود ندارد. (محدودیت‌های قواعد دستوری Makefileها را به خاطر بیاورید، مجاب خواهید شد.)

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

Here Strings

در bash، گونه‌ای از سنداینجا به نام رشته‌اینجا(here string) وجود دارد. این جمع و جور تر است، اما محدودتر نیز می‌باشد:

read -a octets <<< "$ipaddr"

عملگر ‎<<<‎ نقشی مشابه نقش ‎ <<‎ در سنداینجا دارد، اما کلمه نگهبان برای اینکه به ما بگوید، کجا ورودی تمام می‌شود، وجود ندارد. در عوض، عملگر ‎ <<<‎ با یک کلمه منفرد دنبال می‌شود(نقل‌قول ها دوست شما هستند!). کلمه به اضافه سطر جدید، ورودی استاندارد فرمان می‌شود.


  • سنداینجا (آخرین ویرایش ‎2013-06-10 19:59:13‎ توسط GreyCat)

NamedPipes


کار با لوله‌های با نام

لوله‌ها امکان ارتباط پردازشها با یکدیگر را فراهم می‌کنند. همچنین لوله ممکن است به عنوان FIFO (اختصاری برای First In- First Out) شناخته شود.

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

مثال زیر نمونه‌ای از لوله نام‌گذاری شده است، در اینجا به عنوان pipe1 نامیده شده.

 cd /tmp
 mkfifo pipe1

برای ارسال یک پیغام به لوله، از این استفاده کنید:

 echo "hello" > pipe1

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

امکان دارد در ترمینال دیگری، اطلاعات از لوله جمع آوری گردد، به این شکل:

 cat /tmp/pipe1

اکنون توسط cat اطلاعات از لوله خوانده خواهد شد( و در ترمینال نوشته می‌شود)، و پردازش نویسندهِ مسدودشده برای ادامه یافتن آزاد می‌شود.

برای برخی اطلاعات بیشتر، پرسش و پاسخ شماره ۸۵ را ببینید.

مثال همگامی دوطرفه سرویس‌دهنده- سرویس‌گیرنده

این مثال کوچکی از مخابره کردن یک پردازش سرویس‌دهنده با یک پردازش سرویس‌گیرنده است. سرویس‌دهنده فرمانها را به سرویس‌گیرنده ارسال می‌کند، و سرویس گیرنده هر فرمان را تصدیق می‌کند:

ادامه مطلب

پیش‌گیری از رونویسی ناخواسته فایل


موقع تنظیم ‎noclobber‎ رونویسی محتویات یک فایل موجود توسط عملگر تغییر مسیر ‎>‎ غیرممکن خواهد شد. شاید در حالیکه قصد شما استفاده از عملگر تغییر مسیرِ ‎>>‎ باشد، ‎>‎ را برای تغییر مسیر خروجی یک فرمان به یک فایل موجود تایپ کرده باشید. اینجاست که noclobber به کار می‌آید، پیش‌گیری از حذف تصادفی محتوای یک فایل موجود.

چگونه کار می‌کند

ls > list

تنظیم noclobber را امتحان کنید

set -o noclobber

دوباره انجام بدهید

ls > list
bash: list: cannot overwrite existing file 

در صورتیکه noclobber برقرار باشد چگونه فایل را رونویسی نماییم

اگر تصمیم به رونویسی فایل گرفته‌اید، می‌توانید روش ‎>|‎ را به کار ببرید. از این قرار:

ls >| list 

غیر فعال نمودن noclobber

درست مانند برقرار کردن noclobber، غیرفعال کردن آن نیز میسر است، چنان که با کاربرد عملگر تغییر مسیر ‎>‎ رونویسی بتواند انجام گردد.

set +o noclobber


NoClobber (آخرین ویرایش ‎2012-09-27 12:53:11‎ توسط Valentin Bajrami)