Команда `yes` може здаватися надто елементарною, щоб мати практичне застосування, але в цій статті ми розглянемо її можливості та покажемо, як можна використовувати її переваги в Linux та macOS.
Коротко про команду `yes`
Команда `yes` належить до найпростіших команд, доступних у Linux та інших Unix-подібних системах, таких як macOS. Її простота полягає як у легкості використання, так і в мінімалістичній реалізації. Початковий код оригінальної версії, створеної Кеном Томпсоном для System 7 Unix, складається лише з шести рядків коду.
Однак, не варто недооцінювати цю маленьку команду. Вона може виявитися корисною в різних ситуаціях.
Принцип дії команди `yes`
Якщо команда `yes` запускається без додаткових параметрів, вона генерує нескінченний потік символів “y” з переходом на новий рядок, ніби ви постійно натискаєте клавішу “y” та “Enter”. Цей процес триватиме, доки ви його не зупините натисканням комбінації клавіш Ctrl+C.
yes
Фактично, `yes` може відтворювати будь-який вказаний вами текст багаторазово. Для цього введіть `yes`, пробіл, а потім потрібний рядок і натисніть Enter. Це часто використовують для створення послідовності відповідей “так” або “ні” для інших програм.
yes yes
yes будь-який текст на ваш вибір
Практичне застосування
Результат роботи команди `yes` можна передавати як вхідні дані для інших програм чи скриптів.
Чи траплялося вам запускати тривалий процес, а потім, повернувшись, виявляти, що він зупинився, чекаючи вашої відповіді “так” чи “ні”?
Якщо ви заздалегідь знаєте, що всі ваші відповіді будуть позитивними (“так” чи “y”) або негативними (“ні” чи “n”), ви можете скористатися командою `yes`, щоб надати ці відповіді автоматично. Таким чином, тривалий процес завершиться без вашої участі, автоматично відповідаючи на всі запитання.
Застосування `yes` у скриптах
Розглянемо приклад bash-скрипту. (Уявимо, що це частина набагато більшого скрипту, який потребує значного часу для виконання.)
#!/bin/bash # ... # в середині тривалого скрипту # отримуємо відповідь від користувача # ... echo "Ви бажаєте продовжити? [y,n]" read input # чи отримали ми вхідне значення? if [ "$input" == "" ]; then echo "Користувач нічого не ввів" # чи це y або yes? elif [[ "$input" == "y" ]] || [[ "$input" == "yes" ]]; then echo "Позитивна відповідь: $input" # все інше розглядаємо як негативну відповідь else echo "Негативна відповідь: $input" fi
Цей скрипт запитує в користувача підтвердження та очікує на відповідь. Подальша логіка скрипту залежить від введеного значення.
“Так” або “Y” вказує на позитивну відповідь.
Будь-який інший ввід розглядається як негативна відповідь.
Натискання Enter без введення тексту не дає жодного результату.
Щоб протестувати цей скрипт, скопіюйте його у файл і збережіть як `long_script.sh`. Використайте команду `chmod`, щоб зробити його виконуваним.
chmod +x long_script.sh
Запустіть скрипт за допомогою команди. Спробуйте вводити “так”, “y”, а також інші значення, включаючи натискання Enter без введення тексту.
./long_script.sh
Щоб автоматично надати позитивну відповідь на запитання скрипту, передайте вивід команди `yes` у скрипт.
yes | ./long_script.sh
Деякі скрипти вимагають повного слова “так” для позитивної відповіді. В такому випадку, вкажіть “так” як параметр для `yes`, як показано нижче:
yes yes | ./long_script.sh
Не зловживайте `yes`
Завжди переконайтеся, що вхідні дані, які ви передаєте скрипту або програмі, дадуть вам очікуваний результат. Розуміння запитань та можливих відповідей є ключовим.
Логіка скрипту, команди чи програми може відрізнятися від вашого уявлення. Наприклад, у нашому прикладі, питання могло б бути “Чи бажаєте ви зупинитися? [y,n]”. У такому випадку, негативна відповідь дозволила б скрипту продовжити виконання.
Тому, перед тим, як автоматично підтверджувати запити, ви повинні бути ознайомлені зі скриптом, командою чи програмою.
Використання `yes` з іншими командами
На початковому етапі команда `yes` часто використовувалася з іншими командами Linux для автоматизації відповідей. Однак, зараз більшість цих команд мають вбудовані можливості для виконання без втручання користувача, що робить використання `yes` менш необхідним.
Наприклад, у випадку з менеджером пакетів Ubuntu `apt-get`, для встановлення програми без підтвердження “y”, колись використовували:
yes | sudo apt-get install fortune-mod
Сьогодні, того ж ефекту можна досягти за допомогою параметра `-y` (assume yes) в `apt-get`:
sudo apt-get -y install fortune-mod
Ви помітите, що `apt-get` навіть не запитує “Чи бажаєте ви продовжити? [Y/n]”. Він просто припускає, що відповідь буде “так”.
Аналогічна ситуація в інших дистрибутивах Linux. У Fedora раніше використовували:
yes | yum install fortune-mod
Менеджер пакетів `dnf` замінив `yum`, і `dnf` також має параметр `-y` (assume yes).
dnf -y install fortune-mod
Те ж саме стосується команд `cp`, `fsck` та `rm`. Кожна з них має свої параметри `-f` (force) або `-y` (assume yes) для аналогічних цілей.
Отже, чи можна сказати, що `yes` використовується лише для скриптів? Не зовсім. Є ще кілька цікавих застосувань для цієї старої команди.
Додаткові трюки з `yes`
Ви можете використовувати `yes` разом з послідовністю чисел, згенерованою за допомогою `seq`, для керування циклами повторюваних дій.
Наступна однорядкова команда передає згенеровані числа до вікна терміналу, а потім призупиняє виконання на одну секунду.
Замість відображення чисел у терміналі, ви можете викликати іншу команду або скрипт. Цій команді або скрипту навіть не обов’язково використовувати згенеровані числа; вони можуть бути просто тригерами для виконання кожного циклу.
yes "$(seq 1 20)" | while read digit; do echo digit; sleep 1; done
Іноді потрібно мати великий файл для тестування. Наприклад, ви можете потренуватися у використанні команди `zip` або перевірити швидкість завантаження файлів через FTP.
Ви можете швидко створити великі файли за допомогою `yes`. Все, що потрібно зробити, це передати довгий рядок тексту та перенаправити вихід у файл. Будьте обережні, ці файли будуть стрімко збільшуватися. Будьте готові натиснути Ctrl+C через кілька секунд.
yes довгий рядок беззмістовного тексту для заповнення файлу > test.txt
ls -lh test.txt
wc test.txt
Файл, згенерований за допомогою цієї команди, за кілька секунд досяг розміру 557 Мб, містив 12,4 мільйона рядків.
Ми можемо обмежити розмір файлу, включивши заголовок в командний рядок. Ми вказуємо, скільки рядків потрібно записати у файл. `-50` означає, що потрібно взяти лише перші 50 рядків у файл `test.txt`.
yes довгий рядок беззмістовного тексту для заповнення файлу | head -50 > test.txt
Щойно у файлі `test.txt` буде 50 рядків, процес зупиниться. Не потрібно використовувати Ctrl+C. Він зупиниться автоматично.
`wc` повідомляє, що у файлі рівно 50 рядків, 400 слів, і він має розмір 2350 байтів.
Хоча `yes` залишається корисною для автоматизації відповідей у тривалих скриптах (та інших трюків), вона не є повсякденною командою. Однак, коли вона вам знадобиться, ви зрозумієте, наскільки вона проста і корисна, враховуючи, що вся її магія захована у шести рядках коду.