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.