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

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

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

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

دستورات و شناسه‌ها

ادامه یادداشت قبلی
من در ترجمه این راهنما برای درج اشارات تلویحی و افزودن قابلیت تشخیص بیشتر به خط فرمانها، یک رنگ آمیزی خاص به شرح زیر را به کار برده‌ام:
برای فرمانها(اعم از دستورات داخلی، خارجی و برنامه‌های کاربردی) از این رنگ مانند cd
برای کلید واژه‌های bash از این رنگ مانند]] یا do
برای کاراکترهای ویژه از این رنگ مانند && اما نه در تمام موارد
برای متغیرها از این رنگ مانند PATH
برای گزینه‌های دستور از این رنگمانند ‎-f
برای توابع از این رنگ مانند ‎ function()
برای داده‌ها از این رنگ مانند story
خروجی در ترمینال و برای لینک‌های خارج از راهنمااز این رنگ مانندBashGuide
برای لینک‌ به بخش دیگری از این مجموعه از این رنگ مانند نقل‌قول‌ها که در حال حاضر تا تکمیل شدن ترجمه کار نمی‌کنند.
برای خطا در خط فرمان از این رنگ

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

محمود پهلوانی




دستورات و شناسه‌ها

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

BASH هر سطر را از محل هرکاراکتر فضای سفید( فاصله و Tab ) به کلمه‌ها تقسیم می‌کند. اولین کلمه‌ای که پیدا می‌کند نام دستوری است که باید اجرا شود. تمام کلمات باقی‌مانده شناسه‌ها برای دستور تلقی می‌گردند(گزینه‌ها، نام فایل‌ها و غیره).

فرض کنیم شما در یک دایرکتوری خالی هستید. (اگر می‌خواهید این کد را امتحان کنید می‌توانید دایرکتوری به نام test را با اجرای: mkdir test ; cd test ایجاد کنید و داخل آن بروید).

$ ls #لیست فایل‌ها در دایرکتوری جاری(بدون خروجی: فایلی موجود نیست).
$ touch a b c #فایل‌های 'a' و 'b' و 'c' را ایجاد می‌کند.
$ ls #دوباره لیست فایل‌ها، این دفعه در خروجی سه فایل ایجاد شده نمایش داده می‌شود.
a b c

touchیک برنامه کاربردی است که زمان آخرین ویرایش یک فایل معین را به زمان حال تغییر می‌دهد. اگر فایل نامبرده در حال حاضر موجود نباشد، به سادگی آن را، به عنوان یک فایل جدید خالی ایجاد می‌کند . در این مثال، ما سه شناسه به آن داده‌ایم. touch برای هر یک از آنها یک فایل ایجاد می‌کند. فرمان ls سه فایل ایجاد شده را به ما نشان می‌دهد.

$ rm * # تمام فایل‌های دایرکتوری فعلی را حذف می‌کند
$ ls
$ # لیست فایل‌های دایرکتوری جاری(فایل موجود نیست)
$ touch a b c # فایل‌های a و b و c را ایجاد می‌کند
$ ls # دوباره لیست فایل‌ها، این دفعه فایل‌های a و b و c در خروجی نمایش داده می‌شود.
a b c

rm ابزاری برای حذف فایل‌هایی می‌باشد که به عنوان شناسه به آن داده شده‌اند. * یک جانشین (glob) می‌باشد. و در اینجا در اصل به معنای تمام فایل‌های موجود در دایرکتوری جاری می‌باشد. بعداً بیشتر درباره جانشین‌ها (globs) خواهید خواند.

حالا توجه نمودید که بین a و b و همچنین مابین b و c چند تا فاصله وجود داشت؟ همین‌طور نیز متوجه شدید که نتیجه، یعنی فایل‌های ایجاد شده توسط touch با دفعه قبل که فقط یک فاصله بین آنها بود تفاوتی ندارد. حال آگاه شدید که تعداد فضاهای سفید بین شناسه‌ها اهمیت ندارد. دانستن این مطلب با اهمیت است. برای مثال:

    $ echo This is a test.
    This is a test.
    $ echo This    is    a    test.
    This is a test.

echo دستوری است که شناسه‌هایش را در خروجی استاندارد (که در این حالت ترمینال است) می‌نویسد. در این مثال، ما دستور echo را با چهار شناسه به کار برده‌ایم: 'This'و 'is'و 'a' و 'test.' که فرمان echo این شناسه‌ها را می‌گیرد، وآنها را یک به یک با یک فاصله مابین آنها در خروجی چاپ می‌کند. در حالت دوم دقیقاً همان اتفاق رخ می‌دهد. فاصله‌های اضافی تفاوتی ایجاد نمی‌کنند. اگر واقعاً فاصله‌های اضافی را خواسته باشیم، لازم است جمله را به صورت یک شناسه منفرد به آن بدهیم. می‌توانیم این کار را با استفاده از نقل‌قول‌ها انجام بدهیم:

    $ echo "This    is    a    test."
    This    is    a    test.

نقل‌قول‌ها هر چیز در داخلشان را به صورت یک شناسه منفرد بسته‌بندی می‌کنند. این شناسه منفرد ‎ 'This    is    a    test.'‎ می‌باشد، با فاصله‌های صحیح. توجه داشته باشید که نقل‌قول‌ها بخشی از شناسه نیستند، BASH قبل از تحویل شناسه به فرمان echo آنها را حذف می‌کند. echoاین شناسه منفرد را درخروجی چاپ می‌کند، درست مانند آنچه همیشه انجام می‌دهد

در اجتناب از موارد ذیل دقیق باشید:

$ ls # لیست فایل‌های دایرکتوری جاری.
The secret voice in your head.mp3 secret
$ rm The secret voice in your head.mp3 # فرمان rm را با 6 شناسه اجرا می‌کند، نه با یکی!
rm: cannot remove `The': No such file or directory rm: cannot remove `voice': No such file or directory rm: cannot remove `in': No such file or directory rm: cannot remove `your': No such file or directory rm: cannot remove `head.mp3': No such file or directory
$ ls # لیست فایل‌های دایرکتوری جاری: فایل مورد نظر هنوز آنجاست.
The secret voice in your head.mp3 # اما فایل secret شما حالا دیگر نیست!

شما باید در محصور کردن صحیح نام فایل با علائم نقل‌قول دقیق باشید. اگر محتاط نباشید، فایل‌های اشتباهی را حذف خواهید نمود! فرمان rm نام فایل‌ها را به عنوان شناسه می‌پذیرد. اگر نام‌هایی که در آنها کاراکتر فاصله وجود دارد را نقل‌قولی نکنید، rm فکر می‌کند که هر شناسه یک نام فایل است. نظر به اینکه BASH شناسه‌ها را از محل فضای سفید تفکیک می‌کند، rm سعی خواهد نمود هر کلمه را به طور جداگانه حذف کند. در مثال فوق، به جای نام فایل صوتی، سعی کرده هر یک از کلمات موجود در نام فایل مورد نظر را حذف نماید. این موجب گردیده فایل secret ما حذف گردد، و فایل صوتی را پشت سر باقی بگذارد!

شناسه‌ها از نام دستور و از یکدیگر نسبت به فضای سفید( فاصله، Tab، و سطر جدید) جدا می‌شوند. به خاطر سپردن این مطلب اهمیت دارد، برای مثال، مورد زیر اشتباه است:

    $ [-f file]

شما می‌خواهید دستور ‎ [‎ از شناسه‌های ‎ -f‎، ‎file‎ و ‎]‎ جدا شود. اگر شما ‎ [‎ و ‎-f‎ را با فاصله از یکدیگر جدا نکنید، BASH تصور می‌کند شما می‌خواهید دستوری به نام ‎ [-f‎ را اجرا کنید، و در PATH شما برای برنامه‌ای با نام ‎ [-f‎ جستجو می‌کند. علاوه بر این، شناسه file و ‎]‎ نیز لازم است با فاصله جدا شوند. فرمان ‎[ ‎  انتظار دارد آخرین شناسه‌اش، ‎ ]‎ باشد. در دستور صحیح همه شناسه‌ها با فاصله از یکدیگر جدا می‌شوند:

    $ [ -f file ]

( ما فرمان ‎ [‎ را در آینده مفصل‌تر شرح خواهیم داد. افراد زیادی را دیده‌ایم که با آن سر در گم شده‌اند، و گمان برده‌اند که می‌توان از فضای سفید میان آن و شناسه‌هایش صرفنظر نمود، بنابراین، لازم دانستیم خیلی زود در این مثال خاص آن را مطرح کنیم.)

و البته اگر نام فایل شما شامل فضای سفید و یا دیگر کاراکترهای خاص باشد، باید نقل‌قولی بشود:

    $ [ -f "my file" ]

توجه: لطفاً اگر هنوز مطلب برای شما خیلی واضح نیست، از شناسه‌ها، نقل‌قول‌ها، تفکیک کلمه و http://wiki.bash-hackers.org/syntax/words دید خوبی در این موارد حاصل نمایید. این مهم است که شما قبل از ادامه این راهنما، درک مناسبی از اینکه شل دستوراتی را که به آن می‌دهید چگونه تفسیر می‌کند، داشته باشید.


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



  • شناسه‌ها: اینها کلمات اختیاری اضافه‌ای هستند که می‌توانید موقع اجرای فرمان‌ها تعیین کنید. آنها پس از نام فرمان‌ها آورده می‌شوند(‎'ls -l  foo'‎ فرمان ls را با دو شناسه اجرا می‌کند).

  • نقل‌قول‌ها: دو نوع نقل‌قول( ' و ") برای محافظت از کاراکترهای خاص معین در داخل عبارت نقل‌قولی، از تفسیر شدن به عنوان کاراکتر خاص توسط BASH، استفاده می‌کنیم. تفاوت بین ' و " را بعداً صحبت خواهیم نمود.


ادامه دارد ....
نظرات 0 + ارسال نظر
ایمیل شما بعد از ثبت نمایش داده نخواهد شد