دوستان و علاقمندان به مباحث آموزش یونیکس (UNIX) ، این آموزش را از سایت پی وی لرن دنبال خواهیم نمود. آشنایی با Redirection ورودی و خروجی در اسکرپیت نویسی Shell را در این بخش خواهیم داشت.
در این بخش، به طور مفصل در مورد Redirection ورودی / خروجی Shell بحث خواهیم کرد. بیش تر دستورات سیستم یونیکس، ورودی را از ترمینال تان می گیرند و خروجی حاصل را به ترمینال شما می فرستند. یک دستور به طور معمول ورودی خود را از ورودی استاندارد می خواند ، که به طور پیش فرض پایانه شماست. به طور مشابه ، یک فرمان به طور معمول خروجی خود را به خروجی استاندارد می نویسد ، که دوباره به طور پیش فرض پایانه شماست.
خروجی یک دستوری که معمولاً برای خروجی استاندارد در نظر گرفته شده است ، به راحتی می تواند به جای آن به یک فایل دیلیور شود. این قابلیت به عنوان output redirection شناخته می شود.
اگر نماد < فایل به هر دستوری که به طور معمول خروجی آن را به خروجی استاندارد می نویسد ، اضافه شود ، خروجی آن دستور به جای ترمینال شما برای فایل ارسال می شود.
دستور who بررسی می کند که خروجی دستور در فایل یوزر redirect می شود.
1 | $ who > users |
توجه کنید که هیچ خروجی در ترمینال ظاهر نمی شود. دلیل آن، این است که خروجی، از دستگاه خروجی استاندارد پیش فرض (ترمینال) به فایل مشخص شده هدایت می شود. می توانید users file را برای محتوای کامل بررسی کنید.
1 2 3 4 5 6 7 | $ cat users oko tty01 Sep 12 07:30 ai tty15 Sep 12 13:32 ruth tty21 Sep 12 10:10 pat tty24 Sep 12 13:07 steve tty25 Sep 12 13:03 $ |
اگر یک فرمان، خروجی خود را به یک فایل redirecte کند و فایل از قبل حاوی برخی داده ها باشد ، آن داده ها از بین می روند. مثال زیر را در نظر بگیرید.
1 2 3 4 | $ echo line 1 > users $ cat users line 1 $ |
می توانید از عملگر << برای افزودن خروجی در فایل موجود به شرح زیر استفاده کنید.
1 2 3 4 5 | $ echo line 2 >> users $ cat users line 1 line 2 $ |
مبحث Redirection ورودی و خروجی در اسکرپیت نویسی Shell را ادامه می دهیم.
دقیقاً همان طور که می توان خروجی یک دستور را به یک فایل redirecte کرد ، همچنین می توان ورودی یک دستور را از یک فایل redirecte کرد. از آن جا که از کاراکتر بزرگ تر از < برای تغییر مسیر خروجی استفاده می شود ، از کاراکتر کم تر از > برای تغییر مسیر ورودی یک دستور استفاده می شود.
دستوراتی که به طور معمول ورودی خود را از ورودی استاندارد می گیرند می توانند ورودی خود را از یک فایل با این روش هدایت کنند. به عنوان مثال ، برای شمارش تعداد خطوط file users تولید شده در بالا ، می توانید این دستور را به شرح زیر اجرا کنید.
1 2 3 | $ wc -l users 2 users $ |
پس از اجرا ، خروجی زیر را دریافت خواهید کرد. می توانید با ورودی استاندارد دستور wc از file users ، تعداد خطوط موجود در فایل را شمارش کنید.
1 2 3 | $ wc -l < users 2 $ |
توجه داشته باشید که در خروجی تولید شده توسط دو فرم دستور wc تفاوت وجود دارد. در حالت اول ، نام file users با تعداد خط ذکر شده است. اما در مورد دوم ، این طور نیست.
در حالت اول ، wc می داند که ورودی اش را از file users می خواند. در حالت دوم ، فقط می داند که ورودی اش را از ورودی استاندارد می خواند بنابراین نام فایل را نشان نمی دهد.
یک Here Document برای تغییر مسیر ورودی به یک برنامه یا یک اسکریپت شل تعاملی استفاده می شود.
ما می توانیم با تهیه ورودی مورد نیاز برای برنامه یا اسکریپت شل تعاملی ، یک برنامه اسکریپت تعاملی را در یک اسکریپت شل بدون user action اجرا کنیم.
فرم کلی برای یک here document به شکل زیر است.
1 2 3 | command << delimiter document delimiter |
در این جا شل از عملگر >> به عنوان یک دستورالعمل برای خواندن ورودی تعبیر می کند تا زمانی که یک خط حاوی جدا کننده ی (delimiter) مشخص شده را پیدا کند. تمام خطوط ورودی به خط حاوی جداکننده می روند، سپس در ورودی استاندارد فرمان تغذیه می شوند.
delimiter به پوسته می گوید که here document تکمیل شده است. بدون آن ، شل به خواندن ورودی برای همیشه ادامه می دهد. delimiter باید یک کلمه واحد باشد که فاقد فاصله یا تب باشد.
در زیر ورودی فرمان wc -l برای شمارش تعداد کل خطوط آورده شده است.
1 2 3 4 5 6 7 | $wc -l << EOF This is a simple lookup program for good (and bad) restaurants in Cape Town. EOF 3 $ |
می توانید برای چاپ چندین خط با استفاده از اسکریپت خود از این سند استفاده کنید.
1 2 3 4 5 6 7 | #!/bin/sh cat << EOF This is a simple lookup program for good (and bad) restaurants in Cape Town. EOF |
پس از اجرا، نتیجه زیر را دریافت خواهید کرد.
1 2 3 | This is a simple lookup program for good (and bad) restaurants in Cape Town. |
اسکریپت زیر با ویرایشگر متن vi جلسه ای را اجرا می کند و ورودی را در فایل test.txt ذخیره می کند.
1 2 3 4 5 6 7 8 9 10 | #!/bin/sh filename=test.txt vi $filename <<EndOfCommands i This file was created automatically from a shell script ^[ ZZ EndOfCommands |
اگر این اسکریپت را با عملکرد vim به عنوان vi اجرا کنید ، احتمالاً خروجی را مانند زیر مشاهده خواهید کرد.
1 2 3 | $ sh test.sh Vim: Warning: Input is not from a terminal $ |
بعد از اجرای اسکریپت ، باید موارد اضافه شده به فایل test.txt را ببینید.
1 2 3 4 | $ cat test.txt This file was created automatically from a shell script $ |
بعضی اوقات شما نیاز به اجرای یک دستور دارید ، اما نمی خواهید که خروجی روی صفحه نمایش داده شود. در چنین مواردی ، می توانید با هدایت مجدد آن به فایل dev / null/، خروجی را discard کنید.
1 | $ command > /dev/null |
در این جا دستور نام فرمانی است که می خواهید آن را اجرا کنید. فایل dev / null / یک فایل ویژه است که به طور خودکار تمام ورودی هایش را discard می کند.
برای discard خروجی یک فرمان و همچنین خطای خروجی آن ، از redirection استاندارد برای هدایت STDERR به STDOUT استفاده کنید.
1 | $ command > /dev/null 2>&1 |
در این جا ۲ نشان دهنده ی STDERR و ۱ نشان دهنده STDOUT است. با هدایت دوباره ی STDOUT به STDERR می توانید پیامی را به شرح زیر به STDERR نمایش دهید.
1 | $ echo message 1>&2 |
در زیر لیست کاملی از دستوراتی که می توانید برای Redirection استفاده کنید، آمده است.
ردیف | دستور و شرح |
---|---|
۱ | pgm > file خروجی pgm به file هدایت می شود.
|
۲ | pgm < file برنامه pgm ورودی را از file می خواند.
|
۳ | pgm >> file خروجی pgm به file پیوست می شود.
|
۴ | n > file خروجی از جریان با توصیف گر n به file هدایت می شود.
|
۵ | n >> file خروجی از جریان با توصیف گر n به file الحاق می شود.
|
۶ | n >& m ادغام خروجی از جریان n با جریان m
|
۷ | n <& m ادغام ورودی از جریان n با جریان m
|
۸ | tag>> ورودی استاندارد از ابتدا از طریق تگ بعدی در شروع خط از این جا وارد می شود.
|
۹ | | از یک برنامه یا پردازش خروجی را گرفته و آن را به برنامه ی دیگر ارسال می کند. |
توجه داشته باشید که توصیف کننده فایل ۰ به طور معمول (standard input (STDIN است و ۱، (standard output (STDOUT و ۲، (standard error output (STDERR می باشد.
مبحث Redirection ورودی و خروجی در اسکرپیت نویسی Shell را در این جا به پایان می رسانیم.
با مبحث Redirection ورودی و خروجی در اسکرپیت نویسی Shell در این بخش از آموزش یونیکس آشنا شدیم. در بخش بعدی وارد مبحث توابع Shell خواهیم شد. با وب سایت پی وی لرن همراه باشید.