stdin (стандартный ввод)
100%

Text-Fu · Урок 2

stdin (стандартный ввод)

Узнайте, как программы читают стандартный ввод и как Bash подключает этот поток к файлу.

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

Стандартный ввод и файловый дескриптор 0

По соглашению три стандартных потока используют следующие номера файловых дескрипторов:

  • 0: стандартный ввод (stdin)
  • 1: стандартный вывод (stdout)
  • 2: стандартный поток ошибок (stderr)

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

Какой файловый дескриптор по соглашению обозначает стандартный ввод?

Перенаправление файла в stdin

Оператор < указывает Bash открыть файл для чтения и подключить его к stdin команды:

$ cat < peanuts.txt
Hello World

Оболочка обрабатывает < peanuts.txt, а cat просто читает файловый дескриптор 0. Путь не передаётся cat как обычный файловый операнд.

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

Какая команда заставляет sort читать стандартный ввод из names.txt?

Файловый операнд и перенаправление ввода

Некоторые команды принимают как имя файла, так и stdin, но результаты могут немного различаться. Например:

$ wc -l peanuts.txt
1 peanuts.txt
$ wc -l < peanuts.txt
1

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

Почему wc -l < peanuts.txt обычно не выводит peanuts.txt?

Сочетание перенаправлений ввода и вывода

В одной командной строке можно перенаправить несколько потоков:

$ cat < peanuts.txt > banana.txt

Оболочка создаёт два независимых соединения:

  1. < peanuts.txt открывает peanuts.txt как stdin команды cat.
  2. > banana.txt создаёт или усекает banana.txt и подключает его к stdout команды cat.

cat читает байты из stdin и записывает их в stdout, поэтому banana.txt получает содержимое исходного файла. Для обычного копирования файлов команда cp peanuts.txt banana.txt яснее выражает намерение; данный пример иллюстрирует соединения потоков.

Какой файл в cat < input.txt > output.txt предоставляет stdin, а какой получает stdout?

Чтобы попрактиковаться в перенаправлении ввода и вывода, выполните лабораторные работы:

  1. Перенаправление ввода и вывода в Linux — потренируйтесь управлять потоками данных команд, перенаправляя стандартный вывод (stdout), стандартный поток ошибок (stderr) и стандартный ввод (stdin) с помощью операторов >, >>, 2> и команды tee.
  2. Перенаправление потоков данных — научитесь управлять стандартными потоками ввода, вывода и ошибок, объединять вывод и использовать /dev/null для более сложных операций с файлами.

Урок завершён

Вы завершили stdin (стандартный ввод)

Теперь вы можете подключать стандартный ввод команды к файлу средствами оболочки.

  • Распознавайте stdin как файловый дескриптор 0.

  • Перенаправляйте доступный для чтения файл с помощью <.

  • Отличайте файловый операнд от перенаправленного ввода.

  • Осознанно сочетайте перенаправления stdin и stdout.

Сохраните прогресс

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

Создать бесплатный аккаунт
Следующий Урок
Назад к Text-Fu