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

تغییر مسیر معمولاً با قرار دادن کاراکتر ویژه ">" بین دستورات انجام می شود. به طور معمول نحو به این شکل است:

Command1 > file1

دستور 1 را اجرا می کند و خروجی استاندارد را در file1 می نویسد.

تیم 1< файл1

دستور1 را با استفاده از file1 به عنوان منبع ورودی (به جای صفحه کلید) اجرا می کند.

تیم 1< файл1 >file2

دو گزینه قبلی را ترکیب می کند. دستور 1 را با ورودی از file1 و خروجی به file2 اجرا می کند

نوار نقاله

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

تیم 1 | تیم 2

دستور 1 را با استفاده از جریان خروجی خود به عنوان جریان ورودی هنگام اجرای فرمان 2 اجرا می کند که معادل استفاده از دو تغییر مسیر و یک فایل موقت است:

Command1 > TemporaryFile command2< ВременныйФайл rm ВременныйФайл

یک مثال خوب از خطوط لوله فرمان، ترکیب پژواک با دستور دیگری برای دستیابی به تعامل در محیط های غیر تعاملی است، به عنوان مثال:

echo -e "نام کاربری\nرمز عبور" | لوکال هاست ftp

این یک کلاینت را شروع می کند که به عنوان UserName به localhost متصل می شود، Enter را فشار می دهد و سپس رمز عبور را وارد می کند.

تغییر مسیر به/از توصیفگرهای استاندارد فایل

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

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

Command1 2 > file1

در پوسته های فرمان مشتق شده از پوسته C، طبق قوانین نحوی، برای نشان دادن جریانی که تغییر مسیر به آن انجام می شود، باید کاراکتر & را بعد از کاراکتر تغییر مسیر اضافه کنید.

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

/ -name .profile> results.txt 2>&1 را پیدا کنید

سعی خواهد کرد همه فایل‌های با نام .profile را پیدا کند. اگر این دستور را بدون تغییر مسیر اجرا کنید، نتایج جستجو را به و پیام‌های خطا (مثلاً در مورد حقوق دسترسی ناکافی هنگام جستجو در فهرست‌های محافظت‌شده) به . به طور پیش فرض، این نقش ها توسط کنسول انجام می شود. اگر خروجی استاندارد به فایل نتایج هدایت شود، خطاها همچنان به کنسول ارسال می شوند. برای اطمینان از ارسال خطاها و نتایج جستجو به فایل results.txt، خطای استاندارد و جریان های خروجی با استفاده از ترکیب می شوند. 2>&1 .

نوشتن 2>&1 قبل از > کار نخواهد کرد زیرا وقتی مترجم می خواند 2>&1 ، هنوز نمی داند جریان خروجی استاندارد به کجا هدایت می شود، بنابراین جریان های خطا و خروجی ادغام نمی شوند.

اگر قرار است نتیجه ترکیبی به ورودی برنامه دیگری منتقل شود، سپس دنباله 2>&1 باید جلوی تابلوی نوار نقاله باشد. به عنوان مثال:

/ -name .profile 2>&1 | کمتر

فرم فرمان ساده شده:

Command>file2>&1

به نظر می رسد که:

فایل Command &>

Command>&file

زنجیر نقاله

دستورات تغییر مسیر و لوله کشی را می توان برای تولید دستورات پیچیده تری به هم متصل کرد، به عنوان مثال:

ls | grep ".sh" | sort>shlist

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

تغییر مسیر به چندین پین

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

Ls -lrt | فایل تی 1

خروجی استاندارد دستور را هدایت می کند ls -lrt(لیست فایل ها) هم در کنسول و هم در داخل فایل 1.

تغییر مسیر با append

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

Command1>> file1

سند تعبیه شده

برخی از پوسته‌ها و حتی زبان‌های کاربردی (PHP)، Perl، سینتکس اسناد داخلی را اجازه می‌دهند (به نحو Heredoc مراجعه کنید)، که به شما امکان می‌دهد جریان ورودی را از خود فایل برنامه هدایت کنید، به عنوان مثال: cat «EOF Any متن در اینجا قرار داده شده است، از جمله نمادهای خاص EOF

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

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

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

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

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

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

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

Setterm -dump -file /root/screenlog

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

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

1) صفحه راه اندازی

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

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

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

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 یک ابزار ساعت فوق العاده دارد که به شما امکان نظارت بر پایانه ها را می دهد، اما همانطور که مشخص است، در لینوکس عملکردهای کاملا متفاوتی را انجام می دهد =\ اگر این موضوع را در گوگل جستجو کنید، چیزی پیدا خواهید کرد ...

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

کمی تئوری

ما باید با این واقعیت شروع کنیم که برای هر فرآیند، سیستم حداقل سه کانال اطلاعاتی را برای "استفاده" فراهم می کند:

  • STDIN - ورودی استاندارد؛
  • STDOUT - خروجی استاندارد؛
  • STDERR - خطای استاندارد.

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

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

برای تغییر جهت کانال های اطلاعاتی و ارتباط آنها با فایل ها وجود دارد دستورالعمل های ویژهدر قالب نمادها<, >و >>. بنابراین، به عنوان مثال، دستورالعمل< можно заставить направить процессу по STDIN содержимое файла. А с помощью инструкции >این فرآیند از STDOUT برای انتقال داده های خروجی به یک فایل استفاده می کند که جایگزین کل محتوای فایل موجود می شود. در صورت عدم وجود، ایجاد می شود. دستور >> همان کار > را انجام می دهد، اما فایل را بازنویسی نمی کند، بلکه خروجی را به انتهای آن اضافه می کند. برای ترکیب جریان ها (یعنی برای هدایت آنها به یک مقصد) STDOUT و STDERR، باید از ساختار >& استفاده کنید. برای هدایت یکی از جریان ها، به عنوان مثال STDERR، به یک مکان جداگانه، یک دستورالعمل 2> وجود دارد.

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

خروجی به فایل

خروجی دستور را هدایت کنید و این خروجی را در فایل /tmp/somemessage بنویسید:

$ echo "این یک پیام آزمایشی است" > /tmp/somemessage

در این حالت، به عنوان دستوری که از خروجی آن (از طریق STDOUT) داده ها به شکل متن هدایت می شوند. ایناستآتستماساژ" ابزار اکو است. در نتیجه، یک فایل /tmp/somemessage ایجاد می‌شود که در آن ورودی «This is a test message» وجود دارد. اگر فایل ایجاد نشده باشد، اگر ایجاد شود، تمام داده های موجود در آن بازنویسی می شود. اگر می خواهید خروجی را به انتهای فایل اضافه کنید، باید از عملگر ">>" استفاده کنید

$ echo "این یک پیام آزمایشی است" >> /tmp/somemessage $ cat /tmp/somemessage این یک پیام آزمایشی است این یک پیام آزمایشی است

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

بازیابی اطلاعات از یک فایل

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

$ mail -s "Mail test" john< /tmp/somemessage

در سمت راست فرمان (بعد از علامت<) находится файл-источник /tmp/somemesage, содержимое которого перенаправляется в утилиту mail (через STDIN), которая в свою очередь, имеет в качестве собственных параметров заголовок письма и адресата (john).

نمونه های دیگر

مثال زیر نشان می دهد که چرا گاهی اوقات جدا کردن جریان ها از کانال های STDIN و STDERR بسیار مفید است:

$ find / -name core 2> /dev/null

واقعیت این است که دستور هسته find / -name پیام های خطا را "پاشیده" می کند و آنها را به طور پیش فرض به همان مکان نتایج جستجو ارسال می کند. یعنی به ترمینال کنسول فرمان، که به طور قابل توجهی درک کاربر از اطلاعات را پیچیده می کند. زیرا نتایجی که به دنبال آن هستید در بین پیام های خطای متعدد مربوط به حالت دسترسی گم می شود. ساختار 2>/dev/null باعث می‌شود find پیام‌های خطا (به دنبال کانال STDERR با شماره 2 رزرو شده) به دستگاه ساختگی /dev/null ارسال کند و فقط نتایج جستجو را در خروجی باقی بگذارد.

$ find / -name core > /tmp/corefiles 2> /dev/null

در اینجا ساختار > /tmp/corefiles خروجی ابزار Find (از طریق لوله STDOUT) را به فایل /tmp/corefiles هدایت می کند. پیام های خطا به جای اینکه در خروجی ترمینال کنسول فرمان ظاهر شوند به /dev/null فیلتر می شوند.

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

$ fsck --help | درپ ام

M فایل سیستم های نصب شده را بررسی نکنید

این دستور خط (یا خطوط) حاوی کاراکتر "M" را از صفحه راهنمای سریع ابزار چاپ خواهد کرد. این بسیار راحت است زمانی که شما نیاز دارید فقط اطلاعات مورد نظر خود را مشاهده کنید. در این حالت، ابزار grep خروجی (با استفاده از دستورالعمل |) را از دستور fsck --help دریافت می کند. و سپس، طبق الگوی "M"، همه چیز غیر ضروری دور ریخته می شود.

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

$ lpr /tmp/t2 && rm /tmp/page1

این دستور تنها زمانی فایل /tmp/page1 را حذف می کند که محتویات آن از صف چاپ ارسال شده باشد. برای دستیابی به اثر معکوس، یعنی زمانی که شما نیاز به اجرای دستور بعدی در خط لوله تنها پس از شکست دستور قبلی دارید (با یک خطا با یک کد غیر صفر شکست می خورد)، باید از ساختار ||

هنگامی که درک یک خط از کد که شامل یک خط لوله فرمان بسیار طولانی است دشوار است، می‌توانید با استفاده از کاراکتر بک اسلش "\" آن را خط به خط به اجزای منطقی آن تقسیم کنید:

$ cf --preserve --recursive /etc/* /spare/backup \ || echo "ایجاد خطای پشتیبان گیری"

دستورات فردی که باید یکی پس از دیگری اجرا شوند را می توان در یک خط ترکیب کرد که با یک کاراکتر کولون ";" از هم جدا می شوند:

اگر خطایی پیدا کردید، لطفاً قسمتی از متن را برجسته کرده و کلیک کنید Ctrl+Enter.

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

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

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

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

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

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

Ls > /home/ruslan/example

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

گربه /خانه/روسلان/مثال

همه چیز کار می کند.

به یاد بیاور " > " تمام داده هایی را که قبلاً در فایل وجود داشت رونویسی می کند، بنابراین اگر نیاز به اضافه کردن چیزی به فایل دارید، از عملگر استفاده کنید " >> «

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

Uname -a >> /home/ruslan/example

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

گربه /خانه/روسلان/مثال

همانطور که می بینید، ما نتایج کار خود را ذخیره کرده ایم و ls ، و اسم شما .

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

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

تیم | سه راهی /path/to/file

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

تیم | tee -a /path/to/file

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

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

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

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

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

  • 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 است. به عنوان مثال، هنگام تلاش برای دسترسی به دایرکتوری superuser، 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

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

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 "تست عملیات تی" | فایل تی 1

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

نتیجه گیری

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

اشتراک گذاری