Pipe, Redirect и Объединение Команд

С возвращением.
В предыдущем уроке ты написал свой первый Bash-скрипт.
Теперь мы изучим одну из самых мощных идей в Linux-терминале:
Объединение команд.
Маленькие команды полезны.
Объединённые команды — мощные.
Именно здесь терминал перестаёт быть списком отдельных инструментов и становится мастерской.
Немного хаотичной мастерской.
Но всё же мастерской.
Что Ты Изучишь
В этом уроке ты научишься:
- передавать output одной команды в другую через pipe;
- сохранять output команд в файлы;
- дописывать output в существующие файлы;
- понимать standard output и standard error;
- объединять команды через
&&,||и;; - использовать
tee; - строить простые workflow.
Миссия
Твоя миссия простая:
Научиться заставлять команды работать вместе.
Потому что одна команда — полезна.
Три команды, соединённые вместе, могут создать впечатление, будто ты тайно работаешь в NASA.
С ноутбуком.
И сомнительным количеством сна.
Что Такое Pipe?
Pipe передаёт output одной команды в другую команду.
Символ pipe:
|
Пример:
ls | wc -l
Это означает:
Покажи файлы, затем посчитай строки.
ls создаёт output.
wc -l считает строки.
Pipe их соединяет.
Очень элегантно.
Очень Linux.
Посчитать Файлы в Папке
Попробуй:
ls
Теперь попробуй:
ls | wc -l
Ты увидишь число.
Это число показывает, сколько строк напечатал ls.
Не всегда идеально для сложных случаев, но хорошо для обучения.
Терминал теперь передаёт информацию как официант, который носит тарелки между командами.
Надеемся, не уронит.
Поиск в Output Команды
Можно передать output в grep.
Попробуй:
ls | grep ".txt"
Это показывает только элементы, которые содержат .txt.
Можно также искать процессы:
ps aux | grep node
Это означает:
Покажи все процессы, затем оставь только строки с
node.
Это очень полезно при debug dev-серверов.
Особенно когда Node.js отказывается уйти, как гость после полуночи.
Сортировка Output
Создай маленький файл:
echo "banana" > fruits.txt
echo "apple" >> fruits.txt
echo "orange" >> fruits.txt
echo "apple" >> fruits.txt
Покажи его:
cat fruits.txt
Теперь отсортируй:
cat fruits.txt | sort
Ты должен увидеть строки в алфавитном порядке.
Удалить Дубликаты
Чтобы удалить соседние дубликаты, используй uniq.
Лучше сначала с sort:
cat fruits.txt | sort | uniq
Это означает:
Напечатай файл, отсортируй строки, удали дубликаты.
Маленькие команды.
Мощный результат.
Как сделать бутерброд, но из текста.
Посчитать Уникальные Значения
Можно добавить wc -l:
cat fruits.txt | sort | uniq | wc -l
Это считает, сколько у тебя уникальных фруктов.
Команда уже выглядит длиннее.
Но она понятна, если видеть поток:
cat -> sort -> uniq -> count
Это магия pipe.
Redirect Output в Файл
Символ > сохраняет output в файл.
Попробуй:
echo "Hello, file!" > output.txt
Теперь прочитай:
cat output.txt
Ты должен увидеть:
Hello, file!
Важно: > перезаписывает файл.
Если файл уже имел содержимое, оно будет заменено.
Linux не говорит:
“Ты уверен?”
Linux говорит:
“Готово.”
Холодно. Эффективно. Немного страшно.
Добавить Output в Файл
Символ >> добавляет output в конец файла.
Попробуй:
echo "First line" > notes.txt
echo "Second line" >> notes.txt
echo "Third line" >> notes.txt
cat notes.txt
Ты должен увидеть:
First line
Second line
Third line
Используй:
>
чтобы заменить.
Используй:
>>
чтобы добавить.
Эта разница важна.
Очень.
Redirect Ошибок
Есть два распространённых потока output:
stdout = нормальный output
stderr = output ошибок
Нормальный output можно перенаправить через:
>
Ошибки можно перенаправить через:
2>
Попробуй:
ls missing-folder 2> error.log
Теперь прочитай файл ошибки:
cat error.log
Ты должен увидеть сохранённое сообщение об ошибке.
Это полезно, когда скрипты создают ошибки и ты хочешь их сохранить.
Потому что иногда ошибки — это не катастрофы.
Это доказательства.
Сохранить Output и Ошибки Вместе
Чтобы сохранить нормальный output и ошибки вместе:
command > output.log 2>&1
Пример:
ls ~/terminal-practice missing-folder > result.log 2>&1
Затем:
cat result.log
Это сохранит и успешный output, и ошибки в одном файле.
Очень полезно для логов.
Очень скучно.
Очень профессионально.
Использование tee
tee позволяет видеть output и сохранять его одновременно.
Попробуй:
echo "Terminal power" | tee message.txt
Ты увидишь текст на экране, и он также будет сохранён в message.txt.
Чтобы добавить через tee, используй:
echo "Another line" | tee -a message.txt
tee полезен, когда хочешь и видеть результат, и иметь лог.
Как сказать:
“Я хочу видеть, что происходит, но ещё хочу квитанции.”
Объединение Команд через ;
Символ ; запускает команды одну за другой.
echo "One"; echo "Two"; echo "Three"
Даже если одна команда упадёт, следующая всё равно запустится.
Пример:
mkdir demo; cd demo; pwd
Это простое объединение команд.
Полезное.
Но не всегда безопасное.
Объединение Команд через &&
Символ && запускает следующую команду только если предыдущая завершилась успешно.
Пример:
mkdir safe-demo && cd safe-demo && pwd
Это означает:
Создай папку. Если получилось, зайди в неё. Если получилось, покажи место.
Это безопаснее, чем ;.
Если что-то не сработает, цепочка остановится.
Очень полезно для скриптов и setup-команд.
Меньше драмы.
Больше контроля.
Объединение Команд через ||
Символ || запускает следующую команду только если предыдущая завершилась с ошибкой.
Пример:
mkdir safe-demo || echo "Folder already exists or could not be created."
Другой пример:
ping -c 1 example.com || echo "Network problem."
Это полезно для fallback-сообщений.
Терминал говорит:
“Если это не сработает, сделай то.”
Очень практично.
Очень по-взрослому.
Объединить Всё
Вот маленький workflow:
ps aux | grep node > node-processes.txt
cat node-processes.txt
Это находит Node.js процессы и сохраняет их в файл.
Другой пример:
ls -la | tee files.log | grep ".txt"
Это означает:
Покажи файлы с деталями, сохрани полный output в
files.log, и также покажи только.txtстроки.
Теперь мы готовим.
Терминально.
Без сковородки.
Только pipe.
Частые Ошибки
Случайно перезаписать файл
Это перезаписывает:
echo "new text" > notes.txt
Это добавляет:
echo "new text" >> notes.txt
Перед использованием > подумай.
Твои файлы заслуживают хотя бы одну секунду уважения.
Забыть, что pipe передаёт output, а не файлы
Это работает:
cat fruits.txt | sort
Но многие команды могут читать файлы напрямую:
sort fruits.txt
Pipe мощные, но не используй их только чтобы выглядеть круто.
Терминал знает, когда ты притворяешься.
grep находит сам себя
Когда ты запускаешь:
ps aux | grep node
можешь увидеть также команду grep node.
Это нормально.
Можно избежать так:
ps aux | grep "[n]ode"
Маленький трюк.
Linux-пользователи любят маленькие трюки.
Иногда слишком.
Практика
Попробуй:
cd ~/terminal-practice
echo "banana" > fruits.txt
echo "apple" >> fruits.txt
echo "orange" >> fruits.txt
echo "apple" >> fruits.txt
cat fruits.txt
cat fruits.txt | sort
cat fruits.txt | sort | uniq
cat fruits.txt | sort | uniq | wc -l
echo "Saved output" > saved.txt
echo "Appended output" >> saved.txt
cat saved.txt
ls missing-folder 2> error.log
cat error.log
Затем ответь:
- Что делает
|? - Что делает
>? - Что делает
>>? - Что делает
2>? - Что делает
&&? - Что делает
||?
Мини-Задание
Создай файл animals.txt с такими строками:
cat
dog
bird
cat
dog
elephant
Затем используй команды, чтобы:
- Отсортировать файл.
- Удалить дубликаты.
- Посчитать уникальных животных.
- Сохранить отсортированный уникальный список в
unique-animals.txt. - Показать результат на экране и сохранить его одновременно через
tee.
Без мышки.
Мышка завершила курс как наблюдатель.
Итог
Сегодня ты узнал, что:
- pipe передаёт output одной команды в другую;
>сохраняет output и перезаписывает файлы;>>добавляет output;2>перенаправляет ошибки;2>&1объединяет нормальный output и ошибки;teeпоказывает output и сохраняет его;;запускает команды одну за другой;&&запускает следующую команду только после успеха предыдущей;||запускает следующую команду только после ошибки предыдущей;- маленькие команды могут стать мощными workflow, если их объединить.
Это одна из самых глубоких идей Linux-терминала.
Делай одну вещь хорошо.
Потом соединяй эти вещи.
Это философия Unix в действии.
Курс Завершён
Поздравляю.
Ты завершил Курс по Терминалу Linux.
Ты начал с загадочного чёрного окна.
Теперь ты умеешь:
- перемещаться по файловой системе;
- управлять файлами и папками;
- читать и искать файлы;
- понимать права доступа;
- устанавливать программы;
- мониторить процессы;
- проверять сеть;
- работать с архивами;
- использовать переменные и alias;
- писать Bash-скрипты;
- объединять команды в workflow.
Терминал больше не монстр.
Это инструмент.
Острый инструмент.
Мощный инструмент.
Инструмент, который всё ещё заслуживает уважения.
Теперь практикуйся.
Осторожно.
И, возможно, сначала сделай backup.