Стандартный ввод, сокращённо stdin, — это поток, из которого программа обычно читает входящие данные. В интерактивном терминале оболочка, как правило, подключает stdin к вводу терминала, поэтому программа может читать набираемый вами текст.
Text-Fu · Урок 2
stdin (стандартный ввод)
Узнайте, как программы читают стандартный ввод и как Bash подключает этот поток к файлу.
Стандартный ввод и файловый дескриптор 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
Оболочка создаёт два независимых соединения:
< peanuts.txtоткрываетpeanuts.txtкак stdin командыcat.> banana.txtсоздаёт или усекаетbanana.txtи подключает его к stdout командыcat.
cat читает байты из stdin и записывает их в stdout, поэтому banana.txt получает содержимое исходного файла. Для обычного копирования файлов команда cp peanuts.txt banana.txt яснее выражает намерение; данный пример иллюстрирует соединения потоков.
Какой файл в cat < input.txt > output.txt предоставляет stdin, а какой получает stdout?
Чтобы попрактиковаться в перенаправлении ввода и вывода, выполните лабораторные работы:
- Перенаправление ввода и вывода в Linux — потренируйтесь управлять потоками данных команд, перенаправляя стандартный вывод (stdout), стандартный поток ошибок (stderr) и стандартный ввод (stdin) с помощью операторов
>,>>,2>и командыtee. - Перенаправление потоков данных — научитесь управлять стандартными потоками ввода, вывода и ошибок, объединять вывод и использовать
/dev/nullдля более сложных операций с файлами.
Урок завершён
Вы завершили stdin (стандартный ввод)
Теперь вы можете подключать стандартный ввод команды к файлу средствами оболочки.
Распознавайте stdin как файловый дескриптор 0.
Перенаправляйте доступный для чтения файл с помощью
<.Отличайте файловый операнд от перенаправленного ввода.
Осознанно сочетайте перенаправления stdin и stdout.
Сохраните прогресс
Создайте бесплатный аккаунт, чтобы сохранить этот урок и продолжить на любом устройстве.
Создать бесплатный аккаунт