Як використовувати команду yes в Linux

Команда `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` залишається корисною для автоматизації відповідей у тривалих скриптах (та інших трюків), вона не є повсякденною командою. Однак, коли вона вам знадобиться, ви зрозумієте, наскільки вона проста і корисна, враховуючи, що вся її магія захована у шести рядках коду.