Back to: Потоки: stdin, stdout, stderr, pipe
Потоки: stdin, stdout, stderr, pipe
В Linux каждый процесс имеет три стандартных потока данных. Понимание того, как их перенаправлять и соединять, — ключ к эффективной работе в командной строке.
Три стандартных потока
- stdin (0) — стандартный ввод (по умолчанию клавиатура)
- stdout (1) — стандартный вывод (по умолчанию экран)
- stderr (2) — стандартный вывод ошибок (по умолчанию экран)
Перенаправление вывода (stdout)
# Перезаписать файл
echo "Hello" > file.txt
# Дописать в файл
echo "World" >> file.txt
# Перенаправить stdout явно
ls -la 1> output.txt
Перенаправление ошибок (stderr)
# Только ошибки в файл
ls /nonexistent 2> errors.txt
# Отбросить ошибки
ls /nonexistent 2> /dev/null
# stdout и stderr в разные файлы
ls /home /nonexistent 1> output.txt 2> errors.txt
# stdout и stderr в один файл
ls /home /nonexistent > all.txt 2>&1
# То же самое, современный синтаксис
ls /home /nonexistent &> all.txt
Перенаправление ввода (stdin)
# Чтение из файла
sort < unsorted.txt
# Здесь-документ (heredoc)
cat << EOF
Строка 1
Строка 2
EOF
# Здесь-строка
grep "pattern" <<< "search in this string"
Конвейер (pipe)
Конвейер | передаёт stdout одной команды на stdin следующей.
# Найдённые файлы посчитать
find /etc -name "*.conf" | wc -l
# Отсортировать и убрать дубликаты
cat names.txt | sort | uniq
# Многоступенчатый конвейер
ps aux | grep nginx | grep -v grep | awk "{print $2}"
tee — вывод в обе стороны
Команда tee записывает ввод в файл И одновременно выводит на stdout.
# Вывод и в файл, и на экран
ls -la | tee output.txt
# Дописать в файл
ls -la | tee -a output.txt
# tee с sudo для записи в защищённый файл
echo "config" | sudo tee /etc/myapp.conf
xargs — преобразование stdin в аргументы
Команда xargs берёт stdin и передаёт как аргументы другой команде.
# Удалить все найдённые .tmp файлы
find /tmp -name "*.tmp" | xargs rm -f
# Каждый элемент как отдельный аргумент (-I)
find . -name "*.log" | xargs -I {} cp {} /backup/
# Ограничить количество аргументов
echo "1 2 3 4 5" | xargs -n 2 echo
Практическое задание
- Создайте файл:
echo "test output" > out.txt - Допишите строку:
echo "second line" >> out.txt - Выполните
ls /home /nonexistent 2>err.txt >ok.txtи проверьте оба файла - Используйте конвейер:
cat /etc/passwd | grep bash | wc -l - Сохраните вывод и покажите на экран:
ls -la /etc | tee files.txt | head -5 - Найдите и удалите:
find /tmp -name "*.tmp" | xargs rm -f


Добавить комментарий