Стандартные потоки ввода/вывода
Каждый процесс в Linux работает с тремя стандартными потоками данных. Потоки идентифицируются числами — дескрипторами.
| Дескриптор | Имя | Назначение | По умолчанию |
|---|---|---|---|
| 0 | stdin (standard input) | Поток ввода: откуда программа принимает данные | Клавиатура |
| 1 | stdout (standard output) | Поток вывода: куда программа пишет результат | Экран терминала |
| 2 | stderr (standard error) | Поток ошибок: сообщения об ошибках | Экран терминала |
Как обрабатывается команда date
Когда вы вводите date в терминале:
- Разбор команды: оболочка разбирает строку на имя (
date) и аргументы (их нет). - Поиск команды: оболочка ищет исполняемый файл в директориях из переменной
PATH. - Выполнение: создаётся новый процесс, внутри него запускается файл
date. - Вывод результата: команда пишет текущую дату/время в
stdout— он отображается в терминале. - Завершение процесса: управление возвращается оболочке.
Перенаправление
Перенаправление изменяет, куда идут данные потоков. Используются символы > и <.
Запись в файл: >
date > current_date.txt
Вывод команды date записывается в файл current_date.txt. Если файл существует — он ПЕРЕЗАПИСЫВАЕТСЯ.
Дозапись в файл: >>
date >> current_date.txt
Вывод добавляется в конец файла. Если файла нет — создаётся. Старое содержимое сохраняется.
> vs >>!> — перезапись (старые данные уничтожаются).>> — дозапись (старые данные сохраняются).В ДЗ часто нужна именно
>>. Используете > — потеряете данные.
Ввод из файла: <
cat < current_date.txt
Содержимое файла подаётся на stdin команды cat. Результат тот же, что cat current_date.txt, но явно задаёт источник ввода.
Комбинированное перенаправление
cat < current_date.txt > output.txt
Читаем из файла (stdin) и записываем в другой файл (stdout).
Перенаправление ошибок: 2>&1
command > output.txt 2>&1
2>&1 означает: поток 2 (stderr) перенаправить туда же, куда поток 1 (stdout). В результате и вывод, и ошибки попадают в output.txt.
Piping (конвейер)
Pipe (|) передаёт stdout одной команды как stdin следующей. Данные текут без сохранения на диске.
команда1 | команда2 | команда3
Пример: посчитать строки в файле:
cat /etc/group | wc -l
cat читает файл → выводит в stdout → pipe передаёт stdout в stdin wc → wc -l считает строки.
Практические примеры piping из лекции
| Команда | Что делает |
|---|---|
cat /etc/group | Вывести весь файл /etc/group |
cat /etc/group | wc -l | Посчитать количество строк в файле |
echo "Hello world" | Вывести текст в stdout |
cat /etc/group | head | Первые 10 строк файла |
cat /etc/group | tail | Последние 10 строк файла |
history | tail -3 | Последние 3 команды из истории |
history | tail -3 >> /tmp/file | Дозаписать 3 команды в файл |