Что такое stdin, stderr и stdout в Bash

What Are Stdin Stderr



Всякий раз, когда вы запускаете любую команду в терминале, стандартный ввод , stderr , а также стандартный вывод это три потока данных, которые создает bash. Если вы знакомы с командной строкой, возможно, вы уже воспользовались этими функциями. По сути, они позволяют передавать / перенаправлять данные от одной команды к другой.

Давайте посмотрим, как стандартный ввод , stderr , а также стандартный вывод работает, и как вы можете их использовать.







stdin, stdout и stderr

В вычислениях термин поток относится к чему-то, что может передавать данные. Здесь все три потока несут текст в качестве данных.



Подобно водным потокам, потоки данных также имеют две конечные точки. Есть источник и отток. Какая бы команда вы ни запускала в терминале, она будет в любой точке потока. Используя поток, вы можете соединить два окна терминала, две разные команды и даже файлы!



Давайте вкратце разберем специальные потоки.





  • stdin: обозначает стандартный ввод. Он принимает текст в качестве ввода.
  • stdout: обозначает стандартный вывод. Текстовый вывод команды сохраняется в потоке stdout.
  • stderr: обозначает стандартную ошибку. Каждый раз, когда команда сталкивается с ошибкой, сообщение об ошибке сохраняется в этом потоке.

В Linux почти все потоки обрабатываются как файлы. Так же, как вы можете читать / писать файл, вы можете читать / писать данные из этих потоков.

Самый простой способ получить доступ к любому файлу - использовать связанный с ним уникальный номер дескриптора файла. В случае этих потоков каждому из них присваиваются уникальные значения.



  • 0: стандартный ввод
  • 1: стандартный вывод
  • 2: stderr

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

Давайте начнем с того, что узнаем больше об этих потоках через действие, мы начнем с stdin.

Выполните следующую команду.

$читать

Команда потребует ввода с клавиатуры. Здесь инструмент чтения получает ввод от стандартного ввода. Теперь посмотрим на стандартный вывод.

Сначала запустите команду.

$ls -

Здесь команда ls выводит список файлов в текущем каталоге. Список отправлен стандартный вывод и терминал его распечатает. Давайте сейчас проверим stderr.

Есть разные способы возникновения ошибки. В этом примере отправка ls недопустимого аргумента приведет к ошибке.

$ls -что-нибудь

Здесь нет файла с каким-либо именем. Вот почему сообщение ls returns отправляется на stderr .

Трубопровод

Это распространенный метод, который в полной мере использует потоки stdin и stdout. Поясним это на примере.

$выбросил 'Привет, мир' | рукояткаПривет

Здесь | знак отвечает за обвязку. Выход выбросил генерирует записано в стандартный вывод транслировать. Затем конвейер перенаправляет содержимое stdout на stdin для команды grep. Вот как grep узнает, с каким контентом выполнять операцию.

Если вы хотите передать и stderr, и stdout следующей команде, используйте вместо этого | &.

$выбросилПривет, мир| & Кот

$что-нибудь| & Кот

Перенаправление потоков

Теперь мы знаем, как работают эти потоки, давайте посмотрим, как их можно перенаправить. Трубопровод - это форма перенаправления. Однако он включает только stdin и stdout. Bash позволяет контролировать все три потока.

Чтобы перенаправить содержимое стандартного вывода в файл, добавьте угол>, за которым следует имя целевого файла.

$выбросилПривет, мир>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.ру <Привет.текст

Интересно, что вы можете перенаправить оба стандартный ввод а также стандартный вывод в той же командной строке. Здесь следующая команда будет использовать hello.txt как стандартный ввод и отправьте стандартный вывод команды в файл.

$ python3 pyin.ру <Привет.текст >выход.текст

Перенаправление stderr похоже на stdout. Однако вам необходимо указать идентификатор описания 2 для указания stderr. В противном случае будет использоваться стандартный вывод.

Здесь я перенаправляю содержимое stderr в текстовый файл.

$что-нибудь2>error.txt

Перенаправление Stdout и Stderr

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

$выбросилПривет, мир1>output.log2>debug.log

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

стандартный ввод , стандартный вывод , а также stderr замечательные функции, которые bash предлагает по умолчанию. Если вы занимаетесь написанием сценариев bash, их использование может быть невероятно полезным в сложных ситуациях.

Хотите узнать больше о сценариях bash? Давай начнем с этого руководство для начинающих по написанию сценариев на bash !

Наслаждаться!