• تغییر مسیر I/O در لینوکس. کانال ها و جریان های برنامه، تغییر مسیر

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

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

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

    ابتدا چند دستور را در نظر بگیرید که با آنها می توانید ورودی / خروجی را سازماندهی کنید.

    دستورات خروجی به خروجی استاندارد

    لینوکس چندین دستور را برای چاپ پیام ها در خروجی استاندارد ارائه می دهد:

    • echo - یک رشته در خروجی استاندارد بنویسید.
    • printf - متن فرمت شده را در خروجی استاندارد چاپ کنید.
    • بله - متن مکرر را در خروجی استاندارد چاپ کنید.
    • seq - دنباله ای از اعداد را در خروجی استاندارد چاپ کنید
    • پاک کردن صفحه یا پنجره را پاک کنید.

    به عنوان مثال، هنگام استفاده از دستور echo، اگر کاراکتر کنترل \c را مشخص کنید، پس از تکمیل خروجی، انتقال به خط جدید:

    $ echo "اسم تو چیست؟\c"

    اسمت چیه؟$

    در اینجا $ کاراکتر دعوت است.

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

    $ echo "دایرکتوری اصلی شما $HOME است، شما به یک ترمینال متصل هستید - `tty`"

    فهرست اصلی شما /home/knoppix است، شما به ترمینال متصل هستید - /dev/tty1

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

    به عنوان مثال، برای نمایش رشته "/dev/tty1" باید اجرا کنید:

    $echo "\"/dev/tty1\""

    دستورات ورودی از دستگاه استانداردورودی

    دستور read یک خط را از ورودی استاندارد می خواند و محتوای آن را روی متغیرهای مشخص شده می نویسد. هنگام تعیین چندین متغیر، کلمه اول به اولی آنها، دومی به دومی و غیره نوشته می شود. در آخر - بقیه خط.

    اسکریپت زیر یک دستور read جداگانه را برای خواندن هر متغیر فراخوانی می کند.


    تست گربه دلار
    #!/bin/bash
    echo "Name: \c"
    نام را بخوانید
    echo "نام خانوادگی: \c"
    نام خانوادگی را بخوانید
    echo “First name=” $name “Last name=” $نام خانوادگی

    سپس برای اجرای این اسکریپت باید به فایل تست حق اجرا بدهید: chmod 0755 test و آن را اجرا کنید./test. نتیجه اعدام: نام: ایوان نام خانوادگی: پتروف نام = ایوان نام خانوادگی = پتروف

    ورودی، خروجی، و جریان های خطا استاندارد

    هر برنامه راه اندازی شده از پوسته دارای سه جریان ورودی/خروجی باز است:

    ورودی استاندارد (sldin) - خروجی استاندارد (sldout) - خروجی خطای استاندارد (stderr)

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

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

    توصیف کننده فایل
    ورودی استاندارد 0
    خروجی استاندارد 1
    جریان خطای استاندارد 2

    در واقع، 12 فایل باز ایجاد می شود، اما فایل هایی با توصیفگرهای 0، 1، و 2 برای ورودی، خروجی و خطای استاندارد رزرو می شوند. کاربران همچنین می توانند با فایل هایی که دارای توصیف کننده فایل 3 تا 9 هستند (رزرو شده) کار کنند.

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

    فایل خروجی استاندارد (stdout) دارای توصیفگر فایل 1 است. تمام خروجی های فرآیند در این فایل نوشته می شود. به‌طور پیش‌فرض، داده‌ها به صفحه ترمینال (دستگاه/dev/tty) خروجی می‌شوند، اما همچنین می‌توان آن‌ها را به یک فایل هدایت کرد یا از طریق یک لوله به فرآیند دیگری فرستاد.

    فایل جریان خطای استاندارد (siderr) دارای توصیفگر 2 است. پیام های خطایی که در هنگام اجرای دستور رخ می دهد در این فایل نوشته می شود. به‌طور پیش‌فرض، پیام‌های خطا در صفحه پایانه چاپ می‌شوند (دستگاه /dev/tty)، اما می‌توانند به یک فایل نیز هدایت شوند. چرا تخصیص لازم است فایل ویژه? نکته این است که بسیار است راه راحتاستخراج داده های خروجی واقعی از نتایج دستور، و همچنین فرصت خوبی برای سازماندهی موثر نگهداری انواع مختلف فایل های گزارش.

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

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

    یک مورد خاص مفید در استفاده از مکانیسم تغییر مسیر جریان، تغییر مسیر به /dev/null است که به شما امکان می دهد از شر پیام های غیر ضروری روی صفحه خلاص شوید. با استفاده از همین مکانیسم، می توانید فایل های خالی ایجاد کنید:

    % cat myfile - در فهرست فعلی ایجاد می شود فایل خالی myfile.

    /dev/null - یک فایل خاص، که به اصطلاح. "دستگاه خالی". نوشتن بر روی آن، صرف نظر از میزان اطلاعات "ثبت شده" موفقیت آمیز است. خواندن از /dev/null معادل خواندن انتهای فایل EOF است.

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

    - تغییر مسیر جریان خروجی استاندارد
    - تغییر مسیر جریان خروجی استاندارد در حالت الحاق
    - تغییر مسیر جریان ورودی استاندارد
    - گرفتن داده ها از ورودی استاندارد تا زمانی که با یک جداکننده مواجه شویم

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

    رایج ترین اپراتورهای تغییر مسیر

    شماره شرح نحو
    1 فرمان فایل خروجی استاندارد را به فایل جدید

    2 فرمان 1 فایل خروجی استاندارد را به فایل مشخص شده

    فرمان 3 فایل خروجی استاندارد را به فایل مشخص شده ارسال می کند (حالت پیوست)

    4 فایل فرمان 2&1 خروجی استاندارد و خطا را به فایل مشخص شده ارسال می کند.

    5 فرمان 2 فایل خطای استاندارد را به فایل مشخص شده ارسال می کند.

    6 دستور 2 فایل خطای استاندارد را به فایل مشخص شده ارسال می کند (حالت پیوست)

    فایل فرمان 7 2&1 خروجی استاندارد و خطا را به فایل مشخص شده ارسال می کند (حالت پیوست)

    8 فرمان file1 file2 از فایل اول ورودی می گیرد و خروجی را به فایل دوم می فرستد

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

    10 فرمان جداکننده داده ها را از ورودی استاندارد تا زمانی که با یک جداکننده مواجه شود دریافت می کند.

    11 فرمان &m ورودی استاندارد را از توصیفگر فایل m می گیرد

    12 فرمان &m خروجی استاندارد را به توصیف کننده فایل m هدایت می کند

    عملگر n&m به شما امکان می دهد فایل را با توصیفگر n به جایی که فایل با توصیفگر m هدایت می شود، هدایت کنید. می تواند چندین عملگر مشابه در خط فرمان وجود داشته باشد که در این صورت از چپ به راست ارزیابی می شوند.

    دستور exec و استفاده از توصیفگرهای فایل

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

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

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

    Exec & - که جریان ورودی استاندارد (در این مورد، یک فایل) را می بندد. رویکرد مشابهی اعمال می شود
    عمدتاً در اسکریپت هایی که در هنگام خروج اجرا می شوند.

    دستور exec یک اشاره گر به یک فایل با توصیفگر 0 (stdin) است. این نشانگر فقط زمانی قابل بازیابی است که اسکریپت به پایان برسد.
    اگر قرار است اسکریپت به خواندن داده ها از صفحه کلید ادامه دهد، باید ذخیره کنید
    یک اشاره گر به جریان ورودی قدیمی. در زیر یک اسکریپت کوچک وجود دارد که نحوه انجام این کار را نشان می دهد.

    گربه $ f_desc
    #!/bin/bash
    فایل exec 3&0 0
    خط را بخوانید
    خط 2 را بخوانید
    exec 0&3
    echo $1inel
    echo $line2

    اولین دستور exec یک اشاره گر را به جریان ورودی استاندارد (stdin) در توصیفگر فایل 3 ذخیره می کند.
    (هر عدد صحیح بین 3 و 9 مجاز است) و سپس فایل فایل را برای خواندن باز می کند. دو دستور بعدی را می خوانند
    خواندن دو خط متن از یک فایل فرمان دوم exec نشانگر را به ورودی استاندارد بازیابی می کند: now
    با stdin مرتبط است نه فایل. دستورات اکو نهایی محتویات خطوط خوانده شده را روی صفحه نمایش می دهد.
    که در متغیرهای linel و Iine2 ذخیره شده اند.

    نتیجه فیلمنامه:
    $ ./ f_desc
    سلام!
    خدا حافظ!

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

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

    از جانب خط فرماناین امکانات به شرح زیر اجرا می شود. برای تغییر مسیر پیام های متنی خروجی توسط هر دستوری از خط فرمان به یک فایل متنی، باید از ساختار استفاده کنید. فرمان > نام فایل.اگر در همان زمان فایل مشخص شده برای خروجی از قبل وجود داشته باشد، پس از آن بازنویسی می شود (محتوای قدیمی از بین می رود)، اگر وجود نداشت، ایجاد می شود. همچنین نمی‌توانید دوباره فایل را ایجاد کنید، بلکه خروجی اطلاعات را با دستور به انتهای فایل موجود اضافه کنید. برای این کار باید دستور output redirection به صورت زیر مشخص شود: فرمان >> نام فایل. با نماد< можно прочитать входные данные для заданной команды не с клавиатуры, а из определенного (заранее подготовленного) файла: команда < имя_файла

    نمونه هایی از تغییر مسیر I/O در خط فرمان

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

    1. خروجی نتایج دستورات پینگبرای تشکیل پرونده ping ya.ru > ping.txt

    2. اضافه کردن متن راهنما برای دستورات xcopyفایل copy.txt: XCOPY /؟ >> copy.txt

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

    برای مثال، دستور زیر هم خروجی استاندارد و هم خطای استاندارد را به copy.txt هدایت می کند: XCOPY A:\1.txt C:> copy.txt 2>&1

    سه جهت ورودی/خروجی اختصاص داده شده است - ورودی استاندارد، خروجی و جریان خطا ( stdin، stdout، stderr ). به طور پیش فرض، هر سه رشته با یک ترمینال مرتبط هستند. در این حالت، برنامه تمام پیام های خود از جمله پیام های مربوط به خطاها را در ترمینال نمایش می دهد. پوسته به شما اجازه می دهد تا این جریان های استاندارد را تغییر مسیر دهید، I/O و ادغام جریان را تنظیم کنید.

    تغییر مسیر جریان های ورودی/خروجی.

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

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

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

    prog1 | prog2 -ارسال جریان خروجی برنامه prog1 به جریان ورودی برنامه prog2.

    n> فایل فایل.

    n>> فایل تغییر مسیر جریان استاندارد با توصیفگر n به فایل فایل به انتهای فایل ضمیمه شده است.

    n>&m -ترکیب جریان ها با توصیفگرها n و متر .

    $ prog1 >/dev/null 2>&1

    /dev/null شبه وسیله ای است که جریان هدایت شده به آن را از بین می برد.

    انتقال جریان خروجی یک برنامه به جریان ورودی برنامه دیگر یک روش معمول است. مثلا:

    $ gzip -d archive.tar.gz | tar -xf

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

    $ gzip -d archive.tar.gz

    $ tar -xf archive.tar

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

    شرایط آزمایشی

    [ وضعیت ]

    لازم به ذکر است که باید بین براکت و شرط فاصله وجود داشته باشد در غیر این صورت پوسته نمی تواند "[" را به عنوان یک فرمان تشخیص دهد تست . پس از اتمام موفقیت آمیز تست برمی گرداند "0" .

    شرایط بررسی فایل ها:

    فایل -fفایل "فایل" یک فایل معمولی است

    فایل -d فایل " فایل" یک دایرکتوری است.
    فایل -c فایل "فایل" یک فایل خاص است
    فایل -r فایل "فایل" مجوز خواندن دارد

    فایل -w فایل "فایل" اجازه نوشتن دارد

    فایل -x فایل "فایل" مجوز اجرا دارد

    فایل -s فایل "فایل" خالی نیست.

    شرایط اعتبار سنجی ردیف:

    string1=string2 رشته های رشته 1 و رشته 2 مطابقت دادن

    string1!=string2 رشته های رشته 1 و رشته 2 با هم مطابقت ندارند.

    -n رشته 1 خط رشته 1 وجود دارد.

    -z رشته 1 خط رشته 1 وجود ندارد.

    شرایط انجام عملیات با اعداد صحیح:

    x -eq y x برابر y است

    x -ne y x برابر با y نیست

    x -gt y x بزرگتر از y است

    x-gey x بزرگتر یا مساوی y است

    x -lt y x کمتر از y است

    x-ley x کمتر یا مساوی y است

    در این مورد دستور تست رشته ها را به عنوان اعداد صحیح در نظر می گیرد. یک مقدار null نیز با یک رشته خالی مطابقت دارد.

    عملیات بولیدر زمینه تست

    ! (نه) منطقی "نه"

    -o (یا) منطقی "OR"

    -a (و) منطق "و"

    اپراتور مشروط "اگر"

    فرم کلیبا استفاده از یک دستور شرطی if به صورت زیر نمایش داده می شود:

    اگر<условие>

    سپس<список команд>

    [الیف<условие>

    سپس<список> ]

    عبارات محصور شده در پرانتز اختیاری هستند. آن ها ما می توانیم متداول ترین اصلاح "خرد شده" عملگر شرطی را تصور کنیم:

    اگر<условие>

    سپس<список команд>

    در این صورت اگر <условие> تکمیل شد (کد تکمیل 0) سپس اجرا شد <список команд>. در غیر این صورت <список команд> پرش کرد.

    بیانیه را انتخاب کنید مورد

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

    مورد<строка>که در

    الگو 1)

    ........

    الگو2)

    ........

    ........

    معنی <строка> به ترتیب با الگوها مقایسه می شود. اگر مطابقت یافت شود، دستورات بخش مربوطه اجرا می شود. لازم به ذکر است که در قالب ها امکان استفاده از ماسک وجود دارد. اگر مطابقت پیدا نشد، دستورات از بخش با الگوی "*" اجرا می شوند (به طور مشابه پیش فرض انتخابگر تعویض V با ).

    به عنوان مثال، در اینجا یک قطعه از اسکریپت مقداردهی اولیه است BSD UNIX . در اینجا متغیرها (inetd_enable و inetd_flags) از فایل دیگری به دست آمد ( rc.conf).

    . /etc/rc.conf

    مورد ($inetd_enable) در

    )

    اگر [ -x /usr/sbin/inetd ]; سپس

    /usr/sbin/inetd $inetd_flags

    فی

    ;;

    اساک

    بیانیه حلقه شمارش برای

    نحو اپراتور برای

    برای<имя>

    <список команд>

    قطعه برجسته شده در براکت های مربع، ممکن است گم شده باشد. اپراتور برای تضمین می کند که حلقه به تعداد دفعاتی که کلمات در لیست مقادیر وجود دارد اجرا می شود. در همان زمان، متغیر <имя> مقادیر کلمات را به ترتیب از لیست می گیرد. لیست خود را می توان از خروجی دستورات دیگر تشکیل داد. اگر لیست از دست رفته است، پس <имя> مقادیر ارسال شده به عنوان پارامترهای اسکریپت موقعیتی را می پذیرد.

    عبارت حلقه با شرط واقعی در حالی که

    نحو اپراتور در حالی که به طور کلی دارای ساختار زیر است:

    در حالی که<условие>

    <список команд>

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

    عبارت حلقه با شرط نادرست تا زمان

    نحو اپراتور تا زمان به طور کلی دارای ساختار زیر است:

    تا زمان<условие>

    <список команд>

    لیست دستورات تا زمانی که شرط نادرست باشد در یک حلقه اجرا می شود. اولین باری که وارد حلقه می شوید، شرط نباید درست باشد. لازم به ذکر است که شرط حلقه بعد از هر بار از نظر نادرستی بررسی می شود. و اولین دستور اجرا شده در حلقه.

    دستورات اساسی سیستم عامل یونیکسبرای کار با فایل ها

    1. تیم pwd.

    نحو: pwd .

    توضیحات: دستور نام دایرکتوری فعلی را برای پوسته در حال اجرا نمایش می دهد.

    تمرین 1.

    از دستور pwd برای تعیین فهرست خانه خود استفاده کنید.

    فرمان و نتیجه کار آن را در گزارش منعکس کنید.

    2. تیم مرد.

    نحو: مرد نام.

    نام، نام دستور، ابزار، تماس سیستمی، تابع کتابخانه، فایل.

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

    وظیفه 2.

    از ابزار man برای مشاهده اطلاعات مربوط به دستور pwd استفاده کنید.

    اطلاعات مختصری درباره تیم را در گزارش بنویسید (به زبان روسی).

    3. تیم سی دی.

    نحو: سی دی فهرست_نام.

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

    سی دیبدون گزینه های فعلی دایرکتوری خانه شما را می سازد.

    وظیفه 3.

    دایرکتوری فعلی را یک سطح بالاتر کنید. آن را بررسی کنید، سپس به فهرست اصلی خود بازگردید. تغییر دایرکتوری را بررسی کنید.

    اجرای دستورات انجام شده را در گزارش ثبت کنید.

    4. تیم ls.

    نحو: ls فهرست_نام

    توضیحات: دستور برای مشاهده محتویات دایرکتوری مشخص شده.

    lsبدون پارامتر، فهرستی از فایل ها را از دایرکتوری فعلی چاپ می کند.

    لیست به دست آمده شامل فایل هایی نخواهد بود که نام آنها با علامت " شروع می شود. . ” - فایل های ایجاد شده توسط مختلف برنامه های سیستمیبرای اهداف شما نگاه کن لیست کاملفایل ها را می توان در دستور مشخص کرد ls کلید "-a"،

    آن ها ls -a directory_name

    مجوزهای فایل

    با هر فایل در سیستم عامل یونیکس با یک کلمه 12 بیتی به نام "مجوزها" برای فایل مرتبط است.

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

    برای اطلاع از حقوق دسترسی به یک فایل خاص، می توانید از دستور استفاده کنید

    ، مثلا:

    > ls -l /bin/cat

    گروهی از شخصیت ها در ابتدای یک خط -rwxr-xr-x نوع فایل را نشان می دهد (نویسه اول؛ منهای به این معنی است که با یک فایل معمولی، حرف روبه رو هستیم د به معنای دایرکتوری و غیره است) و مجوزها، به ترتیب، برای مالک (در این مورد rwx ، یعنی خواندن، نوشتن و اجرا)، گروه و سایر موارد (در این مورد r-x ، یعنی بدون مجوز نوشتن). بنابراین فایل /bin/cat در دسترس هر کاربری برای خواندن و اجرا است، اما فقط کاربر می تواند آن را تغییر دهد ریشه (یعنی مدیر).

    می توانید کلمه مجوز فایل را به صورت بنویسید عدد اکتال(3 کاراکتر - رقم هشتگانه)، سه رقمی (مالک، گروه، سایر کاربران) هر کاراکتر در این عدد هشت رقمی سه رقمی به صورت مجموع حقوق تشکیل می شود: 4 - حقوق خواندن، 2 - حقوق نوشتن، 1 - استفاده ( از سه گانه باینری) : (111) 2 =2 0 +2 1 +2 2 =(1+2+4) 10 .

    مثلا، 7 = 1 + 2 + 4 Þ rwx راست

    4 2 1

    6 = 0 + 2 + 4 Þ حقوق rw- -

    4 2 0

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

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

    $ chmod 744 filel.c.

    وظیفه 4.

    الف) بدست آوردن اطلاعات کاملبرای دستور ls، از ابزار man استفاده کنید. خروجی دستور را به یک فایل متنی هدایت کنید.

    ب) محتویات کامل دایرکتوری فعلی را مشاهده کنید و این خروجی را به یک فایل متنی نیز هدایت کنید.

    ج) با دستور ls-l<имя_файла> اطلاعات مربوط به حقوق دسترسی به فایل متنی را که در مرحله 4b با آن کار کرده اید، خروجی بگیرید، سپس این اطلاعات را به همان فایل متنی هدایت کنید. نتیجه گیری خود را توضیح دهید

    5. تیم گربه.

    تغییر مسیر I/O.

    برای مشاهده محتویات یک فایل متنی کوچک روی صفحه، می توانید از دستور زیر استفاده کنید:

    گربهنام فایل

    توجه!سعی نکنید محتویات دایرکتوری و فایل های باینری را به این شکل مشاهده کنید.

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

    در یک تیم گربه چندین نام فایل را می توان مشخص کرد:

    cat file1 فایل 2 ... فایل N

    محتویات تمام فایل ها در یک ردیف روی صفحه نمایش داده می شود.

    می توانید خروجی را به برخی از فایل ها هدایت کنید:

    فایل cat 1 فایل 2 > result_file

    تغییر مسیر خروجی از خروجی استاندارد (صفحه نمایش) به یک فایل برای همه دستورات استاندارد است. می توانید ورودی استاندارد (از صفحه کلید) را تغییر مسیر دهید، به عنوان مثال، داده های برنامه را از یک فایل، با استفاده از "<”.

    گربه > new_file - یک فایل متنی جدید با محتوایی که از صفحه کلید وارد می کنید ایجاد می کند.

    فرآیند ورود اطلاعات را لغو کنید -

    وظیفه 5.

    یک فایل متنی جدید با cat ایجاد کنید و محتویات آن را مشاهده کنید. خروجی را از استریم استاندارد به فایل دیگری که نام آن را از صفحه کلید وارد می کنید هدایت کنید و از صحت عملکرد مطمئن شوید.

    6. ساده ترین دستورات برای کار با فایل ها : cp، rm، mkdir، mv

    برای ایجاد یک دایرکتوری جدید، از دستور زیر استفاده کنید:

    mkdirفهرست_نام

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

    cpمنبع_فایل مقصد_فایل.

    تیم

    فایل cp 1 فایل 2 .... فایل N فهرست مقصد

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

    * - با تمام رشته‌های کاراکتر، از جمله خالی، مطابقت دارد.

    همه شخصیت های مجرد

    [ ...] - با هر نویسه محصور شده در پرانتز مطابقت دارد. یک جفت کاراکتر که با یک منهای از هم جدا شده اند، محدوده ای از کاراکترها را مشخص می کند.

    تیم

    cp-r source_dir destination_dir

    برای کپی بازگشتی یک دایرکتوری (source_dir) در یک فهرست جدید (destination_dir) خدمت می کند.

    به جای نام در دستورات کپی، می توان از الگوهای آنها استفاده کرد.

    تیم

    فایل rm 1 فایل 2 .... فایل N

    به شما امکان می دهد 1 یا چند فایل معمولی را از فهرست فعلی حذف کنید.

    به جای نام می توان از الگوها استفاده کرد. اگر می خواهید یک یا چند دایرکتوری را به همراه محتوای آنها حذف کنید (حذف بازگشتی) در دستور rm استفاده از کلید -r

    Rm-r dir 1 dir 2

    دستور تغییر نام:

    mvمنبع_نام مقصد_نام

    فایل با نام source_name به فایل مقصد_name تغییر نام داده می شود. در این حالت قبل از اجرای دستور، فایلی با نام destination_name نباید وجود داشته باشد.

    وظیفه 6.

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

    من در سیستم عامل یونیکس کار می کنم

    یک اسکریپت را سازماندهی کنید.

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

    وظیفه 7.

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

    وظیفه 3،

    وظیفه 4B، 4C،

    وظیفه 5،

    وظیفه 6.

    در کار 6، فراموش نکنید که بررسی کنید آیا برنامه با موفقیت فایل را با خروجی روی صفحه نمایش کپی کرده است یا خیر. پیام های متنیو محتویات دایرکتوری های مربوطه.

    لازم است که در فایل دسته ایصدور مناسب درخواست برای ورودی داده از صفحه کلید با استفاده از دستور: $ echo - n "متن پرس و جو" سازماندهی شد.

    2). اسکریپت را با نام Myscript1 ذخیره کنید، آن را با دستور اجرا کنید

    sh Myscript1

    داده های درخواستی را وارد کرده و نتایج را بررسی کنید.

    3). گزارشی از کار آزمایشگاهی انجام شده تهیه کنید که باید کار شما را در حالت تعاملی و با اسکریپت منعکس کند که شامل متن فیلمنامه (همراه با نظرات) و نتایج به دست آمده روی صفحه و در فایل ها باشد.

    تماس های سیستمی گیج و بی حال

    شناسه کاربری که برنامه را برای اجرا راه اندازی کرده است پیدا کنید - UID و شناسه گروهی که به آن تعلق دارد ,-GID با تماس های سیستمی قابل انجام است getuid() و getpid() با اعمال آنها در داخل این برنامه.

    نمونه های اولیه فراخوانی سیستم:

    #عبارتند از

    #عبارتند از

    uid_t getuid(void);

    gid_t getgid(void);

    وظیفه 8.

    برنامه ای بنویسید، کامپایل کنید و اجرا کنید که شناسه کاربری که برنامه را اجرا می کند و شناسه گروه کاربر را چاپ کند.

    برنامه را به همراه نتایج در گزارش درج کنید.

    کنترل سوالات

    1. مفهوم فایل در سیستم عامل یونیکس . دایرکتوری خانه چیست؟

    2. ابزار گروه بندی دستورات چیست پوسته -مترجم؟ مثال هایی از استفاده را ذکر کنید

    3. I/O چگونه هدایت می شود؟

    4. خط فرمان چیست؟ مثال زدن.

    5. چگونه به معنی پوسته انجام عملیات حسابی بر روی پوسته -متغیر؟

    6. قوانین تولید نام فایل ها چیست؟

    7. جایگزینی نتایج اجرای دستور چگونه انجام می شود؟

    8. چگونه یک رشته را تفسیر کنیم cmd1&cmd2& ?

    9. چگونه یک رشته را تفسیر کنیم cmd1 &&cmd2& ?

    10. چگونه یک رشته را تفسیر کنیم cmd1 || cmd2 & ?

    11. همانطور که در یونیکس مجوزهای فایل تعریف شده است؟ از کدام دستور می توان برای مشاهده آنها برای یک فایل خاص استفاده کرد؟

    12. چگونه می توان شناسه کاربری که برنامه را راه اندازی کرده و شناسه گروه او را تعیین کرد؟

    کار آزمایشگاهی № 3.

    فرآیندها در سیستم عامل یونیکس

    هدف کار

    نحوه ایجاد فرآیندها را بیاموزید و یاد بگیرید که چگونه زمینه کاربر فرآیندها را با استفاده از تماس های سیستمی مورد استفاده در برنامه های زبان تغییر دهید. با، V سیستم عامل یونیکس.

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

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

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

    4. خانواده توابع را برای سازماندهی یک فراخوانی سیستم مطالعه کنید exec().

    5. برنامه ای به زبان بنویسید با مطابق با نسخه Task 4 صادر شده توسط معلم، برنامه را اشکال زدایی کنید و نتایج را به معلم نشان دهید. شامل برنامه با نتایج در گزارش.

    6. با پاسخ دادن به سوالات کنترلی از کار معلم محافظت کنید.

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

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

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

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

    خروجی استاندارد

    Methodius قبلاً با این واقعیت روبرو شده است که برخی از برنامه ها می توانند نه تنها به ترمینال، بلکه همچنین به یک فایل، به عنوان مثال، اطلاعات هنگام تعیین خروجی خروجی دهند. کلید پارامتریک"-o" به دنبال نام فایل، متن دستی را به جای نمایش بر روی مانیتور، به فایل خروجی می دهد. حتی اگر توسعه دهندگان برنامه چنین کلیدی را ارائه ندهند، متودیوس همچنین راه دیگری برای ذخیره خروجی برنامه در یک فایل به جای نمایش آن بر روی مانیتور می داند: علامت ">" را قرار داده و نام فایل را بعد از آن مشخص کنید. . بنابراین، متدیوس قبلاً کوتاه ساخته است فایل های متنی(اسکریپت ها) با استفاده از ابزار cat (به فصل دسترسی به فرآیند به فایل ها و فهرست ها مراجعه کنید).

    $ cat > textfile این یک فایل نمونه است. ^D $ ls -l textfile -rw-r--r-- 1 methody methody 23 نوامبر 15 16:06 textfile

    مثال 2. تغییر مسیر خروجی استاندارد به یک فایل

    البته، امکانات خود ابزار گربه با استفاده از نماد "\u003e" گسترش نیافته است. علاوه بر این، گربه در این مثال از دریافت نکرد پوسته فرمانبدون گزینه: بدون علامت ">"، بدون نام فایل بعدی. در این مورد، گربه طبق معمول کار می‌کرد، بدون دانستن (و حتی علاقه‌مند نبود!) خروجی به کجا ختم می‌شود: روی صفحه نمایشگر، در یک فایل یا جای دیگر. cat به جای مراقبت از تحویل خروجی به مقصد نهایی (خواه شخص باشد یا یک فایل)، تمام داده ها را به خروجی استاندارد(به اختصار stdout).

    جایگزینی خروجی استاندارد وظیفه پوسته است. که در این مثالپوسته یک فایل خالی ایجاد می کند که نام آن پس از علامت ">" مشخص شده است و توصیف کننده فایل این فایل به برنامه cat در شماره 1 ارسال می شود ( خروجی استاندارد). این کار بسیار ساده انجام می شود. در سخنرانی دسترسی به فرآیندها به فایل ها و فهرست ها، در مورد نحوه اجرای دستورات از پوسته صحبت کردیم. به طور خاص، پس از اجرای fork()، دو فرآیند یکسان ظاهر می شود، که یکی از آنها - فرزند - باید دستور را به جای خود اجرا کند (exec()). بنابراین قبل از آن او بسته می شودخروجی استاندارد (توصیفگر 1 آزاد شده است) و باز می شودفایل (مرتبط با اولینیک توصیفگر رایگان، یعنی 1)، و فرمان در حال اجرا نیازی به دانستن چیزی ندارد: خروجی استاندارد آن قبلاً جایگزین شده است. این عملیات نامیده می شود تغییر مسیرخروجی استاندارد در صورتی که فایل از قبل وجود داشته باشد، پوسته آن را بازنویسی می‌کند و همه چیزهایی که قبلاً در آن وجود داشت را کاملاً از بین می‌برد. بنابراین، Methodius، برای ادامه نوشتن داده ها در textfile، به عملیات دیگری نیاز دارد - ">>".

    $ cat >> textfile مثال 1. ^D $ cat textfile این فایل نمونه است. مثال 1. $

    مثال 3. تغییر مسیر غیر مخرب stdout

    متودیوس دقیقاً نتیجه مورد نیاز خود را به دست آورد: او داده ها را از خروجی استاندارد دستور بعدی به انتهای یک فایل موجود اضافه کرد.

    خروجی استاندارد جریان داده ای که توسط سیستم برای هر فرآیند در زمان راه اندازی آن باز می شود و برای خروجی داده توسط فرآیند در نظر گرفته شده است.

    ورودی استاندارد

    به طور مشابه، برای انتقال داده به ورودی برنامه، می توان از آن استفاده کرد ورودی استاندارد(مخفف stdin). هنگام کار با خط فرمان، ورودی استاندارد کاراکترهایی است که کاربر از صفحه کلید وارد می کند. ورودی استاندارد را می توان با استفاده از پوسته فرمان با تغذیه داده ها از برخی فایل ها هدایت کرد. سمبل "< » служит для перенаправления содержимого файла на стандартный ввод программе. Например, если вызвать утилиту sort без параметра, она будет читать строки со стандартного ввода. Команда « sort < имя_файла” داده های مرتب سازی ورودی را از فایل ارائه می دهد.

    مرتب سازی $< textfile Пример 1. Это файл для примеров. $

    مثال 4. تغییر مسیر ورودی استاندارد از یک فایل

    نتیجه این دستور دقیقاً مشابه دستور sort textfile است، تفاوت این است که وقتی "< », sort получает данные со стандартного ввода, ничего не зная о файле « textfile », откуда они поступают. Механизм работы shell в данном случае тот же, что и при перенаправлении вывода: shell читает данные из файла « textfile », запускает утилиту sort и передаёт ей на стандартный ввод содержимое файла.

    شایان ذکر است که عملیات "\u003e" مخرب: همیشه یک فایل با طول صفر ایجاد می کند. بنابراین، به عنوان مثال، مرتب سازی داده ها در پروندهباید مرتب سازی متوالی اعمال شود < файл >new_fileو mv فایل new_file. مشاهده فرمان تیم< файл >same_fileفقط آن را به طول صفر کوتاه کنید!

    ورودی استاندارد جریان داده ای که توسط سیستم برای هر فرآیند در زمان راه اندازی آن باز می شود و برای ورودی در نظر گرفته شده است.

    خروجی خطای استاندارد

    به عنوان اولین مثال و تمرینی برای تغییر مسیر، متودیوس تصمیم گرفت در فایل cat.info خود یک کتابچه راهنمای گربه بنویسد:

    $ info cat > اطلاعات cat.info: ورود گره (coreutils.info.bz2) فراخوانی گربه... اطلاعات: تکمیل شد. $ head -1 فایل cat.info: coreutils.info، Node: cat invocation، بعدی: tac invocation، بالا: خروجی کل فایل ها $

    مثال 5. خروجی خطای استاندارد

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

    خروجی خطای استاندارد جریان داده ای که توسط سیستم برای هر فرآیند در زمان راه اندازی آن باز می شود و برای آن در نظر گرفته شده است پیام های تشخیصیخروجی توسط فرآیند

    استفاده از خروجی خطای استاندارد به همراه خروجی استاندارد به شما این امکان را می دهد که نتیجه واقعی برنامه را از انواع اطلاعات همراه جدا کنید، به عنوان مثال، با ارسال آنها به فایل های مختلف. خروجی خطای استاندارد را می توان به همان روش ورودی/خروجی استاندارد با استفاده از ترکیب کاراکتر "2" هدایت کرد.

    $ info cat > cat.info 2> cat.stderr $ cat cat.stderr info: ورودی گره (coreutils.info.bz2) فراخوانی گربه... اطلاعات: تکمیل شد. $

    مثال 6. تغییر مسیر خطای استاندارد

    این بار هیچ چیز به ترمینال نرسید، خروجی استاندارد به فایل cat.info رفت، خروجی خطای استاندارد به cat.stderr رفت. به جای «>» و «2»، متدیوس می توانست «1>» و «2>» را بنویسد. اعداد در این مورد نشان دهنده اعداد توصیفگرها هستند باز شدفایل ها. اگر برخی از ابزارها انتظار دریافت دارند باز کنتوصیف کننده با یک عدد، مثلاً 4، سپس به منظور اجرای آن لزوماشما باید از ترکیب "4>" استفاده کنید.

    با این حال، گاهی اوقات می خواهید stdout و stderr را در یک فایل ترکیب کنید، نه اینکه آنها را از هم جدا کنید. که در پوسته bash یک دنباله خاص " 2>&1 " برای این دارد. این به معنای "خطای استاندارد لوله در همان محل خروجی استاندارد" است:

    $ info cat > cat.info 2>&1 $ head -3 cat.info info: Write node (coreutils.info.bz2) cat invocation... اطلاعات: تکمیل شد. فایل: coreutils.info، گره: فراخوانی گربه، بعدی: فراخوانی tac، بالا: خروجی کل فایل ها $

    مثال 7. ترکیب خروجی استاندارد و خروجی خطای استاندارد

    در این مثال، ترتیب تغییر مسیرها مهم است: در خط فرمان، Methodius ابتدا محل هدایت خروجی استاندارد را مشخص کرد ("> cat.info") و تنها پس از آن دستور داد که خطای استاندارد به آنجا نیز ارسال شود. این کار را برعکس انجام دهید (" 2>&1 > cat.info ")، نتیجه غیرمنتظره خواهد بود: فقط خروجی استاندارد وارد فایل می شود و پیام های تشخیصی در ترمینال ظاهر می شوند. با این حال، منطق در اینجا آهنی است: در زمان عملیات " 2>&1 "، خروجی استاندارد به ترمینال متصل بود، به این معنی که بعد ازبا اجرای آن، خروجی خطای استاندارد نیز با ترمینال مرتبط خواهد بود. و تغییر مسیر بعدی خروجی استاندارد به یک فایل، البته به هیچ وجه بر خطای استاندارد تأثیر نخواهد گذاشت. عدد در ساختار &number عدد است باز کنتوصیف کننده اگر ابزار ذکر شده در بالا، که در توصیفگر چهارم می نویسد، در پوسته نوشته می شد، از تغییر مسیرهای " >&4" استفاده می کرد. برای جلوگیری از تایپ ساختار دست و پا گیر "> file 2>&1", bash از اختصارات "&> file" یا به طور معادل ">& file" استفاده می کند.

    تغییر مسیر به هیچ جا

    گاهی اوقات مشخص است که برخی از داده های خروجی توسط برنامه مورد نیاز نخواهد بود. به عنوان مثال، هشدارهای خروجی خطای استاندارد. در این صورت می توانید خروجی خطای استاندارد را به آن تغییر مسیر دهید فایل سوراخ، به طور خاص برای تخریب داده ها طراحی شده است - /dev/null. هر چیزی که در این فایل نوشته شود به سادگی کنار گذاشته می شود و جایی ذخیره نمی شود.

    $ info cat > cat.info 2 > /dev/null $

    مثال 8. تغییر مسیر به /dev/null

    به همین ترتیب، می توانید با ارسال آن به /dev/null از شر خروجی استاندارد خلاص شوید.

    شما قبلاً با دو روش برای مقابله با خروجی اسکریپت های خط فرمان آشنا هستید:

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

    توصیفگرهای استاندارد فایل

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

    هر فرآیند تا 9 توصیف کننده فایل باز مجاز است. پوسته bash سه توصیفگر اول را با شناسه‌های 0، 1 و 2 ذخیره می‌کند. منظور آنها در اینجا آمده است.

    • 0 , STDIN - جریان ورودی استاندارد.
    • 1، STDOUT - جریان خروجی استاندارد.
    • 2، STDERR - جریان خطای استاندارد.
    این سه دسته ویژه ورودی و خروجی داده ها را در یک اسکریپت کنترل می کنند.
    شما باید جریان های استاندارد را به درستی درک کنید. آنها را می توان با بنیادی مقایسه کرد که فیلمنامه ها بر اساس آن با دنیای خارج تعامل دارند. بیایید به جزئیات در مورد آنها نگاه کنیم.

    STDIN

    STDIN جریان ورودی استاندارد پوسته است. برای ترمینال، ورودی استاندارد صفحه کلید است. وقتی اسکریپت ها از کاراکتر تغییر مسیر ورودی استفاده می کنند -< , Linux заменяет дескриптор файла стандартного ввода на тот, который указан в команде. Система читает файл и обрабатывает данные так, будто они введены с клавиатуры.

    بسیاری از دستورات bash ورودی STDIN را می پذیرند اگر هیچ فایلی در خط فرمان برای گرفتن ورودی مشخص نشده باشد. به عنوان مثال، این برای دستور cat صادق است.

    هنگامی که دستور cat را در خط فرمان بدون گزینه تایپ می کنید، از STDIN ورودی می گیرد. پس از ورود به خط بعدی، گربه به سادگی آن را روی صفحه چاپ می کند.

    STDOUT

    STDOUT جریان خروجی استاندارد پوسته است. به طور پیش فرض، این صفحه نمایش است. اکثر دستورات bash به STDOUT خروجی می دهند که باعث می شود در کنسول ظاهر شود. داده ها را می توان با پیوست کردن آن به محتوای آن با استفاده از دستور >> به یک فایل هدایت کرد.

    بنابراین، ما مقداری فایل داده داریم که می توانیم با استفاده از این دستور داده های دیگری را به آن اضافه کنیم:

    Pwd >> myfile
    چه خروجی های pwd به myfile اضافه می شود و داده های موجود در آن دست نخورده باقی می ماند.

    تغییر مسیر خروجی فرمان به یک فایل

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

    ls –l xfile > myfile
    پس از اجرای این دستور، پیغام های خطا را در صفحه مشاهده خواهیم کرد.


    تلاش برای دسترسی به فایلی که وجود ندارد

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

    STDERR

    STDERR جریان خطای استاندارد پوسته است. به طور پیش فرض، این دسته به همان چیزی اشاره می کند که STDOUT به آن اشاره می کند، به همین دلیل است که در صورت بروز خطا، پیامی را روی صفحه می بینیم.

    بنابراین فرض کنید می‌خواهیم پیام‌های خطا را به جای نمایش روی صفحه، مثلاً به یک فایل گزارش یا جای دیگری هدایت کنیم.

    ▍خطا در تغییر مسیر جریان

    همانطور که می دانید، توصیفگر فایل STDERR 2 است. ما می توانیم با قرار دادن این توصیفگر قبل از دستور redirect خطاها را تغییر مسیر دهیم:

    ls -l xfile 2>myfile cat ./myfile
    اکنون پیغام خطا به myfile می رود.


    تغییر مسیر یک پیام خطا به یک فایل

    ▍ تغییر مسیر خطا و جریان های خروجی

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

    ls -l myfile xfile Anotherfile 2> error Content 1> correct content

    تغییر مسیر خطاها و خروجی استاندارد

    پوسته آنچه را که دستور ls معمولاً به STDOUT ارسال می کند به فایل محتوای صحیح به لطف ساختار 1> هدایت می کند. پیام‌های خطایی که STDERR را می‌زدند به دلیل دستور تغییر مسیر 2> به فایل محتوای خطا ختم می‌شوند.

    در صورت نیاز، هر دو STDERR و STDOUT را می توان با استفاده از دستور &> به یک فایل هدایت کرد:


    تغییر مسیر STDERR و STDOUT به یک فایل

    پس از اجرای دستور، آنچه برای STDERR و STDOUT در نظر گرفته شده است به فایل محتوا ختم می شود.

    تغییر مسیر خروجی در اسکریپت ها

    دو روش برای تغییر مسیر خروجی در اسکریپت های خط فرمان وجود دارد:
    • تغییر مسیر موقت یا تغییر مسیر خروجی تک خطی.
    • تغییر مسیر دائمی یا تغییر مسیر همه خروجی ها در اسکریپت یا در بخشی از آن.

    ▍تغییر مسیر خروجی موقت

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

    #!/bin/bash echo "This is a error" >&2 echo "This is normal output"
    اگر اسکریپت را اجرا کنید، هر دو خط روی صفحه نمایش داده می شوند، زیرا همانطور که قبلا می دانید، خطاها به طور پیش فرض در همان مکان داده های معمولی نمایش داده می شوند.


    تغییر مسیر موقت

    اجازه دهید اسکریپت را طوری اجرا کنیم که خروجی STDERR در یک فایل ختم شود.

    ./myscript 2> myfile
    همانطور که می بینید، اکنون خروجی معمول به کنسول انجام می شود و پیام های خطا به فایل می رود.


    پیام های خطا در یک فایل نوشته می شوند

    ▍تغییر مسیر خروجی دائمی

    اگر یک اسکریپت نیاز به تغییر مسیر خروجی زیادی به صفحه داشته باشد، افزودن دستور مناسب به هر تماس اکو ناخوشایند است. درعوض، می‌توانید خروجی را تنظیم کنید تا با استفاده از دستور exec به یک توصیفگر خاص برای مدت زمان اسکریپت هدایت شود:

    #!/bin/bash exec 1> outfile echo "این آزمایشی برای هدایت مجدد همه خروجی ها است" echo "از یک پوسته اسکریپت به فایل دیگر." پژواک "بدون نیاز به تغییر مسیر هر خط"
    بیایید اسکریپت را اجرا کنیم.


    هدایت تمام خروجی ها به یک فایل

    اگر به فایل مشخص شده در دستور redirection خروجی نگاه کنید، معلوم می شود که هر چیزی که توسط دستورات echo خروجی گرفته شده است در این فایل ختم شده است.

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

    #!/bin/bash exec 2> myerror echo "این شروع اسکریپت است" echo "اکنون همه خروجی ها به مکان دیگری هدایت می شوند" exec 1> myfile echo "این باید به فایل myfile برود" echo "و این باید برود به فایل myerror" >&2
    پس از اجرای اسکریپت و مشاهده فایل هایی که خروجی را به آن ها هدایت کرده ایم، چه اتفاقی می افتد.


    تغییر مسیر خروجی به فایل های مختلف

    دستور exec ابتدا خروجی را از STDERR به فایل myerror هدایت می کند. سپس خروجی چندین دستور اکو به STDOUT ارسال می شود و روی صفحه چاپ می شود. پس از آن، دستور exec هر چیزی که STDOUT را وارد می کند به فایل myfile می فرستد و در نهایت از دستور تغییر مسیر به STDERR در دستور echo استفاده می کنیم که باعث می شود خط مربوط به فایل myerror نوشته شود.

    هنگامی که بر این امر مسلط شدید، می‌توانید خروجی را به جایی که می‌خواهید هدایت کنید. حالا بیایید در مورد تغییر مسیر ورودی صحبت کنیم.

    تغییر مسیر ورودی در اسکریپت ها

    برای تغییر مسیر ورودی، می توانید از همان تکنیکی که برای تغییر مسیر خروجی استفاده کردیم استفاده کنید. به عنوان مثال، دستور exec به شما امکان می دهد یک فایل را منبع داده برای STDIN قرار دهید:

    Exec 0< myfile
    این دستور به پوسته می گوید که ورودی باید فایل myfile باشد نه STDIN ساده. بیایید تغییر مسیر ورودی را در عمل ببینیم:

    #!/bin/bash exec 0< testfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done
    این همان چیزی است که پس از اجرای اسکریپت روی صفحه ظاهر می شود.


    تغییر مسیر ورودی

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

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

    ایجاد تغییر مسیر خروجی خود

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

    می توانید با استفاده از دستور exec یک دسته برای خروجی داده ها اختصاص دهید:

    #!/bin/bash exec 3>myfile echo "این باید روی صفحه نمایش داده شود" echo "و این باید در فایل ذخیره شود" >&3 echo "و این باید دوباره روی صفحه باشد"
    پس از اجرای اسکریپت، بخشی از خروجی به صفحه و بخشی به فایلی با توصیفگر 3 می رود.


    تغییر مسیر خروجی با استفاده از دسته خودتان

    ایجاد توصیف کننده فایل برای ورودی

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

    پس از اتمام خواندن فایل، می توانید STDIN را بازیابی کرده و طبق معمول از آن استفاده کنید:

    #!/bin/bash exec 6<&0 exec 0< myfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done exec 0<&6 read -p "Are you done now? " answer case $answer in y) echo "Goodbye";; n) echo "Sorry, this is the end.";; esac
    بیایید سناریو را آزمایش کنیم.


    تغییر مسیر ورودی

    در این مثال، توصیفگر فایل 6 برای ذخیره یک مرجع به STDIN استفاده شد. سپس تغییر مسیر ورودی انجام شد، فایل به منبع داده برای STDIN تبدیل شد. پس از آن، ورودی دستور خواندن از STDIN تغییر مسیر داده شده است، یعنی از فایل.

    پس از خواندن فایل، STDIN را با هدایت آن به توصیفگر 6 به حالت اولیه بازنشانی می کنیم. اکنون، برای بررسی اینکه همه چیز به درستی کار می کند، اسکریپت از کاربر سوال می پرسد، منتظر ورودی صفحه کلید می ماند و آنچه وارد شده را پردازش می کند.

    بستن توصیفگرهای فایل

    پس از پایان اسکریپت، پوسته به طور خودکار توصیفگرهای فایل را می بندد. با این حال، در برخی موارد لازم است قبل از اتمام اسکریپت، دستگیره ها را به صورت دستی ببندید. برای بستن یک دسته، باید به &- هدایت شود. به نظر می رسد این است:

    #!/bin/bash exec 3> myfile echo "این یک خط آزمایشی داده است" >&3 exec 3>&- echo "این کار نمی کند" >&3
    پس از اجرای اسکریپت، پیغام خطا دریافت می کنیم.


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

    موضوع این است که ما سعی کردیم به یک توصیفگر ناموجود اشاره کنیم.

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

    کسب اطلاعات در مورد دستگیره های باز

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

    این دستور کلیدهای زیادی دارد، بیایید به مهمترین آنها نگاه کنیم.

    • -p به شما امکان می دهد شناسه فرآیند را مشخص کنید.
    • -d به شما امکان می دهد تعداد توصیفگر را برای دریافت اطلاعات مشخص کنید.
    برای پیدا کردن PID فرآیند جاری، می‌توانید از متغیر محیطی ویژه $$ استفاده کنید که پوسته PID فعلی را در آن می‌نویسد.

    گزینه -a برای انجام یک عملیات AND منطقی بر روی نتایج بازگشتی با استفاده از دو گزینه دیگر استفاده می شود:

    lsof -a -p $$ -d 0,1,2

    نمایش اطلاعات مربوط به دستگیره های باز

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

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

    #!/bin/bash exec 3> myfile1 exec 6> myfile2 exec 7< myfile3 lsof -a -p $$ -d 0,1,2,3,6,7
    در اینجا چیزی است که هنگام اجرای این اسکریپت اتفاق می افتد.


    مشاهده توصیفگرهای فایل باز شده توسط یک اسکریپت

    اسکریپت دو دسته برای خروجی (3 و 6) و یکی برای ورودی (7) باز کرد. مسیرهای فایل های مورد استفاده برای پیکربندی توصیفگرها نیز در اینجا نشان داده شده است.

    سرکوب خروجی

    گاهی اوقات باید مطمئن شوید که دستورات موجود در اسکریپت، که مثلاً می‌توانند به عنوان یک فرآیند پس‌زمینه اجرا شوند، چیزی روی صفحه نمایش داده نمی‌شوند. برای انجام این کار، می توانید خروجی را به /dev/null هدایت کنید. چیزی شبیه "سیاه چاله" است.

    به عنوان مثال، در اینجا نحوه سرکوب پیام های خطا آورده شده است:

    ls -al badfile Anotherfile 2> /dev/null
    برای مثال اگر بخواهید فایلی را بدون حذف پاک کنید، از همین روش استفاده می شود:

    Cat /dev/null > myfile

    نتایج

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

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

    خوانندگان عزیز! در این مطلب، اصول کار با جریان های ورودی، خروجی و خطا آورده شده است. ما مطمئن هستیم که در میان شما متخصصانی وجود دارند که می توانند در مورد همه این موارد که فقط با تجربه به دست می آیند بگویند. اگر چنین است، ما به شما اجازه می دهیم.