Перенаправление вывода, поток ошибок и связки команд через |.
Перенаправление: > и >>
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), || — только при провале. Точка с запятой условий не ставит: выполнится всё подряд.