• مترجم فرمان زبان دستور یونیکس مترجم پوسته

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

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

    هر زبان دستوری از خانواده پوسته در واقع از سه بخش تشکیل شده است:

     ساختارهای کاربردی که به شما امکان می دهد رشته های متنی را دستکاری کنید و دستورات پیچیده را بر اساس دستورات ساده بسازید.

     دستورات داخلی که مستقیماً توسط مفسر زبان فرمان اجرا می شوند.

     دستوراتی که توسط فایل های اجرایی جداگانه نمایش داده می شوند.

    به نوبه خود، مجموعه دستورات نوع دوم شامل دستورات استاندارد (ابزارهای سیستم مانند vi، cc و غیره) و دستورات ایجاد شده توسط کاربران سیستم است. برای اینکه یک فایل اجرایی توسعه یافته توسط کاربر یونیکس به صورت دستور shell اجرا شود، کافی است تابعی به نام main در یکی از فایل های منبع تعریف کنیم (نام main باید سراسری باشد، یعنی قبل از آن کلمه کلیدی ثابت نباشد). اگر از نام چنین فایل اجرایی به عنوان نام فرمان استفاده کنید، پوسته یک فرآیند جدید ایجاد می کند و فایل اجرایی مشخص شده را در آن اجرا می کند و با فراخوانی تابع اصلی شروع می شود.

    بدنه تابع main، به طور کلی، می تواند دلخواه باشد (فقط وجود یک نقطه ورود به برنامه به نام main برای مفسر ضروری است)، اما برای ایجاد فرمانی که بتوان پارامترهایی را به آن داد، باید برخی از قوانین استاندارد را رعایت کرد. در این مورد، هر تابع اصلی باید با دو پارامتر - argci و argv تعریف شود. پس از فراخوانی دستور، پارامتر argc با تعداد رشته های کاراکتر تعیین شده به عنوان آرگومان فراخوانی فرمان مطابقت دارد و argv آرایه ای از اشاره گرها به متغیرهای حاوی این رشته ها است. در این حالت، نام خود فرمان اولین خط آرگومان است (یعنی پس از فراخوانی، مقدار argc همیشه بزرگتر یا مساوی 1 است). کد تابع اصلی باید اعتبار مقدار داده شده argc را تجزیه و تحلیل کند و رشته های متن داده شده را به طور مناسب پردازش کند.

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

    #عبارتند از

    اصلی (argc، argv)

    printf("usage: %s your-text\n", argv);

    printf("%s\n", argv);

    فرآیندها

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

    برای تشکیل یک فرآیند جدید و اجرای یک برنامه در آن، از دو فراخوانی سیستم API استفاده می شود - fork () و exec (name_of_executable_file). فراخوانی سیستم فورک منجر به ایجاد یک فضای آدرس جدید می شود که وضعیت آن کاملاً با وضعیت فضای آدرس فرآیند اصلی یکسان است (یعنی شامل همان برنامه ها و داده ها است). برای پردازش فرزند، کپی هایی از تمام بخش های داده ساخته می شود.

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

    کنترل در هر دو در نقطه بلافاصله پس از فراخوانی چنگال است. به طوری که برنامه بتواند بفهمد که اکنون در کدام فرآیند در حال اجرا است - در فرآیند اصلی یا فرزند، تابع فورک مقادیر مختلفی را برمی گرداند: 0 در فرآیند فرزند و یک عدد صحیح مثبت (شناسه فرآیند فرزند - به اصطلاح PID) در فرآیند اصلی.

    حال، اگر بخواهیم برنامه جدیدی را در فرآیند spawned اجرا کنیم، باید فراخوانی سیستم exec را فراخوانی کنیم و به عنوان آرگومان های فراخوانی، نام فایل حاوی برنامه اجرایی جدید و احتمالاً یک یا چند رشته متنی را که به عنوان آرگومان به تابع اصلی برنامه جدید ارسال می شود، مشخص کنیم. اجرای فراخوانی سیستم exec باعث می شود که یک برنامه اجرایی جدید در فضای آدرس پردازش فرزند بارگذاری شود و از آدرس مربوط به ورودی به تابع اصلی اجرا شود. به عبارت دیگر، این باعث می شود که بخش برنامه فعلی و بخش داده فعلی، که هنگام فراخوانی فورک به ارث برده شده اند، با بخش های متناظر جدید مشخص شده در فایل جایگزین شوند. بخش های قدیمی از بین رفته اند. این یک روش کارآمد برای تغییر برنامه ای است که فرآیند در حال اجرا است، اما نه خود فرآیند. فایل هایی که قبل از اجرای exec primitive باز شده اند پس از اجرای آن باز می مانند.

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

    if (fork ()==(0) wait(0)؛ /* پردازش والد */

    else excl("ls", "Is"، 0); /* فرآیند تخم ریزی */

    بنابراین، از نقطه نظر عملی، یک فرآیند در یونیکس یک شی است که در نتیجه اجرای تابع ()fork ایجاد شده است. هر فرآیند، به استثنای اولیه (تهی)، در نتیجه فرآیند دیگری که عملیات fork() را فراخوانی می کند، ایجاد می شود. هر فرآیند یک والد دارد، اما می تواند فرآیندهای زیادی را ایجاد کند. فرآیند اولیه (تهی) فرآیند خاصی است که در نتیجه بوت شدن سیستم ایجاد می شود. پس از ایجاد یک فرآیند جدید با شناسه 1، فرآیند صفر تبدیل به یک فرآیند مبادله می شود و مکانیزم حافظه مجازی را پیاده سازی می کند. فرآیند با شناسه 1 که به عنوان init شناخته می شود، جد هر فرآیند دیگری در سیستم است و با هر فرآیند به روشی خاص مرتبط است.

    حاشیه نویسی: دستورات داخلی پشتیبانی شده توسط مفسر Cmd.exe و رایج ترین آنها در نظر گرفته شده است. دستورات خارجی(ابزارهای خط فرمان). مکانیسم‌های تغییر مسیر I/O، خط لوله و اجرای فرمان مشروط توضیح داده شده‌اند. نمونه هایی از دستورات برای کار با سیستم فایل آورده شده است.

    پوسته خط فرمان ویندوز. مترجم Cmd.exe

    در اتاق عمل سیستم ویندوزمانند سایر سیستم عامل ها، دستورات تعاملی (که از صفحه کلید تایپ می شوند و بلافاصله اجرا می شوند) با استفاده از به اصطلاح مفسر فرمان اجرا می شوند که در غیر این صورت پردازشگر فرمان یا پوسته خط فرمان (پوسته فرمان) نامیده می شود. مترجم فرمانیا پوسته خط فرمان برنامه ای است که در حالی که در حافظه دسترسی تصادفی، دستوراتی را که تایپ می کنید می خواند و پردازش می کند. در ویندوز 9x، مانند MS-DOS، مترجم فرمانبه طور پیش فرض با دستور اجرایی نمایش داده شد. com شروع با نسخه های ویندوز NT، در سیستم عامل پیاده سازی شده است مترجم فرمان Cmd.exe بسیار قدرتمندتر است.

    پرتاب شل

    در ویندوز NT/2000/XP، فایل Cmd.exe، مانند سایر فایل های اجرایی که مربوط به تیم های خارجیسیستم عامل در پوشه %SystemRoot%\SYSTEM32 (با مقدار متغیر محیطی%SystemRoot% ریشه سیستم است دایرکتوری ویندوز، معمولاً C:\Windows یا C:\WinNT). می‌توانید با انتخاب Run از منوی Start، تایپ کردن نام فایل Cmd.exe و کلیک بر روی OK، مفسر فرمان را شروع کنید (یک جلسه خط فرمان جدید را باز کنید). در نتیجه، پنجره جدیدی باز می شود (شکل 2.1 را ببینید)، که در آن می توانید دستورات را اجرا کنید و نتیجه کار آنها را ببینید.


    برنج. 2.1.

    تیم های داخلی و خارجی. ساختار فرمان

    برخی از دستورات مستقیماً توسط خود پوسته شناسایی و اجرا می شوند - چنین دستوراتی داخلی نامیده می شوند (مثلاً COPY یا DIR). سایر دستورات سیستم عامل عبارتند از برنامه های فردی، به طور پیش فرض در همان دایرکتوری Cmd.exe قرار دارد که ویندوز آن را مانند سایر برنامه ها بارگیری و اجرا می کند. چنین دستوراتی خارجی نامیده می شوند (به عنوان مثال، MORE یا XCOPY).

    ساختار خود خط فرمان و اصل کار با آن را در نظر بگیرید. برای اجرای یک دستور، شما فرمان خط فرمان(مثلاً C:\> ) نام این دستور (بدون حساس به حروف بزرگ)، پارامترها و سوئیچ های آن (در صورت لزوم) را وارد کرده و کلید را فشار دهید. . مثلا:

    C:\>COPY C:\myfile.txt A:\ /V

    نام دستور در اینجا COPY است، گزینه‌های C:\myfile.txt و A:\ و کلید /V است. توجه داشته باشید که در برخی از دستورات، کلیدها ممکن است با علامت / شروع نشوند، بلکه با علامت - (منهای) شروع شوند، به عنوان مثال، -V.

    زیاد دستورات ویندوزدارند تعداد زیادی از گزینه های اضافیو کلیدهایی که اغلب به خاطر سپردن آنها دشوار است. اکثر دستورات دارای راهنمای داخلی هستند که به طور خلاصه هدف و نحو دستور را توضیح می دهد. با تایپ دستور /? می توانید به این راهنما دسترسی داشته باشید. مثلا اگر اجرا کنید دستور ATTRIB/ ?، سپس در پنجره MS-DOS متن زیر را مشاهده خواهیم کرد:

    نمایش و تغییر ویژگی های فایل ATTRIB [+R|-R] [+A|-A] [+S|-S] [+H|-H] [[drive:][path]filename] + ویژگی تنظیم. - حذف یک ویژگی R ویژگی فقط خواندنی. یک ویژگی "بایگانی شده". ویژگی S "System". H ویژگی "پنهان". /S فایل ها را در تمام زیر پوشه های مسیر مشخص شده پردازش کنید.

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

    در این حالت، پس از پر کردن صفحه بعدی، خروجی راهنما تا فشار دادن هر کلیدی قطع می شود. علاوه بر این، با استفاده از کاراکترهای تغییر مسیر خروجی > و >> می توانید متن نمایش داده شده روی صفحه را به سمت آن هدایت کنید فایل متنیبرای مشاهده بیشتر به عنوان مثال، برای خروجی متن راهنما برای دستور XCOPY به فایل متنی xcopy.txt، از دستور زیر استفاده کنید:

    xcopy /؟ > XCOPY.TXT

    اظهار نظر

    به جای نام فایل، می توانید نام های دستگاه رایانه را مشخص کنید. نام دستگاه های زیر در ویندوز پشتیبانی می شود: PRN(چاپگر)، LPT1-LPT3(متناظر پورت های موازی), AUX(دستگاه متصل به درگاه سریال 1)، COM1-COM3 (درگاه های سریال مربوطه)، CON (ترمینال: ورودی صفحه کلید، خروجی مانیتور)، NUL (دستگاه خالی، تمام عملیات I/O برای آن نادیده گرفته می شود).

    تغییر مسیر I/O و خط لوله فرمان (ترکیب)

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

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

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

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

    فرمان > نام فایل

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

    فرمان >> نام فایل

    با نماد< можно прочитать входные данные для دستور داده شدهنه از صفحه کلید، بلکه از یک فایل خاص (آماده شده):

    تیم< имя_файла

    در اینجا چند نمونه از تغییر مسیر I/O آورده شده است.

    1. خروجی راهنمای داخلی دستور COPY به فایل copy.txt:

      کپی 🀄 /؟ > copy.txt

    2. افزودن متن راهنما برای دستورات xcopyبرای فایل copy.txt:

      xcopy /؟ >> copy.txt

    3. ورودی تاریخ جدیداز فایل date.txt (DATE فرمانی برای مشاهده و تغییر تاریخ سیستم است):

      تاریخ< date.txt

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

    دستور 2> نام فایل

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

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

    از آنجا به راحتی می توان نتیجه گرفت که پردازش این دستورات و تبدیل آنها به دنباله ای از تماس های سیستمی و کتابخانه ای نیز باید نوعی باشد. برنامه ویژه، و با او است که کاربر بلافاصله پس از ورود به سیستم به طور مداوم گفتگو را انجام می دهد. و به این ترتیب معلوم شد: این برنامه نامیده می شود مترجم خط فرمانیا پوسته فرمان("پوسته"). دقیقاً به این دلیل "پوسته" نامیده می شود که تمام مدیریت سیستم مانند "از داخل" آن است: کاربر با زبانی که برای او مناسب است (با استفاده از خط فرمان متنی) با آن ارتباط برقرار می کند و او با سایر بخش های سیستم به زبانی مناسب برای آنها ارتباط برقرار می کند (با فراخوانی توابع برنامه ریزی شده).

    بنابراین، قوانین تجزیه خط فرمان که در بالا ذکر شد، قوانینی هستند که دقیقاً در مفسر دستور اعمال می شوند: کاربر یک خط را از ترمینال وارد می کند، پوسته آن را می خواند، گاهی اوقات آن را طبق قوانین خاصی تبدیل می کند، خط حاصل را به یک فرمان و پارامترها تقسیم می کند و سپس دستور را اجرا می کند و این پارامترها را به آن می دهد. این دستور به نوبه خود پارامترها را تجزیه و تحلیل می کند، کلیدها را از بین آنها انتخاب می کند و آنچه خواسته شده است را انجام می دهد و همزمان داده ها را برای کاربر در ترمینال نمایش می دهد و پس از آن پایان می یابد. پس از اتمام دستور، کار مفسر فرمان که به پس‌زمینه برگشته است، از سر گرفته می‌شود، دوباره خط فرمان را می‌خواند، آن را تجزیه می‌کند، فرمان را فراخوانی می‌کند... این کار تا زمانی ادامه می‌یابد که کاربر به پوسته فرمان پایان دادن به خود را بدهد (با استفاده از خروج یا کاراکتر کنترلی "^D" که برای پوسته به معنای همان برنامه‌های دیگر است: دیگر ورودی از ترمینال وجود نخواهد داشت).

    البته چندین مفسر دستور در لینوکس وجود دارد. ساده ترین آنها، که در ظاهر شد نسخه های اولیهیونیکس به نام sh یا "Bourne Shell" از نام نویسنده آن استفان بورن نامیده شد. با گذشت زمان، - هر جا که ممکن بود - با یک قدرتمندتر، bash، "Bourne Again Shell" جایگزین شد.

    بازی کلمات: "Bourne Again" با صدای بلند به عنوان "متولد دوباره"، یعنی "دوباره متولد شده" خوانده می شود.

    bash از هر نظر برتر از sh است، به خصوص در قابلیت ویرایش خط فرمان. علاوه بر sh و bash، "The Z Shell" را می توان بر روی سیستم نصب کرد، zsh، قدرتمندترین مفسر فرمان تا به امروز (بدون شوخی، 22 هزار خط مستندات)، یا tcsh، نسخه به روز شده و همچنین بسیار قدرتمند پوسته قدیمی "C Shell" که دستور دستور آن شبیه به زبان برنامه نویسی C است.

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

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

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

    دستورات و ابزارهای کاربردی

    $ مناسب است . . . (چهار و نیم هزار خط!)

    مثال 18. تیم بی معنی

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

    در واقع، دستورات بومی کمی در پوسته وجود دارد. اساساً، اینها اپراتورهای زبان برنامه نویسی و سایر ابزارهای کنترل خود مفسر هستند. تمام دستورات آشنا به Methodius، حتی echo، در لینوکس به عنوان ابزارهای مجزا وجود دارند. پوسته فقط به تهیه مجموعه ای از پارامترها در آن توجه دارد خط فرمان(مثلاً باز کردن قالب ها، برنامه ها را اجرا می کند و نتایج کار آنها را پردازش می کند.

    نوع $ اطلاعات اطلاعات /usr/bin/info است $ نوع echo echo یک پوسته داخلی است $ type -a echo echo یک echo داخلی پوسته است /bin/echo $ type -a -t echo فایل داخلی $ نوع -a -t فایل تاریخ $ نوع -در فایل cat

    مثال 19. تعریف نوع فرمان

    در bash، نوع دستور را می توان با استفاده از دستور type تعیین کرد. دستورات bash بومی نامیده می شوند ساخته شده است(فرمان داخلی) و برای برنامه های کاربردی چاپ می کند مسیر، حاوی نام دایرکتوری حاوی فایل با برنامه مربوطه و نام این برنامه است. برخی از مفیدترین دستورات در bash تعبیه شده اند، حتی اگر به عنوان ابزارهای کاربردی (مانند اکو) در دسترس باشند. دستور داخلی نیز به همین صورت عمل می کند، اما از آنجایی که اجرای آن زمان بسیار کمتری می برد، در صورت امکان، مفسر دستور آن را انتخاب می کند. کلید "-a" (" آ ll" البته) باعث می شود تا type همه را خروجی کند گزینه های ممکنتفسیر فرمان، و کلید "-t" - نوع فرمان را به جای مسیر نمایش می دهد.

    به توصیه گورویچ، متدیوس کلیدها را با نوشتن "-at" به جای "-a -t" گروه بندی کرد. بسیاری از ابزارهای کمکی به شما این امکان را می دهند که این کار را با کاهش طول خط فرمان انجام دهید. اگر با یک کلید پارامتریک مواجه شد، باید آخرین کلید در گروه باشد و مقدار آن باید همانطور که باید بعد از آن باشد. شما فقط می توانید کلیدهای تک حرفی را گروه بندی کنید.

    کلمات و جداکننده ها

    هنگام تجزیه خط فرمان، پوسته از مفهوم استفاده می کند حائل، جداکننده(حائل، جداکننده). جداکننده شخصیتی است که کلمات را از هم جدا می کند. بنابراین خط فرمان دنباله است کلمات(که مهم هستند) و جداکننده ها(که مهم نیست). برای پوسته، جداکننده‌ها عبارتند از کاراکتر فاصله، کاراکتر تب، و کاراکتر خط جدید (که همچنان می‌تواند بین کلمات به روشی که در سخنرانی‌های Working with Text Data و Shell Features توضیح داده شده است) قرار بگیرد. تعداد جداکننده های بین دو کلمه مجاور مهم نیست.

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

    $ echo یک دو سه یک دو سه $ echo یک "دو سه" یک دو سه $ echo "یک > > اوه. بعدش چی؟ > اوه، نقل قول ها را فراموش کردم!" یک آه. بنابراین، بعدی چیست؟ اوه، نقل قول ها را فراموش کردم! $

    مثال 20. نقل قول در خط فرمان

    در حالت اول، سه پارامتر به فرمان اکو منتقل شد - "یک"، "دو" و "سه". او آنها را بیرون آورد و با فاصله آنها را از هم جدا کرد. در مورد دوم، دو پارامتر وجود داشت: "یک" و "دو سه". در نتیجه این دو پارامتر نیز با فاصله از هم جدا شده اند. در مورد سوم، تنها یک پارامتر وجود داشت - از آپستروف آغازین ""یک" تا بسته شدن "...فراموش کردم!" ". در تمام مدت زمانی که bash در حال تایپ بود، به طور مفید به متدیوس اشاره کرد ">" - به عنوان نشانه ای که خط فرمان تایپ می شود، اما در حالت وارد کردن محتوای نقل قول ها.

    این بخش دستورات و نمادهایی را توصیف می کند که دارای معانی خاصی هستند که به شما امکان می دهد:

    • - پیدا کردن با استفاده از یک الگو و دستکاری گروهی از فایل ها.
    • - اجرای دستور در زمینهیا در یک زمان خاص؛
    • - اجرای متوالی گروهی از دستورات؛
    • - تغییر مسیر ورودی و خروجی استاندارد؛
    • - برنامه های در حال اجرا را خاتمه دهید.

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

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

    کاربر با وارد کردن دستورات از صفحه کلید پس از ظاهر شدن یک اعلان (اعلان) که معمولاً نماد "$" است، با مفسر فرمان ارتباط برقرار می کند. دنباله کاراکترهای وارد شده توسط مترجم یا به عنوان یک نام در نظر گرفته می شود فرمان داخلی، یا به عنوان نام فایل اجرایی.

    آرگومان ها می توانند در هنگام راه اندازی به رویه پوسته (اسکریپت) منتقل شوند. به هر یک از نه آرگومان اول یک پارامتر موقعیتی از $1 تا $9 اختصاص داده شده است ($0 نام خود رویه است) و با این نام ها می توان از متن رویه به آنها دسترسی داشت.

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

    در زیر متاکاراکترهای مورد استفاده آورده شده است پوسته:

    *؟ - به شما این امکان را می دهد که هنگام جستجو بر اساس الگو، نام فایل های کوتاه شده را مشخص کنید.

    & - به این معنی است که دستور در پس زمینه اجرا می شود.

    ; - دستورات را در خط فرمان جدا می کند.

    معنای خاص کاراکترهایی مانند *، ?، [،]، &، ;، را نادیده می گیرد.<,

    "..." - نادیده گرفتن مقدار فضا به عنوان جداکننده و ارزش ویژه

    همه شخصیت ها؛

    "..." - ارزش فضا را به عنوان یک جداکننده و معنای خاص همه کاراکترها به جز $ و;

    > - خروجی فرمان را به یک فایل هدایت می کند.

    < - ورودی دستور را از یک فایل هدایت می کند.

    >> - خروجی دستوری را که باید به آن اضافه شود تغییر مسیر می دهد

    پایان فایل موجود؛

    | - لوله ای ایجاد می کند که خروجی یک فرمان را به ورودی فرمان دیگر هدایت می کند

    `...` - به صورت جفت استفاده می شود. به شما امکان می دهد از خروجی فرمان as استفاده کنید

    آرگومان ها در خط فرمان؛

    $ - با پارامترهای موقعیتی و تعریف شده کاربر استفاده می شود-

    تماس گیرنده متغیر، همچنین به طور پیش فرض در استفاده می شود

    به عنوان یک اشاره پوسته.

    علاوه بر این، برای راحتی کار با فایل ها، تقریباً تمام مفسران دستور کاراکترهای "?" را تفسیر می کنند. و "*"، با استفاده از آنها به عنوان الگوهای نام فایل (معروف به. متا شخصیت ها):

    • ? - هر یک از شخصیت ها؛
    • * - تعداد دلخواه از هر کاراکتر.

    به عنوان مثال: *.c - تمام فایل های با پسوند "c" را مشخص می کند.

    pr???.* - فایل هایی را مشخص می کند که نام آنها با "pr" شروع می شود، شامل پنج کاراکتر و هر پسوندی باشد.

    متغیرهای زبان پوسته

    زبان پوسته به شما امکان می دهد با متغیرها (بدون اعلام قبلی) کار کنید. نام متغیرها با یک حرف شروع می شود و می تواند شامل حروف و اعداد باشد. دسترسی به متغیرها با علامت "$" آغاز می شود.

    مثال. تغییر به فهرست اصلی کاربر: سی دی $HOME

    اپراتور واگذاری. تخصیص مقادیر به متغیرها با استفاده از عملگر `=" بدون فاصله انجام می شود.

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

    REM دو دستور بعدی روی صفحه کپی خواهند شد... DIR C:\ ECHO OFF REM و بقیه دیگر DIR D:\ نخواهند بود

    دستور ECHO ON برای بازیابی حالت تکراری استفاده می شود. علاوه بر این، می توانید با نوشتن علامت @ در ابتدای این خط، تکثیر هر خط را در یک فایل دسته ای خاموش کنید، به عنوان مثال:

    ECHO ON REM دستور DIR C:\ روی صفحه تکرار می شود DIR C:\ REM و دستور DIR D:\ @DIR D:\ نیست.

    بنابراین، اگر دستور را در همان ابتدای فایل قرار دهید

    @ECHO OFF

    سپس این همه مشکلات مربوط به تکرار دستورات را حل می کند.

    در یک فایل دسته‌ای، می‌توانید رشته‌هایی را با پیام‌ها روی صفحه نمایش دهید. این کار با دستور انجام می شود

    پیام ECHO

    مثلا،

    @ECHO OFF ECHO سلام!

    تیم ECHO. (نقطه باید بلافاصله از کلمه "ECHO" پیروی کند) یک رشته خالی را نمایش می دهد.

    معمولاً مشاهده پیام‌های خروجی از یک فایل دسته‌ای با پاک کردن کامل صفحه ابتدا با دستور CLS راحت است.

    با استفاده از مکانیسم تغییر مسیر I/O (نمادهای > و >>)، می توانید پیام های خروجی را با دستور ECHO به یک فایل متنی خاص هدایت کنید. مثلا:

    @ECHO OFF ECHO سلام! > hi.txt ECHO خداحافظ! >> hi.txt

    با استفاده از این روش می توانید مثلاً فایل های پروتکل را با گزارش اقدامات انجام شده پر کنید. مثلا:

    @ECHO OFF REM سعی کنید XCOPY C:\PROGRAMS D:\PROGRAMS /s REM را کپی کنید اگر REM با موفقیت تکمیل شد، کپی اگر REM NOT ERORLEVEL 1 ECHO کپی موفق >> report.txt

    با استفاده از گزینه های خط فرمان

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

    برای دسترسی به گزینه های خط فرمان از یک فایل دسته ای، از کاراکترهای %0، %1، ...، %9 یا %* استفاده کنید. در این حالت، به جای %0، نام فایل دسته ای اجرایی جایگزین می شود، به جای %1، %2، ...، %9 - به ترتیب مقادیر 9 پارامتر خط فرمان اول و به جای % * - همه آرگومان ها. اگر کمتر از نه پارامتر در خط فرمان هنگام فراخوانی یک فایل دسته ای مشخص شده باشد، متغیرهای "اضافی" از % 1 - % 9 با خطوط خالی جایگزین می شوند. مثال زیر را در نظر بگیرید. اجازه دهید یک فایل دسته ای copier.bat با محتوای زیر وجود داشته باشد:

    @ECHO OFF CLS ECHOپرونده % 0 دایرکتوری % 1 تا % 2 را کپی می کند XCOPY % 1 % 2 /S

    اگر مثلاً آن را از خط فرمان با دو پارامتر اجرا کنید

    Copier.bat C:\Programs D:\Backup

    سپس یک پیام بر روی صفحه ظاهر می شود

    فایل copier.bat دایرکتوری C:\Programs را در D:\Backup کپی می کند

    و دایرکتوری C:\Programs با تمام زیر شاخه های آن در D:\Backup کپی می شود.

    در صورت نیاز می توان از بیش از نه گزینه خط فرمان استفاده کرد. این با استفاده از دستور SHIFT که مقادیر پارامترهای جایگزین شده را از %0 به %9 تغییر می‌دهد، به دست می‌آید و هر پارامتر را به پارامتر قبلی کپی می‌کند، یعنی مقدار %1 به %0، مقدار %2 به %1 و غیره کپی می‌شود. پارامتر جایگزین شده %9 روی مقدار پارامتری که از مقدار قدیمی %9 در خط فرمان پیروی می کند، تنظیم می شود. اگر چنین پارامتری تنظیم نشده باشد، مقدار جدید %9 یک رشته خالی است.

    یک مثال را در نظر بگیرید. اجازه دهید فایل دسته ای my.bat از خط فرمان به این صورت فراخوانی شود:

    My.bat p1 p2 p3

    سپس %0=my.bat، %1=p1، %2=p2، %3=p3، پارامترهای %4 - %9 رشته‌های خالی هستند. پس از اجرای دستور SHIFT، مقادیر پارامترهای جایگزین شده به صورت زیر تغییر می کند: %0=p1، %1=p2، %2=p3، پارامترهای %3 - %9 رشته های خالی هستند.

    هنگامی که پردازش فرمان پیشرفته فعال است، SHIFT از سوئیچ /n پشتیبانی می کند، که شروع تغییر پارامتر را از عدد n مشخص می کند، جایی که n می تواند یک عدد از 0 تا 9 باشد.
    برای مثال در دستور زیر:

    SHIFT /2

    پارامتر % 2 با % 3، % 3 با % 4 و غیره جایگزین می شود، در حالی که پارامترهای % 0 و % 1 بدون تغییر باقی می مانند.

    هیچ دستوری برعکس SHIFT (تغییر معکوس) وجود ندارد. پس از اجرای SHIFT، دیگر امکان بازیابی پارامتر (%0) که اولین قبل از شیفت بود وجود ندارد. اگر بیش از ده پارامتر در خط فرمان مشخص شده باشد، دستور SHIFT می تواند چندین بار استفاده شود.
    که در فایل های دسته ایبرخی از احتمالات وجود دارد تجزیهپارامترهای جایگزینی برای پارامتر شماره n (%n)، نحو (عملگر) زیر مجاز است:

    جدول 2.1. عملگرها برای پارامترهای جایگزین شده

    اپراتورها

    شرح

    متغیر %n به نام فایل کامل گسترش می یابد

    فقط نام درایو از متغیر %n استخراج می شود

    فقط مسیر فایل از متغیر %n استخراج می شود

    فقط نام فایل از متغیر %n استخراج می شود

    پسوند نام فایل از متغیر %n استخراج شده است

    معنی عملگرهای N و X برای متغیر %n تغییر می کند تا با نام فایل کوتاه کار کنند

    دایرکتوری های مشخص شده در متغیر محیطی PATH جستجو می شوند و متغیر %n با متغیر جایگزین می شود نام و نام خانوادگیاولین فایل پیدا شد اگر متغیر PATH تعریف نشده باشد یا هیچ فایلی در نتیجه جستجو یافت نشد، این ساختار با یک رشته خالی جایگزین می شود. به طور طبیعی، در اینجا متغیر PATH می تواند با هر مقدار معتبر دیگری جایگزین شود

    این ساختارهای نحوی را می توان با یکدیگر ترکیب کرد، به عنوان مثال:

    %~DPn - نام و مسیر درایو از متغیر %n استخراج می شود.
    %~NXn - نام و پسوند فایل از متغیر %n استخراج می شود.

    مثال زیر را در نظر بگیرید. اجازه دهید در دایرکتوری C:\TEXT باشیم و اجرا کنیم فایل دسته ایبا پارامتر Story.doc (%1=Story.doc). سپس اعمال عملگرهای شرح داده شده در جدول بالا به پارامتر % 1 نتایج زیر را ایجاد می کند:

    %~F1=C:\TEXT\Story.doc %~D1=C: %~P1=\TEXT\ %~N1=داستان %~X1=.doc %DP1=C:\TEXT\ %NX1=Story.doc