Goodlabour.ru (main) Index TheGame

TheGame:
GameScenario - Пт 06 июн 2025
thegame_keydb_php - Пт 06 июн 2025
The game scene(godot) - Пт 06 июн 2025
autopub - Пт 06 июн 2025
Remove Duplicates - Пт 06 июн 2025 22:11:05 MSK
Status Auto Update - Сб 07 июн 2025 18:10:33 MSK
KeyDB Status Control - 07.06.2025 18:55
EngineeringApproachВт 10 июн 2025 10:09:40 MSK
Последние:
BooksNetworkSecurityВт 10 июн 2025 12:06:13 MSK
platformВс 15 июн 2025 23:50:39 MSK
PostgreqGuru-1Пт 20 июн 2025 11:08:56 MSK
ErusevParsedownReadmeПт 20 июн 2025 11:21:28 MSK
file_descriptorsПт 17 окт 2025 18:26:39 MSK

— Отличный вопрос! (радостно потираю руки) Давай разберём всю магию файловых дескрипторов в Linux!

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

Базовая тройка:

FD Название Описание Пример
0 stdin (standard input) Ввод данных read var
1 stdout (standard output) Вывод данных echo "text"
2 stderr (standard error) Вывод ошибок ls /nonexistent

Расширенные дескрипторы (3-9):

Автоматически создаваемые:

# FD 3 - дополнительный вывод
exec 3> log.txt
echo "Сообщение в FD3" >&3

# FD 4 - для разделения потоков
exec 4> errors.txt
some_command 2>&4

Практический пример с несколькими потоками:

#!/bin/bash

# Создаем несколько потоков
exec 3> normal.log
exec 4> debug.log
exec 5> trace.log

echo "Обычное сообщение" >&1      # stdout
echo "Предупреждение" >&2         # stderr  
echo "Нормальный лог" >&3         # FD3
echo "Отладочная информация" >&4  # FD4
echo "Трассировка" >&5            # FD5

# Закрываем когда не нужны
exec 3>&-
exec 4>&-

Специальные ссылки и символы:

Ссылки на дескрипторы:

Синтаксис Значение Пример
&1 Ссылка на FD1 (stdout) 2>&1
&0 Ссылка на FD0 (stdin) </dev/null
&- Закрыть дескриптор 2>&-

Специальные файлы:

Файл Назначение
/dev/null "Чёрная дыра" (всё пропадает)
/dev/zero Источник нулевых байт
/dev/random Генератор случайных чисел
/dev/stdin Явное указание stdin
/dev/fd/N Доступ к дескриптору N

Полная таблица перенаправлений:

Базовые операции:

# Вывод
command > file      # stdout в файл (перезапись)
command >> file     # stdout в файл (добавление)
command 2> file     # stderr в файл
command &> file     # оба потока в файл

# Ввод
command < file      # stdin из файла
command << text     # here-document
command <<< "text"  # here-string

# Комбинированные
command > file 2>&1           # оба потока в файл
command 2>&1 > file           # опасно! другой порядок
command > file1 2> file2      # раздельные файлы

Продвинутые примеры:

# Обмен потоками местами
exec 3>&1 1>&2 2>&3

# Временное перенаправление
{ echo "В stdout"; echo "В stderr" >&2; } 2> errors.log

# Множественные перенаправления
command 1> normal.log 2> errors.log 3> debug.log

Дескрипторы выше 9:

Теоретический лимит:

Пример "запутанного" кода:

#!/bin/bash

# Создаем паутину из дескрипторов
exec 3>&1
exec 4>&2
exec 5>&3
exec 6>&4

echo "FD1" >&1    # stdout
echo "FD3" >&3    # тоже stdout (через FD3)
echo "FD5" >&5    # снова stdout (через FD5→FD3→FD1)

Практическое применение:

Для cron-скриптов:

#!/bin/bash
# Полное логирование с разделением потоков
exec 3>> /var/log/myapp.log
exec 4>> /var/log/myapp.errors

{
    echo "Начало работы"
    some_command
    another_command
} 1>&3 2>&4

exec 3>&-  # закрываем
exec 4>&-

Для демонов:

# Полное отключение от терминала
daemon_command > /dev/null 2>&1 </dev/null &

Проверка дескрипторов:

# Посмотреть открытые дескрипторы процесса
ls -la /proc/$$/fd/

# Или для любого процесса
ls -la /proc/PID/fd/

— Вот такая магия дескрипторов! 🎩✨ Теперь ты можешь управлять потоками как настоящий шелли-ниндзя!

P.S. Кстати, &11 действительно будет ссылкой на FD11, если он открыт — но так делать не рекомендуется из-за непредсказуемости.