Шта су стдин, стдоут и стдерр на Линуку?
стдин
, стдоут
, и стдерр
су три тока података створена када покренете Линук наредбу. Помоћу њих можете да утврдите да ли се ваше скрипте преводе или преусмеравају. Ми вам показујемо како.
Потоци се придружују два бода
Чим почнете да учите о Линук-у и Уник-у сличним оперативним системима, наићи ћете на услове стдин
, стдоут
, и стедерр
. То су три стандардна тока која се успостављају када се изврши Линук наредба. У рачунарству је ток нешто што може преносити податке. У случају ових токова, ти подаци су текст.
Токови података, попут водених токова, имају два краја. Имају извор и одлив. Коју год Линук команду користите, пружа један крај сваког стрима. Други крај одређује љуска која је покренула команду. Тај крај ће бити повезан са прозором терминала, повезан са цеви или преусмерен у датотеку или другу команду, у складу са командном линијом која је покренула команду.
Линук стандардни токови
У Линуку,стдин
је стандардни улазни ток. Ово прихвата текст као свој улаз. Излаз текста из наредбе у љуску испоручује се путем стдоут
(стандардни излаз) ток. Поруке о грешкама из наредбе се шаљу преко стдерр
(стандардна грешка) ток.
Тако да можете видети да постоје два излазна тока, стдоут
и стдерр
, и један улазни ток, стдин
. Будући да поруке о грешкама и нормални излази имају свој канал за одвођење до прозора терминала, њима се може руковати независно једна од друге.
Потоци се обрађују као датотеке
Потоци у Линуку - као и готово све остало - третирају се као да су датотеке. Можете читати текст из датотеке, а можете и текст у датотеку. Обе ове акције укључују ток података. Дакле, концепт руковања протоком података као датотеком није толико натегнут.
Свакој датотеци придруженој процесу додељује се јединствени број за идентификацију. Ово је познато као дескриптор датотеке. Кад год је потребно извршити радњу над датотеком, дескриптор датотеке се користи за идентификацију датотеке.
Ове вредности се увек користе за стдин
, стдоут,
и стдерр
:
- 0: стдин
- 1: стдоут
- 2: стдерр
Реаговање на цеви и преусмеравања
Како би се олакшало нечије упознавање са предметом, уобичајена техника је подучавање поједностављене верзије теме. На пример, код граматике нам је речено да је правило „Ја пре Е, осим после Ц.“ Али у ствари, од овог правила има више изузетака него што има случајева који га поштују.
У сличној вени, када се говори о стдин
, стдоут
, и стдерр
погодно је избацити прихваћени аксиом да процес нити зна, нити га занима где су његова три стандардна тока окончана. Да ли би процес требао водити рачуна хоће ли његов излаз ићи на терминал или ће бити преусмјерен у датотеку? Може ли уопште рећи да ли његов улаз долази са тастатуре или се у њега уводи из другог процеса?
Заправо, процес зна - или бар може да сазна, уколико одлучи да провери - и може сходно томе променити своје понашање ако је аутор софтвера одлучио да дода ту функционалност.
Ову промену понашања можемо врло лако уочити. Испробајте ове две команде:
лс
лс | мачка
Тхе лс
наредба се понаша другачије ако се њен излаз (стдоут
) се пребацује у другу команду. То јелс
који се пребацује на излаз из једне колоне, то није конверзија коју врши мачка
. И лс
ради исту ствар ако се његов излаз преусмерава:
лс> цаптуре.ткт
цат цаптуре.ткт
Преусмеравање стдоут и стдерр
Предност је што поруке о грешкама испоручује наменски стрим. То значи да можемо преусмерити излаз команде (стдоут
) у датотеку и даље виде поруке о грешци (стдерр
) у прозору терминала. Можете реаговати на грешке ако је потребно, чим се појаве. Такође спречава поруке о грешкама да загађују датотеку која стдоут
је преусмерен на.
Укуцајте следећи текст у едитор и сачувајте га у датотеци званој еррор.сх.
#! / бин / басх ецхо "О покушају приступа датотеци која не постоји" цат бад-филенаме.ткт
Помоћу ове наредбе учините скрипту извршном:
цхмод + к грешка.сх
Први ред скрипте одзвања текст у прозор терминала путемстдоут
поток. Други ред покушава да приступи датотеци која не постоји. Ово ће генерисати поруку о грешци која се испоручује путем стдерр
.
Покрените скрипту са овом наредбом:
./еррор.сх
Можемо видети да оба тока резултата, стдоут
и стдерр
, приказани су у прозорима терминала.
Покушајмо да преусмеримо излаз у датотеку:
./еррор.сх> цаптуре.ткт
Порука о грешци која се испоручује путем стдерр
и даље се шаље у прозор терминала. Можемо да проверимо садржај датотеке да видимо да ли је стдоут
излаз је отишао у датотеку.
цат цаптуре.ткт
Излаз из стдин
је преусмерен у датотеку како се очекивало.
Тхе >
симбол за преусмеравање ради са стдоут
подразумевано. Можете користити један од нумеричких дескриптора датотека да назначите који стандардни излазни ток желите да преусмерите.
Да експлицитно преусмери стдоут
, користите ово упутство за преусмеравање:
1>
Да експлицитно преусмери стдерр
, користите ово упутство за преусмеравање:
2>
Покушајмо поново да тестирамо и овај пут ћемо користити 2>
:
./еррор.сх 2> цаптуре.ткт
Порука о грешци се преусмерава и стдоут
одјек
порука се шаље у прозор терминала:
Погледајмо шта се налази у датотеци цаптуре.ткт.
цат цаптуре.ткт
Тхе стдерр
порука се налази у цаптуре.ткт како се очекивало.
Преусмеравање и стдоут и стдерр
Свакако, ако можемо и једно и друго да преусмеримо стдоут
или стдерр
у датотеку независно једну од друге, требали бисмо бити у могућности да их преусмеримо истовремено у две различите датотеке?
Да ми можемо. Ова наредба ће усмерити стдоут
у датотеку која се зове цаптуре.ткт и стдерр
у датотеку звану еррор.ткт.
./еррор.сх 1> цаптуре.ткт 2> еррор.ткт
Будући да су оба тока резултата - стандардни излаз и стандардна грешка - преусмерени на датотеке, у прозору терминала нема видљивог излаза. Враћени смо у одзивник командне линије као да се ништа није догодило.
Проверимо садржај сваке датотеке:
цат цаптуре.ткт
мачка грешка.ткт
Преусмеравање стдоут и стдерр на исту датотеку
То је уредно, имамо сваки од стандардних излазних токова који иду у своју наменску датотеку. Једина друга комбинација коју можемо да урадимо је да пошаљемо обе стдоут
и стдерр
у исти фајл.
То можемо постићи следећом командом:
./еррор.сх> цаптуре.ткт 2> & 1
Разбијемо то.
- ./еррор.сх: Покреће датотеку скрипте еррор.сх.
- > цаптуре.ткт: Преусмерава
стдоут
стрим до датотеке цаптуре.ткт.>
је скраћеница за1>
. - 2>&1: Овде се користи упутство &> преусмеравање. Ово упутство вам омогућава да кажете љусци да један ток дође до истог одредишта као други ток. У овом случају кажемо „преусмери ток 2,
стдерр
, до истог одредишта као и ток 1,стдоут
, је преусмерен на. “
Нема видљивих резултата. То је охрабрујуће.
Проверимо датотеку цаптуре.ткт и видимо шта се у њој налази.
цат цаптуре.ткт
Оба стдоут
и стдерр
токови су преусмерени у једну одредишну датотеку.
Да би се излаз тока преусмерио и тихо бацио, усмерите излаз на / дев / нулл
.
Откривање преусмеравања унутар скрипте
Разговарали смо о томе како наредба може да открије да ли се било који од токова преусмерава и можемо да одлучимо да у складу с тим променимо његово понашање. Можемо ли то постићи властитим сценаријима? Да ми можемо. И то је врло једноставна техника за разумевање и примену.
Укуцајте следећи текст у едитор и сачувајте га као инпут.сх.
#! / бин / басх ако је [-т 0]; затим ецхо стдин долази са тастатуре елсе ецхо стдин долази из цеви или датотеке фи
Користите следећу наредбу да бисте је учинили извршном:
цхмод + к инпут.сх
Паметни део је тест у углатим заградама. Тхе -т
(терминал) опција враћа труе (0) ако се датотека повезана са дескриптором датотеке завршава у прозору терминала. Као аргумент за тест користили смо дескриптор датотеке 0, који представљастдин
.
Ако стдин
повезан на прозор терминала тест ће се показати истинитим. Ако стдин
је повезан са датотеком или цеви, тест неће успети.
За генерисање уноса у скрипту можемо користити било коју прикладну текстуалну датотеку. Овде користимо један под називом думми.ткт.
./инпут.сх <думми.ткт
Излаз показује да скрипта препознаје да улаз не долази са тастатуре, већ да долази из датотеке. Ако се одлучите за то, можете сходно томе променити понашање скрипте.
То је било са преусмеравањем датотеке, хајде да покушамо са пипе.
цат думми.ткт | ./инпут.сх
Скрипта препознаје да се њен улаз у њу убацује. Тачније, још једном препознаје да стдин
ток није повезан са прозором терминала.
Покренимо скрипту без цеви или преусмеравања.
./инпут.сх
Тхе стдин
стреам је повезан на прозор терминала и скрипта то извештава у складу с тим.
Да бисмо проверили исту ствар са излазним током, потребна нам је нова скрипта. Упишите следеће у едитор и сачувајте га као оутпут.сх.
#! / бин / басх ако [-т 1]; тада ецхо стдоут иде до прозора терминала, иначе се ецхо стдоут преусмерава или поставља цевоводом фи
Користите следећу наредбу да бисте је учинили извршном:
цхмод + к инпут.сх
Једина значајна промена ове скрипте је тест у угластим заградама. Цифру 1 користимо за представљање дескриптора датотеке стдоут
.
Покушајмо. Провешћемо излаз мачка
.
./оутпут | мачка
Скрипта препознаје да њен излаз не иде директно у прозор терминала.
Такође можемо тестирати скрипту преусмеравањем излаза у датотеку.
./оутпут.сх> цаптуре.ткт
Нема излаза за прозор терминала, тихо се враћамо у командну линију. Као што бисмо и очекивали.
Можемо погледати у датотеку цаптуре.ткт да видимо шта је снимљено. Користите следећу команду да бисте то урадили.
хватање мачке.ш
Поново, једноставни тест у нашој скрипти открива да стдоут
ток се не шаље директно у прозор терминала.
Ако скрипту покренемо без икаквих цеви или преусмеравања, она би то требало да открије стдоут
испоручује се директно у прозор терминала.
./оутпут.сх
И управо то видимо.
Потоци свести
Ако знате како да препознате да ли су ваше скрипте повезане са прозором терминала или каналом или су преусмерене, омогућава вам да прилагодите њихово понашање у складу с тим.
Извештавање и дијагностички излаз могу бити мање или више детаљни, у зависности од тога да ли иду на екран или у датотеку. Поруке грешака могу се евидентирати у датотеку која се разликује од уобичајеног излаза програма.
Као што је обично случај, више знања доноси више могућности.