← 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.