← Back to course

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

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

С возвращением.

В предыдущем уроке ты написал свой первый Bash-скрипт.

Теперь мы изучим одну из самых мощных идей в Linux-терминале:

Объединение команд.

Маленькие команды полезны.

Объединённые команды — мощные.

Именно здесь терминал перестаёт быть списком отдельных инструментов и становится мастерской.

Немного хаотичной мастерской.

Но всё же мастерской.

Что Ты Изучишь

В этом уроке ты научишься:

Миссия

Твоя миссия простая:

Научиться заставлять команды работать вместе.

Потому что одна команда — полезна.

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

Затем ответь:

  1. Что делает |?
  2. Что делает >?
  3. Что делает >>?
  4. Что делает 2>?
  5. Что делает &&?
  6. Что делает ||?

Мини-Задание

Создай файл animals.txt с такими строками:

cat
dog
bird
cat
dog
elephant

Затем используй команды, чтобы:

  1. Отсортировать файл.
  2. Удалить дубликаты.
  3. Посчитать уникальных животных.
  4. Сохранить отсортированный уникальный список в unique-animals.txt.
  5. Показать результат на экране и сохранить его одновременно через tee.

Без мышки.

Мышка завершила курс как наблюдатель.

Итог

Сегодня ты узнал, что:

Это одна из самых глубоких идей Linux-терминала.

Делай одну вещь хорошо.

Потом соединяй эти вещи.

Это философия Unix в действии.

Курс Завершён

Поздравляю.

Ты завершил Курс по Терминалу Linux.

Ты начал с загадочного чёрного окна.

Теперь ты умеешь:

Терминал больше не монстр.

Это инструмент.

Острый инструмент.

Мощный инструмент.

Инструмент, который всё ещё заслуживает уважения.

Теперь практикуйся.

Осторожно.

И, возможно, сначала сделай backup.