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

پارامترهای Some_command > logfile.txt

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

پارامترهای Some_command | tee -a logfile.txt

دستور setterm -dump یک عکس فوری از بافر کنسول مجازی فعلی به عنوان یک فایل متنی ساده با نام پیش فرض screen.dump ایجاد می کند. می‌توانید از شماره کنسولی که می‌خواهید برای آن استفاده کنید به عنوان آرگومان آن استفاده کنید. و افزودن گزینه -file filename این dump را به فایلی با نام مشخص شده هدایت می کند. گزینه -append دامپ جدید را به یک فایل موجود - "default" screen.dump یا یکی با نام گزینه -file اضافه می کند.

آن ها پس از استفاده از دستور like

Setterm -dump -file /root/screenlog

به ترتیب در فایل /root/screenlogمحتوای یک صفحه کنسول خواهد بود.

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

1) صفحه نمایش را اجرا کنید

2) Enter را فشار دهید. همه چيز. ما در پنجره صفر کنسول هستیم.

3) دستورات لازم را اجرا می کنیم که خروجی آن باید کپی شود.

4) Ctrl+A، Ctrl+[ - ما در حالت کپی هستیم. مکان نما را در ابتدای انتخاب قرار می دهیم، کلید فاصله را فشار می دهیم، سپس مکان نما را در انتهای انتخاب قرار می دهیم، فاصله را فشار می دهیم. متن در کلیپ بورد کپی شد.

5) Ctrl+A, c - ما یک پنجره 1 جدید ایجاد کرده ایم.

6) Ctrl+A، 1 - ما به پنجره اول تغییر مکان دادیم.

7) هر ویرایشگر متن (؟) را باز کنید (من در mc امتحان کردم)، و Ctrl + A، Ctrl +] را فشار دهید - متن درج می شود. پس انداز می کنیم.

8) Ctrl+A، Ctrl+0 - به پنجره صفر برگردید.

چگونه بافر اسکرول بک را افزایش دهیم؟

راه حل اول افزایش اندازه پیش فرض (پیش فرض) بافر در منابع هسته و کامپایل مجدد آن است. اجازه دهید فرض کنم که شما نیز مانند من تمایلی به انجام این کار ندارید و به دنبال یک رسانه انعطاف پذیرتر باشید.

و چنین ابزاری وجود دارد، اما به آن کنسول فریم بافر، به اختصار fbcon می گویند. این دستگاه دارای یک فایل مستندات می باشد fbcon.txt; اگر مستندات هسته را نصب کرده باشید، آن را دارید. دنبالش یه جایی اطراف بگرد /usr/shareشاخه ها (به دلیل تفاوت در توزیع نمی توانم مسیر دقیق را ارائه دهم).

در این مرحله، من عذرخواهی می کنم: باید کمی منحرف شویم و کمی در مورد بافر ویدیو صحبت کنیم ( فریم بافر ).

بافر ویدئو یک بافر بین نمایشگر و آداپتور ویدئو است. زیبایی آن این است که می توان آن را دستکاری کرد: ترفندهایی را امکان پذیر می کند که اگر آداپتور مستقیماً به نمایشگر متصل شود کار نمی کند.

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

مثال زیر برای GRUB است اما می تواند به راحتی با LILO سازگار شود. در فایل پیکربندی GRUB - menu.lst- خط مربوط به هسته را پیدا کنید و سپس: در صورت وجود گزینه vga=xxx را حذف کنید. گزینه video=vesabf یا هر چیزی که با سخت افزار شما مطابقت دارد را اضافه کنید. گزینه fbcon=scrollback:128 را اضافه کنید. پس از این روش، خط پارامتر هسته باید چیزی شبیه به این باشد:

هسته /vmlinuz root=/dev/sdb5 video=radeonfb fbcon=scrollback:128

سوال اینجاست که چرا گزینه vga=xxx را حذف کنیم؟ به دلیل تداخل احتمالی با گزینه ویدیو. در آداپتور ATI من نمی توانم بافر اسکرول را تغییر دهم اگر vga=xxx لیست شده باشد. شاید در مورد شما اینطور نباشد. اگر گزینه های بالا کار می کنند - خوب است. اما اگر بخواهید تعداد خطوط را افزایش دهید یا فونت کوچکتری روی صفحه تنظیم کنید، چه؟ شما همیشه این کار را با گزینه vga=xxx انجام داده اید و این همان چیزی است که ناپدید شد. نگران نباشید - همین کار را می توان با تغییر پارامترهای fbcon همانطور که در فایل توضیح داده شده بود به دست آورد fbcon.txt(اما در این مقاله توضیح داده نشده است).

با گزینه fbcon=scrollback:128، بافر اسکرول من به 17 صفحه افزایش یافت (35 برابر Shift+PgUp نصف صفحه). در ضمن، 128 یک کیلوبایت است. نویسنده مقاله ادعا می کند که بیشتر نمی توان ایجاد کرد. من تلاش نکردم

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

اسکریپت filename.log

هنگامی که تمام دستورات مورد نیاز اجرا می شوند -

همه چیز در filename.log نوشته شده است

FreeBSD یک ابزار تماشای فوق العاده دارد که به شما امکان نظارت بر پایانه ها را می دهد ، اما همانطور که مشخص شد ، در لینوکس عملکردهای کاملاً متفاوتی را انجام می دهد =\ ارزش جستجو در این موضوع را دارد ، چیزی وجود دارد ...

یکی از جالب ترین و مفیدترین موضوعات برای مدیران سیستم و کاربران جدیدی که تازه کار با ترمینال را درک می کنند، تغییر مسیر I/O لینوکس است. این ویژگی ترمینال به شما امکان می دهد خروجی دستور را به یک فایل یا محتویات یک فایل را به دستور ورودی هدایت کنید، دستورات را به یکدیگر متصل کنید و خطوط لوله فرمان را تشکیل دهید.

در این مقاله به نحوه عملکرد تغییر مسیر ورودی/خروجی لینوکس، چه اپراتورهایی برای این کار و در کجا می توان همه اینها را اعمال کرد، خواهیم دید.

تمام دستوراتی که اجرا می کنیم سه نوع داده را به ما برمی گرداند:

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

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

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

تغییر مسیر I/O به شما امکان می دهد یکی از این فایل ها را با فایل های خود جایگزین کنید. به عنوان مثال، می توانید به جای صفحه کلید، برنامه را کاری کنید که داده ها را از یک فایل در سیستم فایل بخواند، همچنین می توانید به جای صفحه نمایش، خطاها را روی یک فایل بنویسید و غیره. همه اینها با استفاده از نمادها انجام می شود. "<" و ">" .

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

همه چیز بسیار ساده است. می توانید خروجی را با استفاده از نماد > به یک فایل هدایت کنید. به عنوان مثال، اجازه دهید خروجی دستور top را ذخیره کنیم:

top -bn 5 > top.log

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

نماد ">" اگر قبلاً چیزی وجود داشته باشد، اطلاعات را از فایل بازنویسی می کند. برای افزودن داده به انتها، استفاده کنید ">>" . به عنوان مثال، خروجی را به یک فایل لینوکس برای بالا هدایت کنید:

top -bn 5 >> top.log

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

top -bn 5 1>top.log

خطاها را به یک فایل هدایت کنید

برای تغییر مسیر خروجی خطا به یک فایل، باید به صراحت توصیفگر فایلی را که می خواهید تغییر مسیر دهید مشخص کنید. برای خطاها، این شماره 2 است. به عنوان مثال، هنگام تلاش برای دسترسی به دایرکتوری ریشه، ls یک خطا ایجاد می کند:

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

ls -l /root/ 2> ls-error.log
$ cat ls-error.log

برای اضافه کردن داده ها به انتهای یک فایل، از نماد مشابه استفاده کنید:

ls -l /root/ 2>>ls-error.log

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

همچنین می‌توانید تمام خروجی‌ها، خطاها و خروجی‌های استاندارد را به یک فایل هدایت کنید. دو راه برای انجام این کار وجود دارد. اولین مورد، قدیمی تر، این است که هر دو توصیفگر را بگذرانید:

ls -l /root/ >ls-error.log 2>&1

ابتدا خروجی دستور ls با استفاده از اولین کاراکتر تغییر مسیر به فایل ls-error.log ارسال می شود. در ادامه تمام خطاها به همان فایل ارسال می شود. روش دوم ساده تر است:

ls -l /root/ &> ls-error.log

همچنین می توانید به جای رونویسی از append استفاده کنید:

ls -l /root/ &>> ls-error.log

ورودی استاندارد از فایل

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

گربه

همچنین می توانید فوراً خروجی را به یک فایل نیز هدایت کنید. برای مثال، بیایید فهرست را دوباره ترتیب دهیم:

مرتب سازی مرتب سازی خروجی

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

استفاده از تونل ها

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

ls -lt | head -n 5

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

echo test/tmp/ | xargs -n 1 cp -v testfile.sh

در اینجا، گزینه -n 1 مشخص می کند که تنها یک پارامتر باید جایگزین یک فرمان شود و گزینه -v در cp به شما اجازه می دهد اطلاعات دقیق در مورد حرکات را چاپ کنید. دستور دیگری که در چنین مواردی مفید است، tee است. داده ها را از ورودی استاندارد می خواند و در خروجی یا فایل های استاندارد می نویسد. مثلا:

echo "Tee test" | فایل تی 1

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

نتیجه گیری

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

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

هر فایل باز دارای یک توصیفگر فایل مرتبط با آن است. توصیفگرهای فایل و به ترتیب 0، 1 و 2 هستند. هنگامی که فایل های اضافی باز می شوند، توصیفگرهای 3 تا 9 خالی می مانند. گاهی اوقات توصیفگرهای اضافی می توانند کار خوبی برای حفظ موقت ارجاع به یا انجام دهند. این امر باعث می شود که پس از تغییر مسیر پیچیده و دستکاری های جایگشت، بازگرداندن توصیفگرها به حالت عادی خود آسان شود (به مثال 1-16 مراجعه کنید).

COMMAND_OUTPUT > # تغییر مسیر stdout (خروجی) به یک فایل. # اگر فایل موجود نبود، ایجاد می شود، در غیر این صورت رونویسی می شود. ls -lR > dir-tree.list # یک فایل حاوی فهرست درخت دایرکتوری ایجاد می کند. : > filename # عملیات > فایل "filename" را به طول صفر کوتاه می کند. # اگر فایل قبل از عملیات وجود نداشت، # یک فایل با طول صفر جدید ایجاد می شود (همان اثر فرمان "لمس"). # نماد: در اینجا به عنوان یک مکان نگهدار عمل می کند و چیزی را خروجی نمی کند. > filename # عملیات > فایل "filename" را به طول صفر کوتاه می کند. # اگر فایل قبل از عملیات وجود نداشت، # یک فایل با طول صفر جدید ایجاد می شود (همان اثر فرمان "لمس"). # (همان نتیجه بالا - ": >"، اما این گزینه # در برخی از پوسته ها کار نمی کند.) COMMAND_OUTPUT >> # تغییر مسیر stdout (خروجی) به یک فایل. # در صورت وجود نداشتن یک فایل جدید ایجاد می کند، در غیر این صورت به انتهای فایل اضافه می شود. # دستورات تغییر مسیر تک خطی # (فقط روی خطی که در آن رخ می‌دهد تأثیر می‌گذارد): # ——————————————————————— 1>نام فایل # تغییر مسیر خروجی (stdout) برای فایل "نام فایل". 1>>نام فایل # تغییر مسیر خروجی (stdout) به فایل "نام فایل"، فایل در حالت الحاق باز می شود. 2>نام فایل # تغییر مسیر stderr به فایل "filename". 2>>نام فایل # تغییر مسیر stderr به "نام فایل"، فایل در حالت الحاق باز می شود. &>filename # stdout و stderr را به فایل "filename" هدایت کنید. #================================================= ============================ # تغییر مسیر stdout، فقط برای یک خط. LOGFILE=script.log echo "این خط در فایل \"$LOGFILE\" نوشته خواهد شد." 1>$LOGFILE echo "این خط به انتهای \"$LOGFILE\" اضافه خواهد شد." 1>>$LOGFILE echo "این خط نیز به انتهای \"$LOGFILE\" اضافه خواهد شد." 1>>$LOGFILE echo "این خط روی صفحه چاپ می شود و در \"$LOGFILE\" قرار نمی گیرد." # پس از هر خط، تغییر مسیر ساخته شده به طور خودکار "بازنشانی" می شود. # تغییر مسیر stderr، فقط برای یک خط. ERRORFILE=script.errors bad_command1 2>$ERRORFILE # پیام خطا در $ERRORFILE نوشته می شود. bad_command2 2>>$ERRORFILE # پیام خطا به انتهای $ERRORFILE اضافه خواهد شد. bad_command3 # پیام خطا در stderr، #+ چاپ می شود و به $ERRORFILE نمی رود. # پس از هر خط، تغییر مسیر ساخته شده نیز به طور خودکار "فلاش" می شود. #================================================= =========================== 2>&1 # تغییر مسیر stderr به stdout. # پیام های خطا به همان مکان stdout ارسال می شوند. من> منکه در j. # خروجی به فایل با توصیفگر منبا توصیفگر به پرونده منتقل شد j. >&j # تغییر مسیر فایل با توصیفگر 1 (stdout) برای فایل با توصیفگر j. # خروجی به stdout به یک فایل با یک توصیفگر منتقل می شود j. 0< FILENAME < FILENAME # Ввод из файла. # Парная команде ">"، اغلب در ترکیب با آن یافت می شود. # # grep search-word filename # فایل "filename" برای خواندن و نوشتن باز می شود و با توصیف کننده فایل "j" همراه است. # اگر "نام فایل" وجود نداشته باشد، ایجاد می شود. # اگر توصیفگر "j" مشخص نشده باشد، توصیفگر 0، stdin، به طور پیش فرض گرفته می شود. # # یکی از کاربردهای آن نوشتن در یک موقعیت خاص در یک فایل است. echo 1234567890 > File # رشته را در فایل "File" بنویسید. اجرایی 3<>File # "File" را باز کرده و به handle 3. read -n 4 متصل کنید<&3 # Прочитать 4 символа. echo -n . >&3 # یک کاراکتر نقطه بنویسید. exec 3>&- # Close handle 3. cat File # ==> 1234.67890 # دسترسی تصادفی و موارد دیگر! | # خط لوله (کانال). # یک ابزار جهانی برای ترکیب دستورات در یک زنجیره. # مشابه ">"، اما در واقع گسترده تر است. # برای ترکیب دستورات، اسکریپت ها، فایل ها و برنامه ها در یک زنجیره (خط لوله) استفاده می شود. cat *.txt | مرتب کردن | uniq > result-file # محتویات همه فایل‌های txt مرتب می‌شوند، خطوط تکراری حذف می‌شوند، # نتیجه در فایل "result-file" ذخیره می‌شود.

عملیات تغییر مسیر و/یا خطوط لوله را می توان در همان خط فرمان ترکیب کرد.

فرمان< input-file >خروجی-فایل فرمان1 | فرمان2 | command3 > output-file به مثال 12-23 و مثال A-17 مراجعه کنید.

چندین جریان را می توان به یک فایل منفرد هدایت کرد.

ls -yz >> command.log 2>&1 # یک گزینه "yz" نامعتبر در دستور "ls" در فایل "command.log" نوشته می شود. # زیرا stderr به یک فایل هدایت می شود.

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

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

0<&-, <&-

توصیفگر فایل خروجی را ببندید.

1>&-, >&-

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

# فقط stderr به خط لوله منتقل می شود. exec 3>&1 # "وضعیت" فعلی stdout را ذخیره کنید. ls -l 2>&1 >&3 3>&- | grep bad 3>&- # Close descr. 3 برای "grep" (اما نه برای "ls"). # ^^^^ ^^^^ exec 3>&- # حالا آن را برای بقیه اسکریپت ببندید. # با تشکر S.C.

برای اطلاعات بیشتر در مورد تغییر مسیر I/O، به پیوست D مراجعه کنید.

16.1. با دستور اجرایی

تیم اجرایی ورودی را از یک فایل هدایت می کند. از این پس، تمام ورودی ها، به جای (معمولاً صفحه کلید)، از این فایل ساخته می شوند. این امکان خواندن محتویات یک فایل، خط به خط و تجزیه هر خط وارد شده با sed و/یا awk را فراهم می کند.

مثال 16-1. تغییر مسیر با exec

#!/bin/bash # تغییر مسیر stdin با "exec". اجرایی 6<&0 # Связать дескр. #6 со стандартным вводом (stdin). # Сохраняя stdin. exec < data-file # stdin заменяется файлом "data-file" read a1 # Читается первая строка из "data-file". read a2 # Читается вторая строка из "data-file." echo echo "Следующие строки были прочитаны из файла." echo "——————————————" echo $a1 echo $a2 echo; echo; echo exec 0<&6 6<&- # Восстанавливается stdin из дескр. #6, где он был предварительно сохранен, #+ и дескр. #6 закрывается (6<&-) освобождая его для других процессов. # # <&6 6<&- дает тот же результат. echo -n "Введите строку " read b1 # Теперь функция "read", как и следовало ожидать, принимает данные с обычного stdin. echo "Строка, принятая со stdin." echo "—————————" echo "b1 = $b1" echo exit 0

به همین ترتیب، طراحی exec>نام فایلخروجی را به فایل داده شده هدایت می کند. پس از آن، تمام خروجی‌های دستوراتی که معمولاً به آنها هدایت می‌شوند، اکنون به این فایل خروجی می‌شوند.

مثال 16-2. تغییر مسیر با exec

#!/bin/bash # reassign-stdout.sh LOGFILE=logfile.txt exec 6>&1 # اختصاص دادن توصیف. شماره 6 با stdout. # ذخیره stdout. exec > $LOGFILE # stdout با "logfile.txt" جایگزین می شود. # ———————————————————— # # تمام خروجی‌های دستورات این بلوک در $LOGFILE نوشته می‌شود. echo -n "Logfile: " date echo "—————————————-" echo echo "خروجی فرمان \"ls -al\"" echo ls -al echo; echo echo "خروجی فرمان \"df\"" echo df # ————————————————————# exec 1>&6 6>&- # بازیابی stdout و بستن desc . #6. echo echo "== stdout به حالت پیش فرض بازیابی شد == " echo ls -al echo exit 0

مثال 16-3. تغییر مسیر همزمان دستگاه ها و با استفاده از دستور exec

#!/bin/bash # upperconv.sh # کاراکترهای فایل ورودی را به حروف بزرگ تبدیل کنید. E_FILE_ACCESS=70 E_WRONG_ARGS=71 اگر [ ! -r "$1" ] # آیا فایل قابل خواندن است؟ سپس بازتاب "Unable to read from the specified file!" echo "Usage: $0 input-file output-file" خروج $E_FILE_ACCESS fi # اگر فایل ورودی ($1) داده نشود #+ کد خروج یکسان خواهد بود. اگر [ -z "$2" ] سپس "شما باید یک فایل خروجی را مشخص کنید." echo "استفاده: $0 input-file output-file" خروج $E_WRONG_ARGS fi exec 4<&0 exec < $1 # Назначить ввод из входного файла. exec 7>&1 exec > $2 # خروجی را به فایل خروجی اختصاص دهید. # فرض می کنیم که فایل خروجی قابل نوشتن است # (چک اضافه شود؟). # ———————————————— گربه — | tr a-z A-Z # تبدیل به حروف بزرگ # ^^^^^ # از stdin بخوانید. # ^^^^^^^^^^ # نوشتن در stdout. # با این حال، هر دو stdin و stdout هدایت شده اند. # ———————————————— exec 1>&7 7>&- # stdout را بازیابی کنید. exec 0<&4 4<&- # Восстановить stdin. # После восстановления, следующая строка выводится на stdout, чего и следовало ожидать. echo "Символы из \"$1\" преобразованы в верхний регистр, результат записан в \"$2\"." exit 0

بعد:تغییر مسیر خطاها به یک فایل بالا:تغییر مسیر I/O قبلی:تغییر مسیر ورودی از یک فایل محتوا فهرست مطالب

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

برای تغییر مسیر خروجی استاندارد به یک فایل، از عملگر «>» استفاده کنید.

تغییر مسیر I/O در لینوکس

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

اگر خروجی استاندارد را به یک فایل موجود هدایت کنید، از ابتدا بازنویسی می شود. برای الحاق خروجی استاندارد به محتویات یک فایل موجود، باید از عملگر «» استفاده کنید. به عنوان مثال، برای اضافه کردن نتایج کار هنگام اجرای مجدد برنامه به یک فایل، وارد کنید:

Alex Otwagin 2002-12-16

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

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

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

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

/home/larry/papers# تاریخچه گربه-پایان نامه پایانی کارشناسی ارشد

ابتدا محتویات فایل و سپس فایل نمایش داده می شود.

با این حال، اگر نام فایل مشخص نشده باشد، برنامه گربهورودی stdin را می خواند و فوراً آن را به stdout برمی گرداند (بدون هیچ تغییری در آن). داده ها عبور می کنند گربهمانند از طریق لوله بیایید مثالی بزنیم:

/home/larry/papers# cat سلام. سلام. خدا حافظ. خدا حافظ. ctrlD/home/larry/papers#

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

بیایید مثال دیگری بزنیم. تیم مرتب سازیخطوط متن ورودی را می خواند (همچنین از stdin اگر نام فایلی داده نشده باشد) و مجموعه ای از این خطوط را به شکل مرتب شده به stdout خروجی می دهد. بیایید عملکرد آن را بررسی کنیم.

/home/larry/papers# مرتب سازی موز هویج سیب Ctrl+D سیب موز هویج /home/larry/papers#

همانطور که می بینید، پس از فشار دادن ctrlD, مرتب سازیخطوط را به ترتیب حروف الفبا چاپ کرد.

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

فرض کنید می‌خواهید خروجی دستور sort را به فایلی انتقال دهید تا فهرستی به ترتیب حروف الفبا روی دیسک ذخیره شود. پوسته به شما اجازه می دهد تا خروجی استاندارد یک دستور را با استفاده از یک کاراکتر به یک فایل هدایت کنید. بیایید مثالی بزنیم:

/home/larry/papers# sort > لیست خرید موز هویج سیب ctrlD/home/larry/papers#

می بینید که خروجی دستور sort نمایش داده نمی شود، اما در فایلی به نام ذخیره می شود. بیایید محتویات این فایل را نمایش دهیم:

/home/larry/papers# لیست خرید گربه سیب موز هویج /home/larry/papers#

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

/home/larry/papers# مرتب سازی اقلام لیست خرید /home/larry/papers# لیست خرید گربه سیب موز هویج /home/larry/papers#

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

/home/larry/papers# مرتب سازی< items apples bananas carrots /home/larry/papers#

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

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

ما قبلا نحوه استفاده از برنامه مرتب سازی به عنوان فیلتر را در بالا نشان داده ایم. این مثال‌ها فرض می‌کنند که داده‌های منبع در یک فایل هستند، یا داده‌های منبع از صفحه کلید (ورودی استاندارد) وارد می‌شوند. با این حال، اگر می‌خواهید داده‌هایی را که نتیجه فرمان دیگری است، مرتب کنید، مثلاً ls?

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

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

بیایید ابتدا دستور را اجرا کنیم ls:

/home/larry/papers# ls English-list history-نهایی پایان نامه کارشناسی ارشد /home/larry/papers#

حال خروجی دستور را تغییر مسیر می دهیم lsبه فایلی با نام file-list

/home/larry/papers# ls > file-list /home/larry/papers# مرتب سازی -r فهرست فایل یادداشت های کارشناسی ارشد-پایان نامه-نهایی-لیست انگلیسی /home/larry/papers#

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

راه حل در این شرایط ایجاد است تیم های پهلو گرفته(لوله های). اتصال توسط پوسته انجام می شود که stdout دستور اول را به stdin دستور دوم هدایت می کند. در این حالت می خواهیم دستور stdout را ارسال کنیم lsدر دستورات stdin مرتب سازی. همانطور که در مثال زیر نشان داده شده است از یک نماد برای اتصال استفاده می شود:

/home/larry/papers# ls | مرتب سازی -r یادداشت های کارشناسی ارشد-تاریخ پایان نامه-نهایی-لیست انگلیسی /home/larry/papers#

این دستور کوتاه تر از مجموعه دستورات است و تایپ آن راحت تر است.

بیایید یک مثال مفید دیگر را بررسی کنیم. تیم

/home/larry/papers# ls /usr/bin

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

/home/larry/papers# ls /usr/bin | بیشتر

اکنون می توانید در این لیست پیمایش کنید.

می توانید جلوتر بروید و بیش از دو دستور را داک کنید. دستور را در نظر بگیرید سر، که فیلتری از ویژگی زیر است: اولین خطوط را از جریان ورودی خروجی می دهد (در مورد ما، ورودی خروجی چندین دستور dock شده خواهد بود). اگر بخواهیم آخرین نام فایل بر اساس حروف الفبا در فهرست فعلی نمایش داده شود، می توانیم از دستور طولانی زیر استفاده کنیم:

/home/larry/papers# ls | sort-r | head -1 notes /home/larry/papers\#

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

استفاده از دستورات docked (pipeline)

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

/home/larry/papers# ls > file-list

اگر فایل قبلاً وجود داشته باشد، محتویات فایل را از بین می برد و به جای آن یک فایل جدید ایجاد می کند.

اگر تغییر مسیر با نمادها انجام شود، خروجی بدون از بین بردن محتوای اصلی فایل به انتهای فایل مشخص شده اضافه می شود. مثلا دستور

/home/larry/papers# ls >> file-list

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

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

تغییر مسیر خروجی غیر مخرب

چیزی شبیه به این باید آنچه شما نیاز دارید انجام دهد؟

آن را بررسی کنید: wintee

نیازی به cygwin نیست.

با این حال، من با برخی از مشکلات مواجه شده و گزارش داده ام.

همچنین می‌توانید http://unxutils.sourceforge.net/ را بررسی کنید زیرا حاوی tee است (و به cygwin نیاز ندارد)، اما مراقب باشید که خروجی‌های EOL شبیه UNIX هستند.

آخرین اما مهم، اگر PowerShell دارید، می توانید Tee-Object را امتحان کنید. برای اطلاعات بیشتر در کنسول PowerShell تایپ کنید.

این کار می کند، اگرچه کمی زشت است:

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

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

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

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

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

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

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

اگر cygwin را در مسیر محیط ویندوز خود دارید، می توانید از:

یک برنامه ساده کنسول سی شارپ این کار را انجام می دهد:

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

نتایج جستجو را نمایش می دهد و نتایج را در files1.txt و files2.txt ذخیره می کند.

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

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

حتی هر دستور PAUSE را ضبط می کند.

یک جایگزین این است که stdout را به stderr در برنامه خود متصل کنید:

سپس در batchfile dos خود:

Stdout به فایل log می رود و stderr (داده های مشابه) روی کنسول نمایش داده می شود.

نحوه نمایش و تغییر مسیر خروجی به یک فایل فرض کنید اگر از دستور dos، dir > test.txt استفاده کنم، این دستور خروجی را بدون نمایش نتایج به فایل test.txt هدایت می کند. نحوه نوشتن دستور برای چاپ خروجی و تغییر مسیر خروجی به فایل با استفاده از DOS یعنی خط فرمان ویندوز، نه UNIX/LINUX.

ممکن است این دستورات را در biterscripting (http://www.biterscripting.com) مفید بیابید.

این یک نوع پاسخ قبلی MTS است، با این حال برخی ویژگی‌ها را اضافه می‌کند که ممکن است برای دیگران مفید باشد. این روشی است که من استفاده کردم:

  • دستور به عنوان یک متغیر تنظیم شده است که می تواند بعداً در کد مورد استفاده قرار گیرد تا به پنجره فرمان خروجی داده شود و با استفاده از آن به فایل log اضافه شود.
    • دستور از تغییر جهت با استفاده از کاراکتر هویج جلوگیری می کند تا دستورات در ابتدا ارزیابی نشوند
  • یک فایل موقت با نام فایلی شبیه به فایل دسته ای ایجاد می شود که از دستور بسط پارامتر خط فرمان برای دریافت نام فایل دسته ای استفاده می کند.
  • نتیجه به یک فایل گزارش جداگانه اضافه می شود

در اینجا دنباله دستورات است:

  1. پیام های خروجی و خطا به یک فایل موقت ارسال می شوند
  2. محتویات فایل موقت عبارتند از:
    • به فایل لاگ اضافه شد
    • خروجی به پنجره فرمان
  3. فایل پیام موقت حذف می شود

به عنوان مثال:

به این ترتیب دستور را می توان فقط بعد از دستورات بعدی در فایل دسته ای اضافه کرد که بسیار تمیزتر به نظر می رسد:

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

من با برایان راسموسن موافقم، پورت unxutils ساده ترین راه برای انجام این کار است. راب ون در وود در بخش فایل‌های دسته‌ای از صفحات اسکریپت خود، اطلاعات زیادی در مورد استفاده از دستورات MS-DOS و CMD ارائه می‌کند. من فکر کردم که ممکن است راه حل خود را برای مشکل شما داشته باشد، و پس از جستجو در TEE.BAT در آنجا، TEE.BAT را پیدا کردم، که به نظر می رسد فقط همین باشد، یک بسته زبان بسته بندی شده MS-DOS. این یک فایل دسته ای نسبتاً پیچیده است و من تمایل دارم از پورت unxutils استفاده کنم.

من پرل را روی اکثر ماشین هایم نصب می کنم، بنابراین پاسخ با perl است: tee.pl

dir | perl tee.pl یا دایرکتوری | perl tee.pl dir.bat

خام و تست نشده

در حالی که به طور معمول، همانطور که گفته شد، I/O برنامه به جریان های استاندارد متصل است، اما در پوسته امکانات ویژه ای برای تغییر مسیر I/O وجود دارد.

5.5.1 اپراتورها >< и >>

نمادهای " برای نشان دادن تغییر مسیر استفاده می شوند. > ", "< "و" >> ". رایج ترین استفاده برای تغییر مسیر خروجی یک دستور به یک فایل است. در اینجا یک مثال مرتبط آورده شده است:

$ ls -l > /home/jim/dir.txt

این دستور فهرستی از فایل ها و زیر شاخه های دایرکتوری را که در زمان اجرای دستور در فایل /home/jim/dir.txt جاری بوده اند ذخیره می کند. ls; در عین حال، اگر فایل مشخص شده وجود نداشته باشد، ایجاد می شود. اگر وجود داشته باشد، بازنویسی خواهد شد. اگر می خواهید خروجی دستور به انتهای یک فایل موجود اضافه شود، به جای نماد > استفاده کنید >> . در این حالت وجود فاصله های قبل یا بعد از کاراکترها > یا >> بی اهمیت است و فقط برای راحتی کاربر است.

شما می توانید خروجی را نه تنها به یک فایل، بلکه به ورودی یک فرمان دیگر یا به یک دستگاه (مانند چاپگر) هدایت کنید. به عنوان مثال، برای شمارش تعداد کلمات در فایل /home/jim/report.txt، می توانید از دستور زیر استفاده کنید:

$ cat /home/jim/report.txt > wc -w

و برای چاپ فایل - دستور:

$ cat /home/jim/report.txt > lpr

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

$ wc -w< /home/jim/report.txt

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

چون نمادها < , > و >> بر روی جریان های استاندارد عمل کنید، آنها می توانند نه تنها به روش معمول، همانطور که معمولاً انجام می شود، بلکه به روشی کمی متفاوت نیز استفاده شوند. بنابراین دستورات زیر معادل هستند:

$ cat > فایل

$cat> فایل

$ >filecat

$ > file cat

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

$ file1 > file2

یک کپی از چند فایل دریافت کنید اما این چیزی از ارزش این مکانیزم کم نمی کند، زیرا جریان های استاندارد برای هر دستوری تعریف شده است. در این مورد، می توانید نه تنها ورودی و خروجی استاندارد، بلکه جریان های دیگر را نیز تغییر مسیر دهید. برای این کار باید قبل از علامت تغییر مسیر، تعداد جریانی که قرار است تغییر مسیر دهد را مشخص کنید. ورودی استاندارد stdin شماره 0 است، خروجی استاندارد stdout شماره 1 است، پیام خطای استاندارد stream stderr شماره 2 است. یعنی فرمت کامل دستور redirect این است (به یاد بیاورید که فاصله های کنار > مورد نیاز نیست):

دستور N > M

جایی که نو م- تعداد جریان های استاندارد (0،1،2) یا نام فایل ها. استفاده از نمادها در برخی موارد < , > و >> بدون تعیین شماره کانال یا نام فایل فقط به این دلیل امکان پذیر است که به جای عدد گمشده، 1 به طور پیش فرض جایگزین می شود، یعنی خروجی استاندارد. بله اپراتور > بدون عدد به این صورت تعبیر می شود 1 > .

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

دستور N > &M

این دستور به این معنی است که خروجی کانال با شماره نهم به خروجی استاندارد ارسال می شود و هم با شماره در لوله کپی می شود م. به عنوان مثال، برای اینکه پیام های خطا در خروجی استاندارد تکرار شوند، باید دستور را صادر کنید 2>&1, در حالی که 1>&2 stdout را به stderr کپی می کند. این ویژگی به ویژه هنگام هدایت کردن خروجی به یک فایل مفید است، زیرا هم پیام‌ها را روی صفحه می‌بینیم و هم آنها را در یک فایل ذخیره می‌کنیم.

5.5.2 اپراتور |

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

$ cat myfile | grep لینوکس | wc -l

این خط به این معنی است که خروجی دستور گربه، یعنی متن فایل myfile به ورودی دستور هدایت می شود grep، که فقط خطوط حاوی کلمه "Linux" را انتخاب می کند. خروجی فرمان grepبه نوبه خود به ورودی دستور هدایت می شود wc -l، که تعداد این ردیف ها را می شمارد.

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

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

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

5.5.3 فیلترها

آخرین نمونه از مثال های بالا (با دستور grep) می تواند برای نشان دادن مفهوم مهم دیگر، یعنی برنامه فیلتر استفاده شود. فیلترها دستورات (یا برنامه‌هایی) هستند که یک جریان داده ورودی را می‌پذیرند، تغییراتی را روی آن انجام می‌دهند و نتیجه را به خروجی استاندارد می‌رسانند (از جایی که می‌توان به درخواست کاربر به جای دیگری هدایت کرد). دستورات فیلتر شامل دستوراتی است که قبلاً در بالا ذکر شد. گربه، بیشتر، کمتر، wc، cmp، تفاوت, و همچنین دستورات زیر

جدول 5.1.دستورات فیلتر

تیم

توضیح کوتاه

grep, fgrep, egrep

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

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

کام

دو فایل را خط به خط مقایسه می کند و 3 ستون را در stdout چاپ می کند: یکی حاوی خطوطی است که فقط در 1 فایل وجود دارد، دومی حاوی خطوطی است که فقط در فایل دوم وجود دارد: و سومی حاوی خطوطی است که در هر دو فایل ظاهر می شود.

یک فایل متنی یا محتویات ورودی استاندارد را برای چاپ قالب بندی می کند.

sed

ویرایشگر خطی که برای انجام برخی تغییرات در جریان داده ورودی (برگرفته از یک فایل یا ورودی استاندارد) استفاده می شود.

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

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

در مورد تغییر مسیر و فیلترها می توان چیزهای زیادی گفت. اما این مطالب در اکثر کتاب‌های یونیکس و لینوکس، مانند Petersen [A1.4] و Kelly-Bootle [A1.8] یافت می‌شود. بنابراین ما به آنچه گفته شد اکتفا می کنیم و به اصطلاح محیط یا محیط ایجاد شده توسط پوسته را در نظر می گیریم.

V. Kostromin (kos در rus-linux dot net) - 5.5. تغییر مسیر I/O، کانال ها و فیلترها

سیستم I/O در لینوکس.

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

هر دستگاه متصل (ترمینال، دیسک، چاپگر، و غیره) حداقل یک فایل خاص مرتبط با خود دارد. بیشتر این فایل های ویژه در پوشه /dev ذخیره می شوند:
$ cd /dev
$ ls -l
پنل کنترل سیستم روی کفی
تکه های dsk روی دیسک
فلاپی دیسک fd0 1
حافظه مم
چاپگر lp
پورت موازی lp0 0
. . .
قسمت ریشه روی دیسک برای فایل سیستم ریشه
تعویض بخش مبادله
نام جایگزین کنسول syscon
systty نام دیگری برای کنسول سیستم است
دایرکتوری اصطلاحات برای پایانه ها
پورت سریال ttyS0 0 (COM1)
. . .

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

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

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

شما می توانید چندین سیستم فایل را روی یک دیسک ایجاد کنید. برخی از سیستم ها از یک سیستم فایل در هر دیسک استفاده می کنند، در حالی که برخی دیگر از چندین سیستم استفاده می کنند. با استفاده از دستور mkfs (make file system) می توان یک فایل سیستم جدید ایجاد کرد. به عنوان مثال، عبارت # /sbin/mkfs /dev/dsk/fl1 512 به معنای ایجاد بر روی فلاپی دیسک b: اندازه 512 بلوک است.

به صورت اختیاری، می توانید اندازه سیستم فایل را در بلوک ها و تعداد i-node ها (یعنی حداکثر تعداد فایل هایی که می توانند در سیستم فایل ذخیره شوند) تنظیم کنید. به طور پیش فرض، تعداد i-node برابر است با تعداد بلوک های تقسیم بر چهار. حداکثر تعداد i-node در یک سیستم فایل منفرد 65000 است. اگر به دلایلی به بیش از 65000 i-node روی یک دیسک نیاز دارید، باید دو یا چند سیستم فایل روی آن دیسک ایجاد کنید.

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

برنج. 1. فایل سیستم قبل
نصب /dev/dsk/os1

برنج. 2. فایل سیستم بعد از
/dev/dsk/os1 را به صورت /usr/ mount کنید

دستور /sbin/mount برای نصب فایل سیستم استفاده می شود. این دستور به سیستم فایل داده شده اجازه می دهد تا در هر جایی از ساختار دایرکتوری موجود قرار گیرد:
#/sbin/mount/dev/dsk/osl/usr1 /dev/dsk/osl را روی /usr1 نصب می‌کند
#/sbin/mount/dev/dsk/flt/a /dev/dsk/flt را روی /a سوار می کند

اگر می‌خواهید یک فایل سیستم را روی دیسک‌هایی نصب کنید که باید از نوشتن محافظت شود تا سیستم فقط خواندنی باشد، باید گزینه -r را به دستور /sbin/mount اضافه کنید.
دایرکتوری که فایل سیستم نصب شده به آن متصل است، باید در حال حاضر خالی باشد، زیرا محتویات آن در حین نصب فایل سیستم قابل دسترسی نخواهد بود.

برای به دست آوردن اطلاعات در مورد سیستم های فایلی که به عنوان مثال بر روی یک سیستم LINUX نصب شده اند، می توانید از دستور /sbin/mount بدون آرگومان استفاده کنید (شکل 3).

برنج. 3.

این دستور دایرکتوری که فایل سیستم بر روی آن نصب شده است (مثلا usrl)، دستگاه /dev که در آن قرار دارد و ساعت و تاریخ نصب آن را چاپ می کند. دستور /sbin/umount برای unmount یک فایل سیستم استفاده می شود که برعکس دستور mount است. این سیستم فایل را آزاد می کند و به نوعی آن را از کل ساختار دایرکتوری خود خارج می کند به طوری که همه فایل ها و دایرکتوری های خود غیرقابل دسترسی هستند:
# /sbin/umount /b
# /sbin/umount /dev/dsk/0s2

سیستم فایل ریشه را نمی توان از حالت نصب خارج کرد. همچنین، اگر شخصی از فایلی از سیستم فایل استفاده کند که در حال unmount شدن باشد، دستور umount با شکست مواجه می‌شود (این کار حتی می‌تواند به سادگی باشد که کاربر در یکی از دایرکتوری‌های سیستم فایل در حال جداسازی باشد).

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

برای دستگاه های فیزیکی، LINUX دارای دایرکتوری های dsk و rdsk است که حاوی فایل های مربوط به دستگاه های دیسک است. معمولاً نام فایل ها در این دایرکتوری ها یکسان است و تنها تفاوت بین آنها این است که دایرکتوری rdsk حاوی دستگاه های دیسک با دسترسی ویژه (خام) است که برخی از دستگاه های سیستم برای دسترسی سریعتر به دیسک از آنها استفاده می کنند. یک دایرکتوری معمولی dsk شامل دستگاه های زیر است:
$ 1s /dev/dsk
0s0 1s0 c0t0d0s0 c0tld0s0 f0 f05q f13dt fld8d
0sl 1sl c0t0d0sl c0tld0sl f03d f05qt f13h fld8dt
0s2 1s2 c0t0d0s2 c0tld0s2 f03dt f0d8d f13ht fld8t
. . .
$

در یک سیستم LINUX، دستگاه های دیسک به طور منطقی به پارتیشن هایی تقسیم می شوند، مشابه پارتیشن های تعریف شده در جدول پارتیشن MasterBoot MS DOS. فایل های 0s1، 0s2، 0s3 و غیره مربوط به بخش های یک، دو، سه و غیره از دیسک شماره 0 هستند. فایل های 1s0، 1sl، 1s2 و غیره مربوط به بخش های یک، دو، سه و غیره دیسک شماره 1 است. اگر سیستم تعداد دیسک های بیشتری داشته باشد، پارتیشن ها برای هر دیسک شماره n ns0، nsl و غیره شماره گذاری می شوند.

سیستم هایی که درایوهای دیسک زیادی دارند از سیستم شماره گذاری زیر استفاده می کنند:
با کنترل d بخش دیسک

جایی که کنترلر - شماره کنترل کننده دیسک؛ دیسک - شماره دیسک؛ بخش - شماره بخش دیسک.
بنابراین، 0s0 معمولا معادل c0t0d0s0 است، و 0sl c0t0d0sl است، و نام پارتیشن های سه کاراکتری فقط مختصر برای کنترل کننده دیسک شماره 0 است.

فایل هایی که نام آنها با f شروع می شود، انواع مختلف فلاپی دیسک را تعریف می کنند. دایرکتوری rmt حاوی فایل هایی در دستگاه های نوار است:
$ 1s /dev/rmt
c0s0 cls0 c3s0 نوار چسب نواری نوار

فایل‌های c0s0، cls0، c2s0 و c3s0 چهار دستگاه ذخیره‌سازی نوار کاست را تعریف می‌کنند. نوار و نوار فایل ها دستگاه های ذخیره سازی مغناطیسی دو حلقه را تعریف می کنند. فایل هایی که نام آنها با n شروع می شود به همان دستگاه ها اشاره دارد، فقط نوار پس از استفاده برگردانده نمی شود، در حالی که استفاده از فایل های دیگر باعث می شود که وقتی برنامه ای که از آن استفاده می کند به پایان برسد، نوار بازگردد.

در برخی از سیستم‌ها، این فایل‌ها نام‌های متفاوتی دارند، اما همیشه در /dev یافت می‌شوند و فرهنگ لغت معمولاً همراه با سیستم حاوی توضیحات مفصلی از دستگاه‌ها و فایل‌های مرتبط با آن‌ها است.

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