Что такое stdin linux

Содержание
  1. Что такое stdin linux
  2. Фундаментальные основы Linux. Часть IV. Программные каналы и команды
  3. Глава 16. Перенаправление потоков ввода/вывода
  4. Потоки данных stdin, stdout и stderr
  5. Перенаправление стандартного потока вывода
  6. Перенаправление стандартного потока ошибок
  7. Перенаправление стандартного потока вывода и программные каналы
  8. Объединение стандартных потоков вывода stdout и ошибок stderr
  9. Перенаправление стандартного потока ввода
  10. Неоднозначное перенаправление потоков ввода/вывода
  11. Быстрая очистка содержимого файла
  12. Практическое задание: перенаправление потоков ввода/вывода
  13. Корректная процедура выполнения практического задания: перенаправление потоков ввода/вывода
  14. Что такое stdin, stdout и stderr в Linux?
  15. Потоки объединяются в две точки
  16. Стандартные потоки Linux
  17. Потоки обрабатываются как файлы
  18. Реакция на каналы и перенаправления
  19. Перенаправление stdout и stderr
  20. Перенаправление как stdout, так и stderr
  21. Перенаправление stdout и stderr в один и тот же файл
  22. Обнаружение перенаправления в сценарии
  23. Потоки сознания

Что такое stdin linux

Поток ввода называется «стандартным вводом (standard input)»; поток вывода называется «стандартным выводом (standard output)»; а поток сообщений об ошибках называется «стандартными ошибками (standard error)». Эти термины были сокращены для названий файлов, на которые указывают ссылки, а именно: stdin stdout и stderr

Каждый из этих терминов является макросом stdio(3), указывающим на FILE; возможно их использование с такими функциями, как fprintf(3) или fread(3).

Переменные типа FILE являются буферизируемыми оболочками описателей файлов Unix. Доступ к этим файлам можно осуществить также при помощи низкоуровнего интерфейса для работы с файлами и с использованием таких функций, как read(2) и lseek(2). Целые описатели файлов, ассоциированных с потоками stdin stdout и stderr будут соответственно равны 0, 1 и 2. Константы STDIN_FILENO, STDOUT_FILENO и STDERR_FILENO определены этими значениями в .

Заметьте, что совместное использование FILE и описателей низкого уровня может привести к непредвиденным последствиям, этого следует избегать при любом удобном случае. Для «мазохистов»: POSIX.1, раздел 8.2.3, детально описывает, как определяется такая совместная работа. Общее правило гласит, что описатели поддерживаются ядром, а stdio всего лишь библиотека. Это означает, например, что после выполнения операции дочерний процесс наследует все описатели открытых файлов, но все старые потоки становятся недоступными.

Так как stdin stdout и stderr определены как макросы, то наследовать их нельзя. Стандартные потоки могут ссылаться на другие файлы при помощи библиотечной функции freopen(3), специально разработанной для возможности наследования stdin stdout и stderr Стандартные потоки можно закрыть вызовом exit(3) и при обычном завершении программы.

Источник

Фундаментальные основы Linux. Часть IV. Программные каналы и команды

Оригинал: Linux Fundamentals
Автор: Paul Cobbaut
Дата публикации: 16 октября 2014 г.
Перевод: А.Панин
Дата перевода: 15 декабря 2014 г.

Глава 16. Перенаправление потоков ввода/вывода

Одной из мощных возможностей командной оболочки системы Unix является механизм перенаправления потоков ввода/вывода с возможностью задействования программных каналов .

В данной главе даются пояснения относительно перенаправления стандартных потоков ввода, вывода и ошибок.

Потоки данных stdin, stdout и stderr

Командная оболочка bash поддерживает три типа базовых потоков данных; она принимает данные из стандартного потока ввода stdin (поток 0 ), отправляет данные в стандартный поток вывода stdout (поток 1 ), а также отправляет сообщения об ошибках в стандартный поток ошибок stderr (поток 2 ).

Приведенная ниже иллюстрация является графической интерпретацией этих трех потоков данных.

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

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

Перенаправление стандартного потока вывода

Операция перенаправления потока данных stdout (>)

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

командная оболочка будет рассматривать только два аргумента (echo = аргумент 0, привет = аргумент 1). Описание операции перенаправления потока данных удаляется перед началом подсчета количества аргументов.

Содержимое выходного файла удаляется

Читайте также:  Block install programs windows

Параметр командной оболочки noclobber

Нейтрализация влияния параметра командной оболочки noclobber

Перенаправление стандартного потока ошибок

Операция перенаправления потока данных stderr (2>)

Перенаправление стандартного потока ошибок осуществляется с помощью оператора 2> . Такое перенаправление может оказаться очень полезным для предотвращения заполнения вашего экрана сообщениями об ошибках.

Операция перенаправления нескольких потоков данных 2>&1

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

Перенаправление стандартного потока вывода и программные каналы

Объединение стандартных потоков вывода stdout и ошибок stderr

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

Операция перенаправления потока данных stdin ( стандартного потока ввода stdin осуществляется с помощью оператора here document (иногда называемая структурой here-is-document) является механизмом для ввода данных до момента обнаружения определенной последовательности символов (обычно EOF). Маркер EOF может быть либо введен вручную, либо вставлен автоматически при нажатии комбинации клавиш Ctrl-D.

Структура here string может использоваться для непосредственной передачи строк команде. При использовании данной структуры достигается такой же эффект, как и при использовании команды echo строка | команда (но вы сможете избежать создания одного дополнительного процесса).

Для получения дополнительной информации об алгоритме base64 следует обратиться к стандарту rfc 3548.

Неоднозначное перенаправление потоков ввода/вывода

Быстрая очистка содержимого файла

Практическое задание: перенаправление потоков ввода/вывода

1. Активируйте параметр командной оболочки noclobber .

2. Проверьте, активирован ли параметр noclobber , повторив вызов команды вывода содержимого директории ls для директории /etc с перенаправлением данных из стандартного потока вывода в файл.

3. Какой из символов представляет параметр noclobber в списке всех параметров командной оболочки.

4. Деактивируйте параметр noclobber .

5. Убедитесь в том, что вы имеете доступ к двум командным оболочкам, открытым на одном компьютере. Создайте пустой файл tailing.txt . После этого выполните команду tail -f tailing.txt . Используйте вторую командную оболочку для добавления строки текста в этот файл. Убедитесь в том, что эта строка была выведена в первой командной оболочке.

6. Создайте файл, содержащий имена пяти людей. Используйте команду cat и механизм перенаправления потоков ввода/вывода для создания файла, а также структуру here document для завершения ввода.

Корректная процедура выполнения практического задания: перенаправление потоков ввода/вывода

1. Активируйте параметр командной оболочки noclobber .

2. Проверьте, активирован ли параметр noclobber , повторив вызов команды вывода содержимого директории ls для директории /etc с перенаправлением данных из стандартного потока вывода в файл.

3. Какой из символов представляет параметр noclobber в списке всех параметров командной оболочки.

4. Деактивируйте параметр noclobber .

5. Убедитесь в том, что вы имеете доступ к двум командным оболочкам, открытым на одном компьютере. Создайте пустой файл tailing.txt . После этого выполните команду tail -f tailing.txt . Используйте вторую командную оболочку для добавления строки текста в этот файл. Убедитесь в том, что эта строка была выведена в первой командной оболочке.

6. Создайте файл, содержащий имена пяти людей. Используйте команду cat и механизм перенаправления потоков ввода/вывода для создания файла, а также структуру here document для завершения ввода.

Источник

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

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

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

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

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

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

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

Читайте также:  Updating bios from linux

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также:  Forza horizon 4 лицензия не запускается windows 10

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Самое интересное — это тест в квадратных скобках. В -t Параметр (терминал) возвращает истину (0), если файл, связанный с файловым дескриптором, завершается в окне терминала. Мы использовали файловый дескриптор 0 в качестве аргумента теста, который представляет stdin .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Оцените статью