Конвейеры и потоки в Linux
Перенаправление вывода, поток ошибок и связки команд через |.
Перенаправление: > и >>
echo "молоко" > list.txt # перезаписать файл
echo "хлеб" >> list.txt # дописать в конец
sort data.txt > data.txt # ЛОВУШКА: файл очистится
sort -o data.txt data.txt # сортировка на месте — так Файл после > очищается до запуска команды, поэтому перенаправление в тот же файл уничтожает данные: sort уже читает пустоту. Для записи «на место» у sort есть -o.
Потоки ошибок: 2>&1 и /dev/null
cmd > out.log # только stdout, ошибки на экране
cmd > all.log 2>&1 # оба потока в файл
cmd 2>/dev/null # спрятать ошибки
cmd 2>&1 > out.log # ЛОВУШКА: ошибки мимо файла У процесса два выходных потока: stdout (1) и stderr (2). Порядок важен: 2>&1 значит «туда, куда 1 смотрит сейчас», поэтому пишется после > файла, не до.
Конвейер: sort | uniq -c
sort tags.txt | uniq -c | sort -nr
# 3 python
# 2 sql
# 1 linux — частотный словарь тремя командами | соединяет stdout левой команды со stdin правой. uniq схлопывает только соседние повторы, поэтому перед ним обязателен sort — иначе дубли молча останутся.
Подсчёт: wc -l
wc -l app.log # строк в файле
ls | wc -l # записей в каталоге
grep -r "TODO" . | wc -l # пометок в проекте wc -l считает строки, -w слова, -c байты. В конвейере это универсальный финальный шаг «сколько всего» для вывода любой команды.
tee: на экран и в файл разом
./deploy.sh | tee deploy.log # видно и записано
./deploy.sh | tee -a deploy.log # дописывать, не перезаписывать tee дублирует поток: печатает на экран и одновременно пишет в файл. Без -a каждый запуск перезапишет лог предыдущего — для накопления флаг обязателен.
Цепочки: && и ||
mkdir -p build && cd build # cd только при успехе
npm test || echo "тесты упали" # правая часть при провале
cmd1 ; cmd2 # просто подряд, без условий && запускает правую команду только при успехе левой (код возврата 0), || — только при провале. Точка с запятой условий не ставит: выполнится всё подряд.