معرفی ورودی و خروجی استاندارد (stdin و stdout) و خطاها (stderr)

خوب خدارو شکر می کنیم که همیشه در کنار ITPRO هستید و از ما حمایت می کنید ، امروز می خواهیم در خصوص مفاهیمی در سیستم عامل لینوکس صحبت کنیم که بیشتر در حوزه Shell Scripting استفاده می شود اما در آزمون بین المللی LPIC شما باید با این ساختارها آشنا باشید تا بتوانید از پس امتحان بر بیایید. همانطور که می دانید سیستم عامل لینوکس قابلیت اجرای دستورات از خط فرمان یا Command Line را دارد و اینکار توسط سویچ هایی که ما در دستورات استفاده می کنیم انجام می شود ، اما نکته اینجاست که ما چگونه می توانیم از این دستورات به درستی استفاده کنیم ؟ قالب استفاده از آنها چگونه است ؟

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

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

و در اینجاست که می توانید با استفاده از استانداردهای ورودی و خروجی دستورات در لینوکس اینکار را انجام بدهید ، بصورت خلاصه ورودی اطلاعات استاندارد در لینوکس به عنوان standard input یا stdin ، خروجی اطلاعات استاندارد بصورت standard output و خطاهای استاندارد به شکل standard error یا stderr نمایش داده می شوند. هر کدام از این دستورات به شکل یک سمبل یا symbol در سیستم عامل لینوکس شناخته می شوند که در زیر هر کدام به همراه سمبلهایشان نمایش داده شده اند :

Type	                   Symbol
standard input	       0<
standard output      1>
standard error	       2>

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

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

root@itpro-kali:~# cat < itprofile.txt

دستور بالا به cat می گوید که ورودی استاندارد خودش را به جای اینکه از کیبورد دریافت کند از فایلی به نام itprofile.txt دریافت کند و محتویات را نمایش بدهد ، البته خروجی دستور در نهایت فرفی با دستور cat itprofile.txt نخواهد داشت. در واقع هدف از این مثال این بود که متوجه شوید که می توانیم خروجی را از کیبورد هم دریافت نکنیم و تنها از طریق فایل هم ورودی های نرم افزار را داشته باشیم. لینوکس بصورت خودکار file descriptor یا توضیحات فایل را با کد 0 به عنوان standard input ارسال میک ند به مثال زیر توجه کنید :

root@itpro-kali:~# cat 0< itprofile.txt

دستور بالا همان خروجی را به شما می دهد که دستور قبلی داده است ، اما ممکن است این سئوال به وجود بیاید که چرا پس ما عدد صفر را قرار نمی دهیم ؟ به دلیل اینکه به محض اینکه شما در سیستم یک process ایجاد می کنید ، بصورت خودکار standard input در نظر گرفته می شود و معمولا نیازی به قرار دادن عدد صفر نخواهد داشت و البته فقط یک ورودی استاندارد برای نرم افزار در نظر گرفته می شود.

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

به محض اینکه شما stdin خودتان را وارد و اجرا کنید خروجی یا standard output ایجاد شده و به سمت کنسول نرم افزار هدایت می شود. در واقع نتیجه خروجی برنامه ما همان stdout است. اینکه output شما به کجا می رود دقیقا بستگی به محل ایجاد شدن process شما دارد ، بصورت معمولا output ترمینال یا کنسولی است که ما از آن دستور را اجرا کرده ایم ، به مثالهای زیر توجه کنید تا درک بهتری از این موضوع بدست بیاورید ، ابتدا دستور زیر را برای نمایش محتویات فایل itprofile.txt وارد کنید :

cat itprofile.txt

دستور بالا محتویات فایل itprofile.txt را بصورت پیشفرض بر روی استاندارد خروجی که صفحه ترمینال است نمایش می دهد . اگر بخواهیم خروجی استاندارد یا stdout ما درون یک فایل دیگر قرار بگیرد می توانیم به شکل زیر عمل کنیم و خروجی itprofile.txt را درون یک فایل دیگر بریزیم به مثال زیر دقت کنید :

ls -al itprofile.txt > unitypro.txt

در دستور بالا ما خروجی فایل itprofile.txt که قرار بود در استاندارد خروجی صفحه نمایش ، نمایش داده شود را وارد فایل جدیدی به نام unitypro.txt کردیم و در حال حاضر محتویات itprofile.txt و unitypro.txt یکسان است. اگر فایل unitypro.txt وجود داشته باشد محتویات جدید بر روی فایل موجود جایگزین یا Override خواهد شد ، اگر فایل مورد نظر وجود نداشته باشد علامت > ای که استفاده کردیم باعث می شود که فایل جدید ایجاد شود.خوب برای اینکه مطمئن شوید می توانید با استفاده از دستور زیر محتویات unitypro.txt را مشاهده کنید که عینا مشابه itprofile.txt است.

cat unitypro.txt

اگر بخواهیم خروجی استاندارد به فایلی که موجود است اضافه شود و فایل حذف نشود می توانیم از دو عدد علامت >> استفاده کنیم که به معنی Append کردن است. در صورتیکه بخواهیم خطاهایی که در صورت بروز مشکل در نتیجه دیده می شود را مشاهده کنیم و آن را درون یک فایل دیگر نگهدای کنیم به شکل زیر عمل می کنیم :

ls -al itprofile.txt 2> unitypro-error.txt

فرض کنید که دستور بالا را وارد کرده ایم ، دستور بالا به این معنا است که محتویات فایل itprofile.txt را خروجی بده و در صورت بروز مشکل یا خطای احتمای ، خطا را درون فایل جدیدی به نام unitypro-error.txt قرار بده ، این آموزش بصورت کلی برای آشنایی مقدماتی شما با مفاهیم stdin ، stdout و stderr است که امیدوارم حداقل مفاهیم آن را یاد گرفته باشید ، در حوزه shell scripting این موارد بسیار کاربرد دارد اما شما برای آزمون LPIC1-101 تنها تا همین حد که شکل خروجی ها به شکل > >> و کدها را بدانید کفایت می کند. امیدوارم مورد توجه شما قرار گرفته باشد. ITPRO باشید

نویسنده : محمد نصیری

منبع : جزیره لینوکس و متن باز وب سایت توسینسو

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد

#کاربرد_stdin_و_stdout_لینوکس #آموزش_گام_به_گام_لینوکس #standard_input_و_standard_output #مفاهیم_stdin_و_stdout_در_لینوکس #آموزش_لینوکس #ورودی_ها_و_خروجی_ها_در_لینوکس #stdin_و_stdout_و_stderr_در_لینوکس #مدیریت_خطاها_در_لینوکس
5 نظر
samurai

درود مهندس

بعضی پروگرمها مثل rm فقط argument قبول میکنند نه stdin ...بگذریم از اینکه میشه یه کمک xargs این کار رو انجام داد برای کامند rm

چه تفاوتی بین ورودی های استاندارد و ارگومنت وجود داره؟

محمد نصیری

بله شما می تونید در این حالت از xargs برای دستورات استفاده کنید البته بستگی به دستورش داره اما برای rm فکر نمی کنم مشکلی باشه ، در خصوص تفاوت بین ورودی استاندارد و آرگومان من حتما یه مطلب می نویسم که کاملا تشریح بشه اما فعلا فکر می کنم لینک زیر کامل توضیح داده باشه :

http://unix.stackexchange.com/questions/46372/whats-the-difference-between-stdin-and-arguments-passed-to-command
samurai

ممنونم منتظر مقالتون میمونم

rm ورودی استاندارد نمیگیره مثلا دستور زیر ارور میده

ls /home/samurai | rm -rf 
محمد نصیری

ظاهرا منظورم رو بد برداشت کردید منظورم این بود RM با xargs مشکلی نداره.. به امید خدا مطلبشو مینویسم

samurai

معذرت میخوام

اره با xargs اوکی هستش

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

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