و از این رنگ برای شناسهها و بعضاً نمایان کردن برخی از قسمتها و همچنین تاکید در متن استفاده شده است،
سعی کردهام تا آنجا که ممکن است آن را رعایت نمایم ولی امکان دارد که گاهی از نظر دور مانده باشد.
همچنین تلاش بسیاری شده که از بهم ریختگی و دگرگون شدن خط دستورها که در میان متن فارسی(متن چپ به راست در میان متن راست به چپ) درج شدهاند و در نوشتههای وبلاگها بسیار با آن برخورد نمودهام به طور جدی پرهیز نمایم. لطفاً اگر با موردی در این راهنمایا ترجمههای قبلی برخورد نمودید، اطلاع بدهید. ممنون خواهم شد.
محمود پهلوانی
BASH دستورات را از ورودی( که میتواند ترمینال یا یک فایل باشد ) میخواند. با هر سطری که میخواند به عنوان یک دستور رفتار میکند -- یک دستورالعمل که باید انجام بشود(چند حالت پیشرفتهتری از قبیل دستوراتی که سطرهای چندتایی را دربرمیگیرند، موجود است، اما در حال حاضر نگران آنها نمیباشیم.)
BASH هر سطر را از محل هرکاراکتر فضای سفید( فاصله و Tab ) به کلمهها تقسیم میکند. اولین کلمهای که پیدا میکند نام دستوری است که باید اجرا شود. تمام کلمات باقیمانده شناسهها برای دستور تلقی میگردند(گزینهها، نام فایلها و غیره).
فرض کنیم شما در یک دایرکتوری خالی هستید. (اگر میخواهید این کد را امتحان کنید میتوانید دایرکتوری به نام
$ ls # | لیست فایلها در دایرکتوری جاری(بدون خروجی: فایلی موجود نیست). |
$ touch a b c # | فایلهای 'a' و 'b' و 'c' را ایجاد میکند. |
$ ls # | دوباره لیست فایلها، این دفعه در خروجی سه فایل ایجاد شده نمایش داده میشود. |
|
touchیک برنامه کاربردی است که زمان آخرین ویرایش یک فایل معین را به زمان حال تغییر میدهد. اگر فایل نامبرده در حال حاضر موجود نباشد، به سادگی آن را، به عنوان یک فایل جدید خالی ایجاد میکند . در این مثال، ما سه شناسه به آن دادهایم. touch برای هر یک از آنها یک فایل ایجاد میکند. فرمان ls سه فایل ایجاد شده را به ما نشان میدهد.
$ rm * # | تمام فایلهای دایرکتوری فعلی را حذف میکند |
$ ls | |
$ # | لیست فایلهای دایرکتوری جاری(فایل موجود نیست) |
$ touch a b c # | فایلهای a و b و c را ایجاد میکند |
$ ls # | دوباره لیست فایلها، این دفعه فایلهای a و b و c در خروجی نمایش داده میشود. |
rm ابزاری برای حذف فایلهایی میباشد که به عنوان شناسه به آن داده شدهاند.
حالا توجه نمودید که بین 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 # | لیست فایلهای دایرکتوری جاری. |
| |
$ rm The secret voice in your head.mp3 # | فرمان rm را با 6 شناسه اجرا میکند، نه با یکی! |
| |
$ ls # | لیست فایلهای دایرکتوری جاری: فایل مورد نظر هنوز آنجاست. |
| اما فایل secret شما حالا دیگر نیست! |
شما باید در محصور کردن صحیح نام فایل با علائم نقلقول دقیق باشید. اگر محتاط نباشید، فایلهای اشتباهی را حذف خواهید نمود! فرمان rm نام فایلها را به عنوان شناسه میپذیرد. اگر نامهایی که در آنها کاراکتر فاصله وجود دارد را نقلقولی نکنید، rm فکر میکند که هر شناسه یک نام فایل است. نظر به اینکه BASH شناسهها را از محل فضای سفید تفکیک میکند، rm سعی خواهد نمود هر کلمه را به طور جداگانه حذف کند. در مثال فوق، به جای نام فایل صوتی، سعی کرده هر یک از کلمات موجود در نام فایل مورد نظر را حذف نماید. این موجب گردیده فایل secret ما حذف گردد، و فایل صوتی را پشت سر باقی بگذارد!
شناسهها از نام دستور و از یکدیگر نسبت به فضای سفید( فاصله، Tab، و سطر جدید) جدا میشوند. به خاطر سپردن این مطلب اهمیت دارد، برای مثال، مورد زیر اشتباه است:
$ [-f file]
شما میخواهید دستور [ از شناسههای
$ [-f file ]
( ما فرمان [ را در آینده مفصلتر شرح خواهیم داد. افراد زیادی را دیدهایم که با آن سر در گم شدهاند، و گمان بردهاند که میتوان از فضای سفید میان آن و شناسههایش صرفنظر نمود، بنابراین،
و البته اگر نام فایل شما شامل فضای سفید و یا دیگر کاراکترهای خاص باشد، باید نقلقولی بشود:
$ [ -f "my file" ]
توجه: لطفاً اگر هنوز مطلب برای شما خیلی واضح نیست، از شناسهها، نقلقولها، تفکیک کلمه و http://wiki.bash-hackers.org/syntax/words دید خوبی در این موارد حاصل نمایید. این مهم است که شما قبل از ادامه این راهنما، درک مناسبی از اینکه شل دستوراتی را که به آن میدهید چگونه تفسیر میکند، داشته باشید.
تکرار مفید:
شما باید همواره جملهها و رشتههایی که مرتبط با یکدیگر هستند، حتی اگر به طور قطعی ضرورت ندارد، را نقلقولی کنید. این شما را گوش به زنگ نگاه میدارد و ریسک خطای انسانی در اسکریپتها را کاهش میدهد.
برای مثال، همیشه باید شناسههای فرمان echo را نقلقولی کنید.
در پرسش و پاسخهای رایج:
من سعی میکنم یک فرمان را در متغیری قرار دهم، اما همیشه در حالتهای پیچیدهتر شکست میخورم!
چگونه میتوانم شناسههای( گزینههای ) خطفرمان را به آسانی مدیریت کنم؟
شناسهها: اینها کلمات اختیاری اضافهای هستند که میتوانید موقع اجرای فرمانها تعیین کنید. آنها پس از نام فرمانها آورده میشوند('ls -l foo' فرمان ls را با دو شناسه اجرا میکند).
نقلقولها: دو نوع نقلقول( ' و ") برای محافظت از کاراکترهای خاص معین در داخل عبارت نقلقولی، از تفسیر شدن به عنوان کاراکتر خاص توسط BASH، استفاده میکنیم. تفاوت بین