Stdin stdout что это

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

от sasza

Stdin stdout что это. What Are stdin stdout and stderr on. Stdin stdout что это фото. Stdin stdout что это-What Are stdin stdout and stderr on. картинка Stdin stdout что это. картинка What Are stdin stdout and stderr on

stdin, stdout и stderr — это три потока данных, которые создаются при запуске команды Linux. Вы можете использовать их, чтобы определить, передаются ли ваши скрипты по конвейеру или перенаправляются. Мы покажем вам, как это сделать.

Потоки объединяются в две точки

Как только вы начнете знакомиться с Linux и Unix-подобными операционными системами, вы встретите термины stdin, stdout и stederr. Эти три стандартных потока которые устанавливаются при выполнении команды Linux. В вычислениях поток — это то, что может передавать данные. В случае этих потоков эти данные являются текстовыми.

У потоков данных, как и у водных потоков, есть два конца. У них есть источник и отток. Какую бы команду Linux вы ни использовали, она обеспечивает один конец каждого потока. Другой конец определяется оболочкой, запустившей команду. Этот конец будет подключен к окну терминала, подключен к каналу или перенаправлен к файлу или другой команде в соответствии с командной строкой, запустившей команду.

Стандартные потоки Linux

В Linux стандартным входным потоком является stdin. Это принимает текст в качестве ввода. Текстовый вывод команды в оболочку доставляется через поток stdout (стандартный вывод). Сообщения об ошибках от команды отправляются через поток stderr (стандартная ошибка).

Итак, вы можете видеть, что есть два выходных потока, stdout и stderr, и один входной поток, stdin. Поскольку сообщения об ошибках и нормальный вывод имеют свой собственный канал для передачи их в окно терминала, они могут обрабатываться независимо друг от друга.

Потоки обрабатываются как файлы

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

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

Эти значения всегда используются для stdin, stdout и stderr:

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

Реакция на каналы и перенаправления

Чтобы облегчить кому-то знакомство с предметом, распространенной техникой является преподавание упрощенной версии темы. Например, в грамматике нам говорят, что правило — «I до E, кроме C.» Но на самом деле там больше исключений из этого правила чем есть случаи, которые ему подчиняются.

Аналогичным образом, говоря о stdin, stdout и stderr, удобно использовать общепринятую аксиому о том, что процесс не знает и не заботится о том, где завершаются его три стандартных потока. Должен ли процесс заботиться о том, идет ли его вывод на терминал или перенаправляется в файл? Может ли он даже сказать, идет ли его ввод с клавиатуры или передается в него из другого процесса?

На самом деле процесс знает — или, по крайней мере, может узнать, если решит проверить, — и может соответствующим образом изменить свое поведение, если автор программного обеспечения решил добавить эту функциональность.

Мы можем очень легко увидеть это изменение в поведении. Попробуйте эти две команды:

Stdin stdout что это. 1607530867 705 What Are stdin stdout and stderr on. Stdin stdout что это фото. Stdin stdout что это-1607530867 705 What Are stdin stdout and stderr on. картинка Stdin stdout что это. картинка 1607530867 705 What Are stdin stdout and stderr on

Команда ls ведет себя иначе, если ее вывод (stdout) передается другой команде. Это ls, который переключается на вывод в один столбец, это не преобразование, выполняемое cat. И ls делает то же самое, если его вывод перенаправляется:

Stdin stdout что это. 1607530867 797 What Are stdin stdout and stderr on. Stdin stdout что это фото. Stdin stdout что это-1607530867 797 What Are stdin stdout and stderr on. картинка Stdin stdout что это. картинка 1607530867 797 What Are stdin stdout and stderr oncapture.txt в окне терминала ”width =” 646 ″ height = ”57 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); » onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”>

Перенаправление stdout и stderr

Есть преимущество в том, что сообщения об ошибках доставляются выделенным потоком. Это означает, что мы можем перенаправить вывод команды (stdout) в файл и по-прежнему видеть любые сообщения об ошибках (stderr) в окне терминала. При необходимости вы можете реагировать на ошибки по мере их возникновения. Он также предотвращает заражение сообщений об ошибках файла, в который был перенаправлен стандартный вывод.

Введите следующий текст в редактор и сохраните его в файл с именем error.sh.

Сделайте скрипт исполняемым с помощью этой команды:

Первая строка скрипта выводит текст в окно терминала через поток stdout. Вторая строка пытается получить доступ к несуществующему файлу. Это приведет к появлению сообщения об ошибке, которое доставляется через stderr.

Запустите сценарий с помощью этой команды:

Stdin stdout что это. %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. Stdin stdout что это фото. Stdin stdout что это-%D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. картинка Stdin stdout что это. картинка %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2

Мы видим, что оба потока вывода, stdout и stderr, были отображены в окнах терминала.

Stdin stdout что это. 1609969959 974 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. Stdin stdout что это фото. Stdin stdout что это-1609969959 974 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. картинка Stdin stdout что это. картинка 1609969959 974 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2

Попробуем перенаправить вывод в файл:

Stdin stdout что это. 1609969959 982 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. Stdin stdout что это фото. Stdin stdout что это-1609969959 982 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. картинка Stdin stdout что это. картинка 1609969959 982 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2capture.txt в окне терминала ”width =” 646 ″ height = ”57 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); » onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”>

Сообщение об ошибке, которое доставляется через stderr, по-прежнему отправляется в окно терминала. Мы можем проверить содержимое файла, чтобы увидеть, попал ли вывод stdout в файл.

Вывод из стандартного ввода был перенаправлен в файл, как и ожидалось.

Stdin stdout что это. 1609969959 81 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. Stdin stdout что это фото. Stdin stdout что это-1609969959 81 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. картинка Stdin stdout что это. картинка 1609969959 81 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2

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

Чтобы явно перенаправить stdout, используйте эту инструкцию перенаправления:

Чтобы явно перенаправить stderr, используйте эту инструкцию перенаправления:

Давайте попробуем снова провести наш тест, и на этот раз мы будем использовать 2>:

Stdin stdout что это. 1609969960 38 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. Stdin stdout что это фото. Stdin stdout что это-1609969960 38 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. картинка Stdin stdout что это. картинка 1609969960 38 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2capture.txt в окне терминала ”width =” 646 ″ height = ”57 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); » onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”>

Сообщение об ошибке перенаправляется, а эхо-сообщение stdout отправляется в окно терминала:

Как и ожидалось, сообщение stderr находится в файле capture.txt.

Stdin stdout что это. 1609969960 265 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. Stdin stdout что это фото. Stdin stdout что это-1609969960 265 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. картинка Stdin stdout что это. картинка 1609969960 265 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2

Перенаправление как stdout, так и stderr

Конечно, если мы можем перенаправить либо stdout, либо stderr в файл независимо друг от друга, мы должны иметь возможность перенаправить их обоих одновременно в два разных файла?

Да мы можем. Эта команда направит stdout в файл с именем capture.txt и stderr в файл с именем error.txt.

Stdin stdout что это. 1609969960 886 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. Stdin stdout что это фото. Stdin stdout что это-1609969960 886 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. картинка Stdin stdout что это. картинка 1609969960 886 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2capture.txt 2> error.txt в окне терминала ”width =” 646 ″ height = ”57 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); » onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”>

Поскольку оба потока вывода — стандартный вывод и стандартная ошибка — перенаправляются в файлы, видимый вывод в окно терминала. Мы вернулись в командную строку, как будто ничего не произошло.

Проверим содержимое каждого файла:

Stdin stdout что это. 1609969960 346 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. Stdin stdout что это фото. Stdin stdout что это-1609969960 346 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. картинка Stdin stdout что это. картинка 1609969960 346 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2

Перенаправление stdout и stderr в один файл

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

Мы можем добиться этого с помощью следующей команды:

Давайте разберемся с этим.

./error.sh: Запускает файл сценария error.sh.
> capture.txt: перенаправляет поток стандартного вывода в файл capture.txt. > — это сокращение от 1>.
2> & 1: здесь используется инструкция перенаправления &>. Эта инструкция позволяет вам указать оболочке, чтобы один поток попал в то же место назначения, что и другой поток. В данном случае мы говорим «перенаправить поток 2, stderr, в то же место назначения, куда перенаправляется поток 1, stdout».

Stdin stdout что это. 1609969960 549 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. Stdin stdout что это фото. Stdin stdout что это-1609969960 549 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. картинка Stdin stdout что это. картинка 1609969960 549 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2capture.txt 2 &> 1 в окне терминала ”width =” 646 ″ height = ”57 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); » onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”>

Нет видимого вывода. Это обнадеживает.

Давайте проверим файл capture.txt и посмотрим, что в нем.

Stdin stdout что это. 1609969961 110 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. Stdin stdout что это фото. Stdin stdout что это-1609969961 110 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. картинка Stdin stdout что это. картинка 1609969961 110 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2

И потоки stdout, и потоки stderr были перенаправлены в один файл назначения.

Чтобы вывод потока перенаправлялся и незаметно отбрасывался, направьте вывод в / dev / null.

Обнаружение перенаправления в сценарии

Мы обсудили, как команда может определить, перенаправляется ли какой-либо из потоков, и может соответствующим образом изменить свое поведение. Можем ли мы сделать это в наших собственных сценариях? Да мы можем. И это очень простой метод для понимания и применения.

Введите следующий текст в редактор и сохраните его как input.sh.

Используйте следующую команду, чтобы сделать его исполняемым:

Если stdin подключен к окну терминала, тест подтвердится. Если stdin подключен к файлу или каналу, тест завершится неудачно.

Мы можем использовать любой удобный текстовый файл для генерации входных данных в скрипт. Здесь мы используем файл dummy.txt.

Stdin stdout что это. 1609969961 480 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. Stdin stdout что это фото. Stdin stdout что это-1609969961 480 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. картинка Stdin stdout что это. картинка 1609969961 480 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2

Сценарий распознает, что его ввод передается по конвейеру. Или, точнее, он еще раз распознает, что поток stdin не подключен к окну терминала.

Stdin stdout что это. 1609969962 762 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. Stdin stdout что это фото. Stdin stdout что это-1609969962 762 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. картинка Stdin stdout что это. картинка 1609969962 762 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2

Запустим скрипт без каналов и перенаправлений.

Stdin stdout что это. 1609969962 685 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. Stdin stdout что это фото. Stdin stdout что это-1609969962 685 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. картинка Stdin stdout что это. картинка 1609969962 685 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2

Поток stdin подключен к окну терминала, и сценарий сообщает об этом соответственно.

Чтобы проверить то же самое с выходным потоком, нам нужен новый скрипт. Введите в редактор следующее и сохраните как output.sh.

Используйте следующую команду, чтобы сделать его исполняемым:

Давай попробуем. Мы пропустим вывод через cat.

Stdin stdout что это. 1609969962 730 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. Stdin stdout что это фото. Stdin stdout что это-1609969962 730 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. картинка Stdin stdout что это. картинка 1609969962 730 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2

Сценарий распознает, что его вывод не идет напрямую в окно терминала.

Stdin stdout что это. 1609969962 370 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. Stdin stdout что это фото. Stdin stdout что это-1609969962 370 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. картинка Stdin stdout что это. картинка 1609969962 370 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2

Мы также можем протестировать скрипт, перенаправив вывод в файл.

Stdin stdout что это. 1609969962 687 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. Stdin stdout что это фото. Stdin stdout что это-1609969962 687 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. картинка Stdin stdout что это. картинка 1609969962 687 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2capture.txt в окне терминала» width=»646″ height=»57″ onload=»pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);» onerror=»this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);» />

В окне терминала нет вывода, мы молча возвращаемся в командную строку. Как и следовало ожидать.

Stdin stdout что это. 1609969963 6 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. Stdin stdout что это фото. Stdin stdout что это-1609969963 6 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. картинка Stdin stdout что это. картинка 1609969963 6 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2

Мы можем заглянуть внутрь файла capture.txt, чтобы увидеть, что было захвачено. Для этого используйте следующую команду.

Stdin stdout что это. 1609969963 143 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. Stdin stdout что это фото. Stdin stdout что это-1609969963 143 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. картинка Stdin stdout что это. картинка 1609969963 143 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2

Опять же, простой тест в нашем скрипте обнаруживает, что поток stdout не отправляется непосредственно в окно терминала.

Если мы запустим скрипт без каналов или перенаправлений, он должен обнаружить, что стандартный вывод доставляется непосредственно в окно терминала.

Stdin stdout что это. 1609969963 961 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. Stdin stdout что это фото. Stdin stdout что это-1609969963 961 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. картинка Stdin stdout что это. картинка 1609969963 961 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2

И это именно то, что мы видим.

Stdin stdout что это. 1609969963 468 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. Stdin stdout что это фото. Stdin stdout что это-1609969963 468 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2. картинка Stdin stdout что это. картинка 1609969963 468 %D0%A7%D1%82%D0%BE %D1%82%D0%B0%D0%BA%D0%BE%D0%B5 stdin stdout %D0%B8 stderr %D0%B2

Потоки сознания

Знание того, как определить, подключены ли ваши скрипты к окну терминала, каналу или перенаправляются, позволяет вам соответствующим образом корректировать их поведение.

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

Как это обычно бывает, чем больше знаний, тем больше возможностей.

Источник

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

Stdin stdout что это. . Stdin stdout что это фото. Stdin stdout что это-. картинка Stdin stdout что это. картинка

Потоки объединяют две точки

Потоки данных, как и потоки воды, имеют два конца. У них есть источник и отток. Какую бы команду Linux вы не использовали, она обеспечивает один конец каждого потока. Другой конец определяется оболочкой, которая запустила команду. Этот конец будет связан с окном терминала, подключен к каналу или перенаправлен в файл или другую команду в соответствии с командной строкой, которая запустила команду.

Стандартные потоки Linux

В Linux стандартный ввод — стандартный поток ввода. Это принимает текст в качестве входных данных. Вывод текста из команды в оболочку осуществляется через поток stdout (standard out). Сообщения об ошибках из команды отправляются через поток stderr (стандартная ошибка).

Потоки обрабатываются как файлы

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

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

Реагирование на трубы и перенаправления

Чтобы облегчить чье-то знакомство с предметом, общепринятым методом является обучение упрощенной версии темы. Например, в грамматике нам говорят, что правило «Я до E, кроме C». Но на самом деле, существует больше исключений из этого правила, чем случаев, которые ему подчиняются.

На самом деле, процесс знает — или, по крайней мере, может узнать, выберет ли он проверку — и может соответствующим образом изменить свое поведение, если автор программного обеспечения решил добавить эту функцию.

Мы можем увидеть это изменение в поведении очень легко. Попробуйте эти две команды:

Stdin stdout что это. x39.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.XMbl j ZmP. Stdin stdout что это фото. Stdin stdout что это-x39.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.XMbl j ZmP. картинка Stdin stdout что это. картинка x39.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.XMbl j ZmP

Stdin stdout что это. . Stdin stdout что это фото. Stdin stdout что это-. картинка Stdin stdout что это. картинка

capture.txt в окне терминала» width=»646″ height=»57″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20646%2057’%3E%3C/svg%3E» data-lazy-src=»https://gadgetshelp.com/wp-content/uploads/images/htg/content/uploads/2019/08/x41.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.hyUFiptU3o.png»/>

Stdin stdout что это. . Stdin stdout что это фото. Stdin stdout что это-. картинка Stdin stdout что это. картинка

Перенаправление stdout и stderr

Введите следующий текст в редактор и сохраните его в файл с именем error.sh.

Сделайте скрипт исполняемым с помощью этой команды:

Запустите скрипт с помощью этой команды:

Stdin stdout что это. . Stdin stdout что это фото. Stdin stdout что это-. картинка Stdin stdout что это. картинка

Stdin stdout что это. 2. Stdin stdout что это фото. Stdin stdout что это-2. картинка Stdin stdout что это. картинка 2

Попробуем перенаправить вывод в файл:

capture.txt в окне терминала» width=»646″ height=»57″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20646%2057’%3E%3C/svg%3E» data-lazy-src=»https://gadgetshelp.com/wp-content/uploads/images/htg/content/uploads/2019/08/x3.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.EqpbNlGg0r.png»/>

Stdin stdout что это. . Stdin stdout что это фото. Stdin stdout что это-. картинка Stdin stdout что это. картинка

Вывод из stdin был перенаправлен в файл, как и ожидалось.

Stdin stdout что это. 6. Stdin stdout что это фото. Stdin stdout что это-6. картинка Stdin stdout что это. картинка 6

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

Давайте попробуем провести наш тест еще раз, и на этот раз мы будем использовать 2> :

capture.txt в окне терминала» width=»646″ height=»57″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20646%2057’%3E%3C/svg%3E» data-lazy-src=»https://gadgetshelp.com/wp-content/uploads/images/htg/content/uploads/2019/08/x17.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.JgI_SRjATy.png»/>

Сообщение об ошибке перенаправляется, и echo сообщение stdout отправляется в окно терминала:

capture.txt в окне терминала» width=»646″ height=»97″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20646%2097’%3E%3C/svg%3E» data-lazy-src=»https://gadgetshelp.com/wp-content/uploads/images/htg/content/uploads/2019/08/x18.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.DT9oiWeFHK.png»/>

Давайте посмотрим, что находится в файле capture.txt.

Stdin stdout что это. . Stdin stdout что это фото. Stdin stdout что это-. картинка Stdin stdout что это. картинка

Сообщение stderr находится в capture.txt, как и ожидалось.

Stdin stdout что это. 19. Stdin stdout что это фото. Stdin stdout что это-19. картинка Stdin stdout что это. картинка 19

Перенаправление как stdout, так и stderr

Конечно, если мы можем перенаправить либо stdout либо stderr в файл независимо друг от друга, мы должны быть в состоянии перенаправить их одновременно в два разных файла?

Да мы можем. Эта команда направит стандартный stdout в файл с именем capture.txt, а стандартный stderr — в файл с именем error.txt.

capture.txt 2> error.txt в окне терминала» width=»646″ height=»57″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20646%2057’%3E%3C/svg%3E» data-lazy-src=»https://gadgetshelp.com/wp-content/uploads/images/htg/content/uploads/2019/08/x20.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.tfJGMMFL3p.png»/>

Поскольку оба потока вывода — стандартный вывод и стандартная ошибка — перенаправляются в файлы, в окне терминала отсутствует видимый вывод. Мы возвращаемся к командной строке, как будто ничего не произошло.

Stdin stdout что это. . Stdin stdout что это фото. Stdin stdout что это-. картинка Stdin stdout что это. картинка

Давайте проверим содержимое каждого файла:

Stdin stdout что это. . Stdin stdout что это фото. Stdin stdout что это-. картинка Stdin stdout что это. картинка

Перенаправление stdout и stderr в один файл

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

Мы можем добиться этого с помощью следующей команды:

Давайте разберемся с этим.

capture.txt 2 &> 1 в окне терминала» width=»646″ height=»57″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20646%2057’%3E%3C/svg%3E» data-lazy-src=»https://gadgetshelp.com/wp-content/uploads/images/htg/content/uploads/2019/08/x23.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.E9Im1_c4LS.png»/>

Нет видимого вывода. Это обнадеживает.

Stdin stdout что это. . Stdin stdout что это фото. Stdin stdout что это-. картинка Stdin stdout что это. картинка

Давайте проверим файл capture.txt и посмотрим, что в нем.

Stdin stdout что это. . Stdin stdout что это фото. Stdin stdout что это-. картинка Stdin stdout что это. картинка

Потоки stdout и stderr были перенаправлены в один файл назначения.

Обнаружение перенаправления в скрипте

Мы обсудили, как команда может обнаружить, перенаправлен ли какой-либо из потоков, и может соответствующим образом изменить свое поведение. Можем ли мы сделать это в наших собственных сценариях? Да мы можем. И это очень простая техника для понимания и применения.

Введите следующий текст в редактор и сохраните его как input.sh.

Используйте следующую команду, чтобы сделать его исполняемым:

Если stdin подключен к окну терминала, тест подтвердится. Если stdin подключен к файлу или каналу, тест не пройден.

Мы можем использовать любой удобный текстовый файл для генерации ввода в скрипт. Здесь мы используем файл с именем dummy.txt.

Stdin stdout что это. . Stdin stdout что это фото. Stdin stdout что это-. картинка Stdin stdout что это. картинка

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

Stdin stdout что это. . Stdin stdout что это фото. Stdin stdout что это-. картинка Stdin stdout что это. картинка

Это было с перенаправлением файла, давайте попробуем это с каналом.

Stdin stdout что это. 28. Stdin stdout что это фото. Stdin stdout что это-28. картинка Stdin stdout что это. картинка 28

Сценарий распознает, что его вход передается по каналу. Точнее, он еще раз распознает, что поток stdin не подключен к окну терминала.

Stdin stdout что это. x29.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.yMfYvG UII. Stdin stdout что это фото. Stdin stdout что это-x29.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.yMfYvG UII. картинка Stdin stdout что это. картинка x29.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.yMfYvG UII

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

Stdin stdout что это. . Stdin stdout что это фото. Stdin stdout что это-. картинка Stdin stdout что это. картинка

Поток stdin подключен к окну терминала, и скрипт сообщает об этом соответственно.

Чтобы проверить то же самое с выходным потоком, нам нужен новый скрипт. Введите следующее в редактор и сохраните его как output.sh.

Используйте следующую команду, чтобы сделать его исполняемым:

Stdin stdout что это. . Stdin stdout что это фото. Stdin stdout что это-. картинка Stdin stdout что это. картинка

Скрипт распознает, что его вывод не идет прямо в окно терминала.

Stdin stdout что это. . Stdin stdout что это фото. Stdin stdout что это-. картинка Stdin stdout что это. картинка

Мы также можем протестировать скрипт, перенаправив вывод в файл.

capture.txt в окне терминала» width=»646″ height=»57″ svg+xml,%3Csvg%20xmlns=’http://www.w3.org/2000/svg’%20viewBox=’0%200%20646%2057’%3E%3C/svg%3E» data-lazy-src=»https://gadgetshelp.com/wp-content/uploads/images/htg/content/uploads/2019/08/x34.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.df5fttcFac.png»/>

Нет вывода в окно терминала, мы молча возвращаемся в командную строку. Как и следовало ожидать.

Stdin stdout что это. . Stdin stdout что это фото. Stdin stdout что это-. картинка Stdin stdout что это. картинка

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

Stdin stdout что это. 36. Stdin stdout что это фото. Stdin stdout что это-36. картинка Stdin stdout что это. картинка 36

Опять же, простой тест в нашем скрипте обнаруживает, что поток stdout не отправляется непосредственно в окно терминала.

Если мы запустим скрипт без каких-либо каналов или перенаправлений, он должен обнаружить, что стандартный stdout доставляется непосредственно в окно терминала.

Stdin stdout что это. . Stdin stdout что это фото. Stdin stdout что это-. картинка Stdin stdout что это. картинка

И это именно то, что мы видим.

Stdin stdout что это. 38. Stdin stdout что это фото. Stdin stdout что это-38. картинка Stdin stdout что это. картинка 38

Потоки Сознания

Знание того, как определить, подключены ли ваши скрипты к окну терминала, каналу или перенаправлены, позволяет соответствующим образом настроить их поведение.

Регистрация и диагностический вывод могут быть более или менее подробными, в зависимости от того, идет ли речь об экране или в файл. Сообщения об ошибках могут быть записаны в файл, отличный от нормального вывода программы.

Как обычно, больше знаний приносит больше вариантов.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *