← К оглавлению урока

📖 Теория — Занятие 04

⚡ Суть потоков и перенаправлений

stdin (0)Ввод: клавиатура или другая команда
stdout (1)Вывод: на экран или в файл
stderr (2)Ошибки: на экран или в файл
>Вывод в файл (ПЕРЕЗАПИСЬ)
>>Вывод в файл (ДОЗАПИСЬ)
<Ввод из файла
2>&1Ошибки → туда же, куда stdout
|Pipe: вывод левой → ввод правой
Главная ловушка: > ПЕРЕЗАПИСЫВАЕТ файл. Используйте >> для дозаписи.

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

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

ДескрипторИмяНазначениеПо умолчанию
0 stdin (standard input) Поток ввода: откуда программа принимает данные Клавиатура
1 stdout (standard output) Поток вывода: куда программа пишет результат Экран терминала
2 stderr (standard error) Поток ошибок: сообщения об ошибках Экран терминала
Дескриптор — ключевое слово, характеризующее блок информации. Числа 0, 1, 2 — это «ярлыки» для потоков.

Как обрабатывается команда date

Когда вы вводите date в терминале:

  1. Разбор команды: оболочка разбирает строку на имя (date) и аргументы (их нет).
  2. Поиск команды: оболочка ищет исполняемый файл в директориях из переменной PATH.
  3. Выполнение: создаётся новый процесс, внутри него запускается файл date.
  4. Вывод результата: команда пишет текущую дату/время в stdout — он отображается в терминале.
  5. Завершение процесса: управление возвращается оболочке.

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

Перенаправление изменяет, куда идут данные потоков. Используются символы > и <.

Запись в файл: >

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 команды в файл