6.1 Стандартные потоки
В Linux каждый процесс имеет три стандартных потока для ввода и вывода данных.
stdin (0) — стандартный ввод
Поток для чтения данных. По умолчанию это клавиатура.
cat # читает из stdin (клавиатура)
# Нажмите Ctrl+D для завершения ввода
stdout (1) — стандартный вывод
Поток для вывода обычных данных. По умолчанию это экран терминала.
echo "Hello World" # выводит в stdout
ls # выводит список файлов в stdout
stderr (2) — стандартный поток ошибок
Поток для вывода сообщений об ошибках. По умолчанию это тоже экран терминала.
ls nonexistent_file # ошибка выводится в stderr
# ls: cannot access 'nonexistent_file': No such file or directory
Разделение потоков
Важно понимать: stdout и stderr — это разные потоки. Это позволяет обрабатывать обычный вывод и ошибки отдельно.
# Команда выводит и обычные данные, и ошибки
ls existing_file nonexistent_file
# existing_file ← stdout
# ls: cannot access... ← stderr
6.2 Перенаправление вывода
Перенаправление позволяет отправлять вывод команд в файлы или другие программы.
Перенаправление stdout
echo "Hello" > file.txt # записать в файл (перезаписать)
echo "World" >> file.txt # добавить в файл
ls > files.txt # сохранить список файлов
Перенаправление stderr
ls nonexistent 2> error.log # перенаправить ошибки в файл
ls existing 2> error.log # ошибок нет, файл останется пустым
Перенаправление обоих потоков
ls existing nonexistent > output.log 2>&1
# Перенаправить и stdout, и stderr в один файл
ls existing nonexistent &> output.log
# Сокращенная запись (bash)
Отбрасывание вывода
ls > /dev/null # отбросить stdout
ls 2> /dev/null # отбросить stderr
ls > /dev/null 2>&1 # отбросить все
/dev/null — это специальный файл, который "поглощает" все данные. Полезен для подавления нежелательного вывода.
6.3 Перенаправление ввода
Перенаправление ввода позволяет читать данные из файла вместо клавиатуры.
Перенаправление stdin
cat < file.txt # читать из файла
sort < unsorted.txt # сортировать файл
wc -l < file.txt # подсчитать строки в файле
Heredoc — многострочный ввод
cat << EOF
Строка 1
Строка 2
Строка 3
EOF
# Создает временный файл с содержимым между EOF
Here-string — ввод из переменной
text="Hello World"
wc -w <<< "$text" # подсчитать слова в переменной
Практические примеры
# Отправить письмо из файла
mail user@example.com < message.txt
# Создать архив из списка файлов
tar -czf archive.tar.gz -T filelist.txt
# Выполнить команды из файла
bash < script.sh
6.4 Конвейеры (Pipes)
Конвейер (|) передает stdout одной команды в stdin другой команды. Это основа мощных командных конструкций.
Базовое использование
ls -la | grep "txt" # найти файлы .txt
ps aux | grep firefox # найти процессы firefox
cat file.txt | sort # отсортировать файл
Цепочки команд
ls -la | grep "txt" | wc -l # подсчитать .txt файлы
ps aux | grep firefox | awk '{print $2}' # получить PID firefox
cat log.txt | grep ERROR | sort | uniq # уникальные ошибки
Полезные команды для конвейеров
grep — поиск текста
ps aux | grep python # найти процессы python
ls -la | grep -v "txt" # исключить .txt файлы
cat file.txt | grep -i error # поиск без учета регистра
sort — сортировка
ls -la | sort -k5 -nr # сортировать по размеру (убывание)
cat names.txt | sort # отсортировать имена
uniq — удаление дубликатов
cat file.txt | sort | uniq # уникальные строки
cat file.txt | sort | uniq -c # с подсчетом
head и tail — начало и конец
ls -la | head -10 # первые 10 файлов
ps aux | tail -5 # последние 5 процессов
Сложные примеры
# Найти 5 самых больших файлов
find /home -type f -exec ls -la {} \; | sort -k5 -nr | head -5
# Мониторинг логов в реальном времени
tail -f /var/log/syslog | grep ERROR
# Статистика использования команд
history | awk '{print $2}' | sort | uniq -c | sort -nr | head -10
Обратите внимание: stderr не передается через конвейер. Для передачи ошибок используйте
2>&1
.