Потоки: stdin, stdout, stderr, pipe

Потоки: stdin, stdout, stderr, pipe

Изображение записи по умолчанию
0

Потоки: 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

Практическое задание

  1. Создайте файл: echo "test output" > out.txt
  2. Допишите строку: echo "second line" >> out.txt
  3. Выполните ls /home /nonexistent 2>err.txt >ok.txt и проверьте оба файла
  4. Используйте конвейер: cat /etc/passwd | grep bash | wc -l
  5. Сохраните вывод и покажите на экран: ls -la /etc | tee files.txt | head -5
  6. Найдите и удалите: find /tmp -name "*.tmp" | xargs rm -f

Comments

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Related Post