Unix I/O пренасочване. Пренасочване на стандартни I/O и грешки

Пренасочването обикновено се осъществява чрез вмъкване на специалния знак ">" между командите. Обикновено синтаксисът изглежда така:

Команда1 > файл1

изпълнява команда1, записвайки стандартен изход във файл1.

Екип1< файл1

изпълнява command1, използвайки file1 като входен източник (вместо клавиатурата).

Екип1< файл1 >файл2

съчетава предишните два варианта. Изпълнява команда1 с вход от файл1 и изход към файл2

Конвейери

Тръбопроводите са способността на множество програми да работят заедно, където изходът на една програма отива директно към входа на друга без използването на междинни временни файлове. Синтаксис:

отбор1 | екип2

Изпълнява команда1, като използва своя изходен поток като входен поток при изпълнение на команда2, което е еквивалентно на използване на две пренасочвания и временен файл:

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

Добър пример за командни канали е комбинирането на ехо с друга команда за постигане на интерактивност в неинтерактивни среди, например:

echo -e "Потребителско име\nПарола" | ftp локален хост

Това стартира клиент, който се свързва с localhost като UserName, натиска Enter и след това въвежда паролата Password.

Пренасочване към/от стандартни файлови дескриптори

В командната обвивка на UNIX, която е извлечена от обвивката на Bourne, предишните две стъпки могат да бъдат подобрени чрез указване на число (дескриптор на файл) непосредствено преди знака за пренасочване. Това число показва кой поток се използва за пренасочване. UNIX има следните стандартни входно/изходни потоци:

Например:

Команда1 2 > файл1

В командните обвивки, получени от C Shell, според правилата на синтаксиса, за да посочите потока, към който се извършва пренасочването, трябва да добавите знака & след знака за пренасочване.

Често стандартният поток от грешки се комбинира със стандартния изходен поток, така че грешките и нормалният програмен изход да могат да се обработват заедно. Например:

Find / -name .profile> results.txt 2>&1

ще се опита да намери всички файлове с име .profile. Ако изпълните тази команда без пренасочвания, тя ще насочи резултатите от търсенето към , а съобщенията за грешка (например за недостатъчни права за достъп при опит за търсене в защитени директории) към . По подразбиране тези роли се изпълняват от конзолата. Ако стандартният изход е насочен към файла с резултати, тогава грешките пак ще се изпращат до конзолата. За да се гарантира, че както грешките, така и резултатите от търсенето се изпращат към файла results.txt, стандартните потоци за грешка и изходните потоци се комбинират с помощта 2>&1 .

Писане 2>&1 преди > няма да работи, защото когато преводачът чете 2>&1 , той все още не знае къде е пренасочен стандартният изходен поток, така че грешките и изходните потоци няма да бъдат обединени.

Ако комбинираният резултат трябва да бъде прехвърлен към входа на друга програма, тогава последователността 2>&1 трябва да е пред знака на конвейера. Например:

Find / -name .profile 2>&1 | по-малко

Опростена командна форма:

Команда>файл2>&1

изглежда така:

Команда &> файл

Команда>&файл

Транспортна верига

Командите за пренасочване и тръбопроводи могат да бъдат свързани заедно, за да се създадат по-сложни команди, например:

ls | grep ".sh" | sort>shlist

Получава списък със съдържанието на текущата директория, което се филтрира, оставяйки само редове, съдържащи ".sh", тогава този филтриран списък се сортира лексикално и крайният резултат се поставя във файл shlist. Конструкции от този тип често се срещат в UNIX shell скриптове.

Пренасочване към множество пинове

Една стандартна команда може да пренасочи изхода на команда към няколко места едновременно. Пример:

Ls -lrt | пила за тройник1

насочва стандартния изход на командата ls -lrt(списък с файлове) както в конзолата, така и в файл1.

Пренасочване с добавяне

В командната обвивка можете да пренасочите към файл и да го добавите в края. В този случай информацията, съхранена във файла, няма да бъде изтрита, а цялата нова информация ще бъде добавена в края на този файл. Синтаксис:

Команда1>> файл1

Вграден документ

Някои обвивки и дори приложни езици (PHP), Perl, позволяват синтаксиса на вградените документи (вижте синтаксиса на Heredoc), което ви позволява да насочвате входния поток от самия програмен файл, например: cat « EOF Any тук е поставен текст, включително специални знаци EOF

Крайният подпис на края на вградения документ EOF (може да се използва произволна стойност, но често се използва EOF - според значението) трябва да започва в началото на реда.

Ако изходът към (графичната) конзола не е много обемен, можете просто да изберете парче с мишката и да го вмъкнете в съобщението, като щракнете върху средния бутон. В противен случай можете да използвате пренасочване на изхода към файл чрез фуния, като това:

Some_command параметри > logfile.txt

За да видите резултата от изпълнението на екрана и в същото време да пишете във файл, можете да използвате командата tee:

Параметри на някои_команди | tee -a logfile.txt

Командата setterm -dump създава моментна снимка на текущия буфер на виртуалната конзола като обикновен текстов файл с име по подразбиране screen.dump. Като негов аргумент можете да използвате номера на конзолата, за която искате да изхвърлите. И добавянето на опцията -file filename ще пренасочи този дъмп към файл с указаното име. Опцията -append ще добави нов дъмп към вече съществуващ файл - "по подразбиране" screen.dump или именуван с опцията -file.

Тези. след използване на командата like

Setterm -dump -file /root/screenlog

съответно във файла /root/screenlogще бъде съдържанието на една страница на конзолата.

Намерих друго решение за копиране/поставяне на текст в текстова конзола без мишка. Можете също да копирате текст от буфера за превъртане (т.е. всичко на екрана и над екрана). За да разберете по-добре, прочетете за конзолен мениджърекран на Windows. Може също да е полезно да увеличите размера на буфера за превъртане.

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 - връщане към нулевия прозорец.

Как да увеличите буфера за превъртане?

Първото решение би било да увеличите размера на буфера по подразбиране в източниците на ядрото и да го прекомпилирате. Позволете ми да предположа, че вие ​​не сте толкова склонни към това, колкото и аз, и потърсете по-гъвкаво решение.

И има такъв инструмент и той се нарича framebuffer console, fbcon за кратко. Това устройство има файл с документация fbcon.txt; ако сте инсталирали документацията на ядрото, значи я имате. Потърсете го някъде в района /usr/споделянеклонове (не мога да посоча точния път поради разлики в дистрибуциите).

Тук се извинявам: трябва да направим малко отклонение и да поговорим малко за видео буфера ( кадров буфер ).

Видео буферът е буфер между дисплея и видео адаптера. Красотата му е, че може да се манипулира: позволява трикове, които не биха работили, ако адаптерът беше свързан директно към дисплея.

Един такъв трик включва буфера за превъртане; оказва се, че можете да "помолите" видео буфера да разпредели повече паметбуфер за превъртане. Това се постига чрез параметри за зареждане на ядрото. Първо изискваш кадров буфер(видео буфер); След това изисквате по-голям буфер за превъртане.

Следващият пример е за GRUB, но може лесно да се адаптира към LILO. В конфигурационния файл на GRUB - меню.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 има чудесна помощна програма за гледане, която ви позволява да наблюдавате терминали, но както се оказа, в Linux тя изпълнява напълно различни функции =\ Ако потърсите в Google тази тема, ще намерите нещо...

Системно администриране на Linux системи, както и администриране на всяка UNIX-подобна система. Неразривно свързан с работата в командни черупки. За опитни системни администраториТози начин на взаимодействие със системата е много по-удобен и по-бърз от използването на графични черупки и интерфейси. Разбира се, на мнозина това веднага ще се стори преувеличено, но това е безспорен факт. Постоянно се потвърждава в практиката. И тази ситуация е възможна благодарение на някои трикове и инструменти, използвани при работа с командната конзола. И един от тези инструменти е използването на информационни канали и пренасочване на потоците от данни за процесите.

Малко теория

Трябва да започнем с факта, че за всеки процес системата предоставя поне три информационни канала за „използване“:

  • STDIN – стандартен вход;
  • STDOUT – стандартен изход;
  • STDERR – стандартна грешка.

Няма строго присвояване на тези канали за всеки процес. Самите процеси, първоначално появили се в системата, „не знаят“ на кого и как принадлежат каналите. Те (канали) са ресурс за цялата система. Въпреки че се инсталират от ядрото от името на процеса. Каналите могат да свързват файлове, каналите свързват други процеси, мрежови връзки и т.н.

В UNIX-подобни системи, според входно-изходния модел. На всеки от информационните канали се задава целочислена стойност като число. Въпреки това, за безопасен достъп. към горните канали. За тях са запазени постоянни номера - 0, 1 и 2 съответно за STDIN, STDOUT и STDERR. По време на изпълнение на процеси входните данни се четат чрез STDIN. Чрез клавиатурата, от изхода на друг процес, файл и т.н. И изходни данни (чрез STDOUT), както и данни за грешки (чрез STDERR). Те се показват на екрана, във файл, при вход (вече чрез STDIN на друг процес) в друга програма.

За да промените посоката на информационните канали и да ги свържете с файлове, има специални инструкциипод формата на символи<, >и >>. Така например, инструкции< можно заставить направить процессу по STDIN содержимое файла. А с помощью инструкции >Процесът използва STDOUT за прехвърляне на изходни данни във файл, който замества цялото съдържание на съществуващия файл. Ако липсва, ще бъде създаден. Инструкцията >> прави същото като инструкцията >, но не презаписва файла, а добавя изхода към края му. За да комбинирате потоци (т.е. да ги насочите към една и съща дестинация) STDOUT и STDERR, трябва да използвате конструкцията >&. За да насочите един от потоците, например STDERR, към отделно място, има инструкция 2>.

За да свържете два канала заедно. Например, когато трябва да насочите изхода на една команда към входа на друга. За това трябва да използвате инструкцията (символ) „|“. Което означава логическа операция"или". Въпреки това, в контекста на свързването на нишки, тази интерпретация няма значение, което често обърква начинаещите. Благодарение на такива възможности могат да се създават цели командни канали. Това прави работата в командни обвивки много ефективна.

Изход във файл

Насочете изхода на командата и запишете този изход във файла /tmp/somemessage:

$ echo “Това е тестово съобщение” > /tmp/somemessage

В този случай, като команда, от изхода на която (чрез STDOUT) данните се пренасочват под формата на текст “ товаеатестмасаж" е помощната програма за ехо. В резултат на това ще бъде създаден файл /tmp/somemessage, в който ще има запис „Това е тестово съобщение“. Ако файлът не е създаден, той ще бъде създаден; ако бъде създаден, всички данни в него ще бъдат презаписани. Ако трябва да добавите изхода към края на файла, трябва да използвате оператора “>>”.

$ echo “Това е тестово съобщение” >> /tmp/somemessage $ cat /tmp/somemessage Това е тестово съобщение Това е тестово съобщение

Както виждаме от примера, втората команда добави ред в края на файла.

Извличане на данни от файл

Следният пример демонстрира пренасочване при влизане:

$ mail -s "Поща тест" 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 пренасочва изхода на помощната програма за намиране (чрез канала STDOUT) към файла /tmp/corefiles. Съобщенията за грешка се филтрират до /dev/null, вместо да се показват в изхода на терминала на командната конзола.

Да се ​​свързват помежду си различни канализа различни команди:

$ fsck --помощ | дреп М

M не проверявайте монтирани файлови системи

Тази команда ще отпечата реда (или редовете), съдържащ знака "M" от страницата за бърза помощ на помощната програма. Това е много удобно, когато трябва да видите само информацията, която ви интересува. В този случай помощната програма grep получава изхода (с помощта на инструкцията |) от командата fsck --help. И тогава, според модела "М", всичко ненужно се изхвърля.

Ако искате следващата команда в конвейера да бъде изпълнена само след като предишната команда е приключила напълно и успешно, тогава трябва да използвате инструкцията &&, например:

$ lpr /tmp/t2 && rm /tmp/страница1

Тази команда ще изтрие файла /tmp/page1 само когато съдържанието му бъде изпратено от опашката за печат. За да постигнете обратния ефект, т.е. когато трябва да изпълните следващата команда в конвейера само след като предишната е неуспешна (неуспешна с грешка с ненулев код), трябва да използвате конструкцията ||

Когато ред от код, който включва много дълъг команден конвейер, е труден за разбиране, можете да го разделите на неговите логически компоненти ред по ред, като използвате знака обратна наклонена черта "\":

$ cf --preserve --recursive /etc/* /spare/backup \ || echo "Направете грешка при архивиране"

Индивидуалните команди, които трябва да се изпълняват една след друга, могат да бъдат комбинирани в един ред, разделени с двоеточие „;“:

Ако намерите грешка, моля, маркирайте част от текста и щракнете Ctrl+Enter.

Когато работите в терминала, вие естествено виждате всички команди в реално време направо в прозореца на терминала. Но има моменти, когато изходът трябва да бъде запазен, за да работите с него по-късно (да го анализирате, да го сравните и т.н.). Така че, работейки в Bash, имате възможност да пренасочите показаната информация от прозореца на терминала към текстов файл. Нека да разгледаме как се прави това.

Вариант 1: просто пренасочете изхода на терминала към файл

В този случай целият резултат от всяка команда ще бъде записан в текстов файл, без да се показва на екрана. Тоест ние буквално ще пренасочваме информацията от екрана към файл. За да направите това, трябва да използвате операторите > И >> и пътя до файла, в който да се пише, в края на изпълняваната команда.

Оператор > ще запише резултата от командата в посочен файли ако вече съдържа някаква информация, ще я презапише.

Оператор >> ще пренасочи изхода на командата към файл и ако съдържа и информация, новите данни ще бъдат добавени в края на файла.

Нека да разгледаме примера на командата ls , който показва списък с файлове и папки в посочената директория. Нека запишем резултата от работата му в текстов файл. Трябва да напишем команда, да поставим оператор и да посочим пътя до файла:

Ls > /home/ruslan/example

Сега да видим дали всичко работи. За това можете да използвате всеки текстов редактор, който и да имате. Можете също да направите това директно в терминала, като използвате командата cat:

Котка /дом/руслан/пример

всичко работи

Запомнете това " > " ще презапише всички данни, които са били преди това във файла, така че ако трябва да добавите нещо към файла, използвайте оператора " >> «

Да кажем, че след като пренасочихме изхода на командата ls да подаде " пример „Решихме да разберем версията на системното ядро ​​и да запазим изхода в същия файл. За да разберете версията на ядрото, използвайте командата uname и параметър , след което казваме на Bash как и къде да запази резултата от неговото изпълнение:

Uname -a >> /home/ruslan/example

Да проверим отново резултата:

Котка /дом/руслан/пример

Както можете да видите, ние сме запазили резултатите от нашата работа и ls , И uname .

Опция 2: Пренасочване на изхода към файл и показването му на екрана

Не винаги е удобно за всички да използват оператори > И >> , тъй като все още е по-добре, когато вълнението от командите може да се наблюдава в реално време в прозореца на терминала. В този случай можем да използваме командата тениска , който ще покаже изпълнението на командите на екрана и ще го запише във файл. Синтаксисът му е:

Екип | tee /path/to/file

Тази опция е подобна на оператора > от предходния параграф, тоест при запис във файл всички стари данни ще бъдат изтрити. Ако трябва да добавите към файл, трябва да добавите параметър към конструкцията :

Екип | tee -a /път/към/файл

Една от най-интересните и полезни теми за системните администратори и новите потребители, които тепърва започват да разбират как да работят с терминала, е пренасочването на I/O поток на Linux. Тази функция на терминала ви позволява да пренасочите изхода на команди към файл или съдържанието на файл към въвеждане на команда, да комбинирате команди заедно и да формирате командни канали.

В тази статия ще разгледаме как се извършва пренасочването на I/O поток в Linux, какви оператори се използват за това и къде може да се използва всичко това.

Всички команди, които изпълняваме, ни връщат три типа данни:

  • Резултатът от командата, обикновено текстови данни, поискани от потребителя;
  • Съобщения за грешки - информират за процеса на изпълнение на командата и възникнали неочаквани обстоятелства;
  • Кодът за връщане е число, което ви позволява да прецените дали програмата е работила правилно.

В Linux всички вещества се считат за файлове, включително входно/изходните потоци на linux - файлове. Всяка дистрибуция има три основни файла на потока, които програмите могат да използват, те се дефинират от обвивката и се идентифицират чрез номера на техния файлов дескриптор:

  • STDIN или 0- този файл е свързан с клавиатурата и повечето команди получават данни за работа от тук;
  • STDOUT или 1- това е стандартният изход; програмата изпраща всички резултати от своята работа тук. Той е свързан с екрана или по-точно с терминала, в който се изпълнява програмата;
  • STDERR или 2- всички съобщения за грешка се извеждат в този файл.

I/O пренасочването ви позволява да замените един от тези файлове със свой собствен. Например, можете да принудите програма да чете данни от файл в файлова система, а не на клавиатурата, можете също така да извеждате грешки във файл, а не на екрана и т.н. Всичко това се прави с помощта на символи "<" И ">" .

Пренасочване на изхода към файл

Много е просто. Можете да пренасочите изхода към файл, като използвате символа >. Например, нека запазим резултата от горната команда:

топ -bn 5 > топ.log

Опцията -b кара програмата да работи в неинтерактивен пакетен режим, а n - повтаря операцията пет пъти, за да получи информация за всички процеси. Сега да видим какво се случи с котката:

Символ ">" презаписва информация от файл, ако вече има нещо там. За добавяне на данни към крайната употреба ">>" . Например пренасочете изхода към linux файлсъщо и за върха:

топ -bn 5 >> топ.log

По подразбиране стандартният дескриптор на изходния файл се използва за пренасочване. Но можете да посочите това изрично. Тази команда ще даде същия резултат:

топ -bn 5 1>top.log

Пренасочване на грешки към файл

За да пренасочите изхода за грешка към файл, трябва изрично да посочите дескриптора на файла, който ще пренасочите. За грешки това е номер 2. Например, когато се опитвате да получите достъп до директорията на суперпотребител, ls ще изведе грешка:

Можете да пренасочите стандартната грешка към файл като този:

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

За да добавите данни в края на файла, използвайте същия символ:

ls -l /корен/ 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

Стандартен вход от файл

Повечето програми, с изключение на услугите, получават данни за работата си чрез стандартен вход. По подразбиране стандартното въвеждане очаква въвеждане от клавиатурата. Но можете да принудите програмата да чете данни от файл с помощта на оператора "<" :

котка

Можете също незабавно да пренасочите изхода към файл. Например, нека пресортираме списъка:

сортиране sort.output

По този начин пренасочваме входа/изхода към linux с една команда.

Използване на тунели

Можете да работите не само с файлове, но и да пренасочите изхода на една команда като вход на друга. Това е много полезно за извършване на сложни операции. Например, нека покажем пет наскоро модифицирани файла:

ls -lt | глава -n 5

С помощната програма xargs можете да комбинирате команди, така че стандартният вход да се предава като параметри. Например, нека копираме един файл в няколко папки:

ехо тест/tmp/ | xargs -n 1 cp -v testfile.sh

Тук опцията -n 1 указва, че трябва да бъде предоставен само един параметър на команда, а опцията -v на cp позволява да се отпечата подробна информация за движенията. Друга полезна команда в такива случаи е tee. Той чете данни от стандартен вход и записва в стандартен изход или файлове. Например:

echo "Тест на работа на тройника" | пила за тройник1

В комбинация с други команди те могат да се използват за създаване на сложни многокомандни инструкции.

Изводи

В тази статия разгледахме основите на Linux I/O пренасочване на потока. Сега знаете как да пренасочите изход към файл на linux или изход от файл. Много е просто и удобно. Ако имате въпроси, попитайте в коментарите!

Споделете