Linux. Stdin, Stdout, Stderror

Материал из Wiki
Версия от 19:38, 19 ноября 2023; Cless (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

Links

https://habr.com/ru/articles/55136/

Description

У каждой программы существует 3 системных потока: stdout, stderr, stdin.

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

stdin

Поток ввода данных. А вот это довольно интересный и удобный поток. Например, его использует вэб-сервер, когда просит интерпретаторы выполнить скрипты через CGI. Мы тоже можем попробовать: echo '<?php echo «Hello world»; ?>' | php

 Hello world

stdout

Стандартный поток вывода данных для программ. Например, когда мы пишем команду ls, то список папок и файлов она выводит именно в этот поток, который отображается у нас в консоли: ls

 bin incoming pub usr

stderr

Поток вывода ошибок. Если программа не смогла сделать все как надо — она пишет именно в этот поток. Например, когда rm пытается удалить несуществующий файл: rm example.txt

 rm: example.txt: No such file or directory

Examples

В этом примере мы направили stdout команды ls в файл 1.txt. Читаем его:

ls >1.txt

Здесь мы использовали номер потока stderr (2). По умолчанию оператор > перенаправляет поток stdout, который имеет номер 1. Чтобы направить другой поток, надо перед оператором > поставить его номер.

rm example.txt 2>1.txt

STDOUT и STDERR (весь вывод) скрипта в файл:

/mnt/raid1/data/scripts/zfs_replication_mail02-mail.sh > /mnt/raid1/data/log/zfs_replication_mail02-mail.log 2>&1

Мы можем направлять одни потоки в направлении других.

В этом примере мы направили поток stdout в файл 1.txt, а затем направили stderr туда же, куда направлен stdout с помощью оператора & перед номером потока.

rm exmple.txt >1.txt 2>&1

Команда find с параметром. выводит в stdout все вложенные папки и файлы, которые находит в данной папке и во всех вложенных.

Оператор | перенаправляет stdout одного приложения в stdin следующего. То есть все строки найденные с помощью find пошли в команду grep, которая выбирает строки по определенным условиям и выводит их. Здесь условие — это регулярное выражение, которое говорит о том, что строка должна заканчиваться на "/.svn".

Теперь нам надо выбрать только папки с именем ".svn":

find . | grep -e '/.svn$'