Какво представляват stdin, stderr и stdout в Bash

What Are Stdin Stderr



Всеки път, когато изпълнявате някаква команда в терминала, stdin , stderr , и stdout са три потока от данни, които bash създава. Ако сте запознати с командния ред, може би вече сте се възползвали от тези функции. По същество те позволяват тръбопроводи/пренасочване на данни от една команда към друга.

Нека проверим как stdin , stderr , и stdout работи и как можете да ги използвате.







stdin, stdout и stderr

В изчисленията терминът поток се отнася до нещо, което може да прехвърля данни. Тук и трите потока носят текст като данни.



Подобно на водните потоци, потоците от данни също имат две крайни точки. Има източник и изтичане. Каквато и команда да изпълнявате в терминала, ще бъде в която и да е точка на потока. С помощта на потока можете да свържете два терминални прозореца, две различни команди и дори файлове!



Нека да разгледаме бързо специалните потоци.





  • stdin: Стои за стандартен вход. Той приема текст като вход.
  • stdout: Стои за стандартен изход. Текстовият изход на команда се съхранява в stdout потока.
  • stderr: Представлява стандартна грешка. Всеки път, когато дадена команда се сблъска с грешка, съобщението за грешка се съхранява в този поток.

В Linux почти всички потоци се третират като файлове. Точно както можете да четете/пишете файл, можете да четете/записвате данни от тези потоци.

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



  • 0: stdin
  • 1: stdout
  • 2: stderr

stdin, stdout и stderr в действие

Нека започнем, като научим повече за тези потоци чрез действие, ще започнем със stdin.

Изпълнете следната команда.

$Прочети

Командата ще изисква въвеждане от клавиатурата. Тук инструментът за четене получава входа от stdin. Сега нека разгледаме stdout.

Първо изпълнете командата.

$ls -на

Тук командата ls изброява файловете в текущата директория. Списъкът се изпраща на stdout и терминалът го отпечатва. Нека сега проверим stderr.

Има различни начини за възникване на грешка. За този пример изпращането на невалиден аргумент ще доведе до грешка.

$ls -нанищо

Тук няма файл с име на нищо. Ето защо се изпраща съобщението ls return stderr .

Тръбопроводи

Това е често срещана техника, която се възползва напълно от stdin и stdout потоците. Нека го обясним с пример.

$изхвърлен 'Здравей свят' | захващанеЗдравейте

Тук, | знакът е отговорен за тръбопроводите. Изходът изхвърлен генерира е написано в stdout поток. След това тръбопроводът пренасочва съдържанието на stdout към stdin за командата grep. Ето как grep знае върху какво съдържание да извърши операцията.

Ако искате да предадете stderr и stdout към следващата команда, използвайте вместо това | &.

$изхвърленЗдравей свят| & котка

$нищо| & котка

Пренасочване на потоци

Сега знаем как работят тези потоци, нека да разгледаме как можете да ги пренасочите. Тръбопроводите са форма на пренасочване. Това обаче включва само stdin и stdout. Bash позволява специфичен контрол над трите потока.

За да пренасочите съдържанието на stdout към файл, добавете> ъгъл, последван от името на целевия файл.

$изхвърленЗдравей свят>hello.txt

Тук изходът на командата echo ще се съхранява във файла hello.txt.

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

$изхвърлен 'Здравей свят' >>hello.txt

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

В тази команда cat ще приема своите данни директно от файла hello.txt.

$котка <hello.txt

Нека проверим пренасочването с различен пример. Този път ще включва скрипт на Python.

$# pyin.py
$ name= вход('Въведи имен')
$електронна поща = вход('Въведете имейлн')
$печат(„Вашето име е %s и имейл е %s“%(име, електронна поща))

Входът за скрипта се намира на hello.txt.

$коткаhello.txt

Нека изпратим файла като вход за скрипта.

$ python3 pyin.py <Здравейте.текст

Интересното е, че можете да пренасочите и двете stdin и stdout в същия команден ред. Тук следната команда ще използва hello.txt като stdin и изпратете stdout на командата към файл.

$ python3 pyin.py <Здравейте.текст >изход.текст

Пренасочването на stderr е подобно на stdout. Трябва обаче да споменете описанието ID 2 за посочване на stderr. В противен случай той просто ще използва stdout.

Тук ще пренасочвам съдържанието на stderr към текстов файл.

$нищо2>error.txt

Пренасочване на Stdout и Stderr

Да, възможно е да пренасочите и двете едновременно. Всичко, от което се нуждаете, е да споменете ID на описанието 1 и 2 преди пренасочването.

$изхвърленЗдравей свят1>output.log2>debug.log

Последни мисли

stdin , stdout , и stderr са прекрасни функции, които bash предлага по подразбиране. Ако се занимавате с bash скриптове, използването им може да бъде изключително полезно в трудни ситуации.

Искате ли да научите повече за bash скриптове? Нека започнем с това ръководство за начинаещи по bash скриптове !

Наслади се!