Шта су стдин, стдоут и стдерр на Линук-у?

стдин, стдоут и стдерр су три тока података креирана када покренете Линук команду. Можете их користити да бисте утврдили да ли се ваше скрипте шаљу или преусмеравају. Показаћемо вам како.

Токови спајају две тачке

Чим почнете да учите о Линук-у и оперативним системима сличним Уник-у, наићи ћете на термине стдин, стдоут и стедерр. Су три стандардна тока који се успостављају када се изврши Линук команда. У рачунарству, ток је нешто што може да преноси податке. У случају ових токова, ти подаци су текст.

Токови података, као и водени токови, имају два краја. Имају извор и одлив. Која год Линук команда коју користите обезбеђује један крај сваког тока. Други крај је одређен љуском која је покренула команду. Тај крај ће бити повезан са прозором терминала, повезан на цев или преусмерен на датотеку или другу команду, у складу са командном линијом која је покренула команду.

Стандардни токови за Линук

У Линуку, стдин је стандардни улазни ток. Ово прихвата текст као свој унос. Излаз текста из команде у љуску се испоручује преко стдоут (стандардног излаза) тока. Поруке о грешци из команде се шаљу кроз ток стдерр (стандардна грешка).

Дакле, можете видети да постоје два излазна тока, стдоут и стдерр, и један улазни ток, стдин. Пошто поруке о грешци и нормални излаз имају свој сопствени канал за пренос до прозора терминала, њима се може руковати независно једна од друге.

Стреамови се рукују као фајлови

Стреамови у Линуку – као и скоро све остало – третирају се као да су датотеке. Можете читати текст из датотеке, а можете и писати текст у датотеку. Обе ове радње укључују ток података. Дакле, концепт руковања током података као датотеке није тако тежак.

Свакој датотеци која је повезана са процесом се додељује јединствени број за идентификацију. Ово је познато као дескриптор датотеке. Кад год је потребна радња да се изврши на датотеци, дескриптор датотеке се користи за идентификацију датотеке.

Ове вредности се увек користе за стдин, стдоут и стдерр:

0: стдин
1: стдоут
2: стдерр

Реаговање на цеви и преусмеравања

Да би се некоме олакшало упознавање са предметом, уобичајена техника је подучавање поједностављене верзије теме. На пример, са граматиком, речено нам је да је правило „И пре Е, осим после Ц“. Али заправо, тамо су више изузетака од овог правила него има случајева који се томе повинују.

  4 најбоље апликације за читање РСС канала за Линук

На сличан начин, када се говори о стдин, стдоут и стдерр, згодно је навести прихваћени аксиом да процес нити зна нити брине где се завршавају његова три стандардна тока. Да ли процес треба да брине да ли његов излаз иде на терминал или ће бити преусмерен у датотеку? Може ли чак рећи да ли његов унос долази са тастатуре или се у њега преноси из другог процеса?

У ствари, процес зна — или барем може да сазна, ако одлучи да провери — и може да промени своје понашање у складу са тим ако је аутор софтвера одлучио да дода ту функционалност.

Ову промену у понашању можемо видети врло лако. Пробајте ове две команде:

ls

ls | cat

Команда лс се понаша другачије ако се њен излаз (стдоут) преноси у другу команду. То је лс који се пребацује на излаз из једне колоне, то није конверзија коју обавља цат. И лс ради исту ствар ако се његов излаз преусмерава:

ls > capture.txt

лс > цаптуре.ткт у прозору терминала” видтх=”646″ хеигхт=”57″ онлоад=”пагеспеед.лазиЛоадИмагес.лоадИфВисиблеАндМаибеБеацон(тхис);”  онеррор=”тхис.онеррор=нулл;пагеспеед.лазиЛоадИмагес.лоадИфВисиблеАндМаибеБеацон(тхис);”></п> <пре>цат цаптуре.ткт</пре> <п><имг срц=

Преусмеравање стдоут-а и стдерр-а

Постоји предност у томе што се поруке о грешци испоручују преко наменског тока. То значи да можемо да преусмеримо излаз команде (стдоут) у датотеку и да и даље видимо све поруке о грешци (стдерр) у прозору терминала. Можете реаговати на грешке ако је потребно, како се појаве. Такође спречава да поруке о грешци контаминирају датотеку у коју је преусмерен стдоут.

Откуцајте следећи текст у уређивач и сачувајте га у датотеци под називом еррор.сх.

#!/bin/bash

echo "About to try to access a file that doesn't exist"
cat bad-filename.txt

Учините скрипту извршном са овом командом:

chmod +x error.sh

Први ред скрипте преноси текст у прозор терминала, преко стдоут тока. Други ред покушава да приступи датотеци која не постоји. Ово ће генерисати поруку о грешци која се испоручује путем стдерр-а.

Покрените скрипту са овом командом:

./error.sh

Видимо да су оба тока излаза, стдоут и стдерр, приказана у прозорима терминала.

Хајде да покушамо да преусмеримо излаз у датотеку:

./error.sh > capture.txt

./еррор.сх > цаптуре.ткт у прозору терминала” видтх=”646″ хеигхт=”57″ онлоад=”пагеспеед.лазиЛоадИмагес.лоадИфВисиблеАндМаибеБеацон(тхис);”  онеррор=”тхис.онеррор=нулл;пагеспеед.лазиЛоадИмагес.лоадИфВисиблеАндМаибеБеацон(тхис);”></п> <п>Порука о грешци која се испоручује преко стдерр-а се и даље шаље у прозор терминала.  Можемо да проверимо садржај датотеке да видимо да ли је излаз стдоут отишао у датотеку.</п> <пре>цат цаптуре.ткт</пре> <п><имг срц=

Излаз из стдин-а је преусмерен на датотеку као што се очекивало.

Симбол > за преусмеравање подразумевано ради са стандардним излазом. Можете користити један од нумеричких дескриптора датотеке да бисте назначили који стандардни излазни ток желите да преусмерите.

  Како омогућити подршку за Снап пакет на Линук Минт-у

Да бисте експлицитно преусмерили стдоут, користите ову инструкцију за преусмеравање:

1>

Да бисте експлицитно преусмерили стдерр, користите ову инструкцију за преусмеравање:

2>

Покушајмо поново да тестирамо и овог пута ћемо користити 2>:

./error.sh 2> capture.txt

./еррор.сх 2> цаптуре.ткт у прозору терминала” видтх=”646″ хеигхт=”57″ онлоад=”пагеспеед.лазиЛоадИмагес.лоадИфВисиблеАндМаибеБеацон(тхис);”  онеррор=”тхис.онеррор=нулл;пагеспеед.лазиЛоадИмагес.лоадИфВисиблеАндМаибеБеацон(тхис);”></п> <п>Порука о грешци се преусмерава и ехо порука стандардног излаза се шаље у прозор терминала:</п> <п ><имг цласс=

Стдерр порука је у цаптуре.ткт према очекивању.

Преусмеравање и стдоут и стдерр

Наравно, ако можемо да преусмеримо било стдоут или стдерр на датотеку независно један од другог, требало би да будемо у могућности да их преусмеримо у исто време, на две различите датотеке?

Да можемо. Ова команда ће усмерити стдоут у датотеку која се зове цаптуре.ткт, а стдерр у датотеку која се зове еррор.ткт.

./error.sh 1> capture.txt 2> error.txt

./еррор.сх 1> цаптуре.ткт 2> еррор.ткт у прозору терминала” видтх=”646″ хеигхт=”57″ онлоад=”пагеспеед.лазиЛоадИмагес.лоадИфВисиблеАндМаибеБеацон(тхис);”  онеррор=”тхис.онеррор=нулл;пагеспеед.лазиЛоадИмагес.лоадИфВисиблеАндМаибеБеацон(тхис);”></п> <п>Пошто су оба тока излаза – стандардни излаз и стандардна грешка – преусмерени на датотеке, нема видљивог излаза у прозор терминала.  Враћамо се на промпт командне линије као да се ништа није догодило.</п> <п><имг срц=

Хајде да проверимо садржај сваке датотеке:

cat capture.txt
cat error.txt

Преусмеравање стдоут-а и стдерр-а у исту датотеку

То је уредно, имамо сваки од стандардних излазних токова који иде у своју наменску датотеку. Једина друга комбинација коју можемо да урадимо је да пошаљемо и стдоут и стдерр у исту датотеку.

То можемо постићи следећом командом:

./error.sh > capture.txt 2>&1

Хајде да то разбијемо.

./еррор.сх: Покреће датотеку скрипте еррор.сх.
> цаптуре.ткт: Преусмерава стдоут ток у датотеку цаптуре.ткт. > је скраћеница за 1>.
2>&1: Ово користи инструкцију &> за преусмеравање. Ова инструкција вам омогућава да кажете љусци да учини да један ток стигне на исто одредиште као други ток. У овом случају, кажемо „преусмери ток 2, стдерр, на исто одредиште на које се преусмерава ток 1, стдоут.“

./еррор.сх > цаптуре.ткт 2&>1 у прозору терминала” видтх=”646″ хеигхт=”57″ онлоад=”пагеспеед.лазиЛоадИмагес.лоадИфВисиблеАндМаибеБеацон(тхис);”  онеррор=”тхис.онеррор=нулл;пагеспеед.лазиЛоадИмагес.лоадИфВисиблеАндМаибеБеацон(тхис);”></п> <п>Нема видљивог излаза.  То је охрабрујуће.</п> <п><имг срц=

Хајде да проверимо цаптуре.ткт датотеку и видимо шта је у њој.

cat capture.txt

И стдоут и стдерр ток су преусмерени на једну одредишну датотеку.

Да би се излаз тока преусмерио и тихо одбацио, усмерите излаз на /дев/нулл.

Откривање преусмеравања унутар скрипте

Разговарали смо о томе како команда може открити да ли се неки од токова преусмерава и може изабрати да промени своје понашање у складу са тим. Можемо ли то постићи у нашим сопственим скриптама? Да можемо. И то је веома лака техника за разумевање и употребу.

Откуцајте следећи текст у уређивач и сачувајте га као инпут.сх.

#!/bin/bash

if [ -t 0 ]; then

  echo stdin coming from keyboard
 
else

  echo stdin coming from a pipe or a file
 
fi

Користите следећу команду да бисте је учинили извршном:

chmod +x input.sh

Паметан део је тест у угластим заградама. Опција -т (терминал) враћа тачно (0) ако је датотека повезана са дескриптором датотеке завршава у прозору терминала. Користили смо дескриптор датотеке 0 као аргумент за тест, који представља стдин.

  Како инсталирати Цоси Аудиобоок Плаиер на Линук

Ако је стдин повезан са прозором терминала, тест ће се показати тачним. Ако је стдин повезан на датотеку или цев, тест неће успети.

Можемо користити било коју погодну текстуалну датотеку за генерисање уноса у скрипту. Овде користимо један који се зове думми.ткт.

./input.sh 

The output shows that the script recognizes that the input isn’t coming from a keyboard, it is coming from a file. If you chose to, you could vary your script’s behavior accordingly.

That was with a file redirection, let’s try it with a pipe.

cat dummy.txt | ./input.sh

Скрипта препознаје да се њен унос усмерава у њу. Или тачније, још једном препознаје да стдин ток није повезан са прозором терминала.

Хајде да покренемо скрипту без цеви или преусмеравања.

./input.sh

Стдин ток је повезан са прозором терминала и скрипта то пријављује у складу са тим.

Да бисмо проверили исту ствар са излазним током, потребна нам је нова скрипта. Откуцајте следеће у едитор и сачувајте га као оутпут.сх.

#!/bin/bash

if [ -t 1 ]; then

echo stdout is going to the terminal window
 
else

echo stdout is being redirected or piped
 
fi

Користите следећу команду да бисте је учинили извршном:

chmod +x input.sh

Једина значајна промена у овој скрипти је у тесту у угластим заградама. Користимо цифру 1 да представљамо дескриптор датотеке за стдоут.

Хајде да пробамо. Провешћемо излаз кроз кат.

./output | cat

Скрипта препознаје да њен излаз не иде директно у прозор терминала.

Такође можемо тестирати скрипту преусмеравањем излаза у датотеку.

./output.sh > capture.txt

Нема излаза у прозор терминала, тихо се враћамо у командну линију. Као што смо очекивали.

Можемо погледати у датотеку цаптуре.ткт да видимо шта је снимљено. Користите следећу команду да бисте то урадили.

cat capture.sh

Опет, једноставан тест у нашој скрипти открива да се стдоут ток не шаље директно у прозор терминала.

Ако покренемо скрипту без икаквих цеви или преусмеравања, требало би да открије да се стдоут испоручује директно у прозор терминала.

./output.sh

И управо то видимо.

Токови свести

Знајући како да утврдите да ли су ваше скрипте повезане са прозором терминала, или цеви, или су преусмерене, омогућава вам да прилагодите њихово понашање у складу са тим.

Евидентирање и дијагностички излаз може бити више или мање детаљан, у зависности од тога да ли иде на екран или у датотеку. Поруке о грешкама се могу евидентирати у датотеку која се разликује од уобичајеног излаза програма.

Као што обично бива, више знања доноси више опција.