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

Команда yes здається занадто простою, щоб бути практичною, але в цьому підручнику ми покажемо вам її застосування та як отримати вигоду від накопиченої позитивності в Linux і macOS.

Команда «Так».

Команда yes є однією з найпростіших команд у Linux та інших Unix-подібних операційних системах, таких як macOS. А під простим ми маємо на увазі простий у його використанні та його початкову реалізацію. Вихідний код оригінальної версії, випущеної в System 7 Unix і автором Кен Томпсон— дорівнює простому шість рядків коду.

Але не списуйте це з того, що це проста маленька команда. Його можна використати цікавими та корисними способами.

Що робить так?

Якщо використовується без параметрів командного рядка, команда yes веде себе так, ніби ви вводите «y» і натискаєте клавішу Enter знову і знову (і знову і знову). Дуже швидко. І це буде продовжуватися, доки ви не натиснете Ctrl+C, щоб перервати його.

yes

Фактично, так можна використовувати для багаторазового створення будь-якого повідомлення, яке ви виберете. Просто введіть так, пробіл, рядок, який ви хочете використовувати, а потім натисніть Enter. Це часто використовується для того, щоб сформувати вихідний потік рядків «так» або «ні».

yes yes

yes anything you like

Але яка це користь?

Вихід від yes можна передати в інші програми або скрипти.

Це звучить знайомо? Ви починаєте тривалий процес і відходите, залишаючи його працювати. Коли ви повертаєтеся до комп’ютера, процес взагалі не завершено. За вашої відсутності він поставив вам запитання і чекає на відповідь «так» чи «ні».

Якщо ви заздалегідь знаєте, що всі ваші відповіді будуть позитивними («так» або «у») або негативними («ні» чи «н»), ви можете використати «так», щоб надати ці відповіді для вас. Потім ваш тривалий процес завершиться без нагляду, і ви отримаєте відповіді на будь-які запитання, які задає процес.

Використання yes With Scripts

Подивіться на наступний сценарій оболонки Bash. (Нам потрібно уявити, що це частина набагато більшого сценарію, виконання якого займе значний час.)

#!/bin/bash

# ...
# in the middle of some long script
# obtain a response from the user
# ...

echo "Are you happy to proceed? [y,n]"
read input

# did we get an input value?
if [ "$input" == "" ]; then

   echo "Nothing was entered by the user"

# was it a y or a yes?
elif [[ "$input" == "y" ]] || [[ "$input" == "yes" ]]; then

   echo "Positive response: $input"

# treat anything else as a negative response
else

   echo "negative response: $input"

fi

Цей сценарій ставить запитання та чекає відповіді. Логічний потік сценарію визначається введенням користувача.

«Так» або «У» вказує на позитивну відповідь.
Будь-який інший вхід вважається негативною відповіддю.
Натискання Enter без введення тексту нічого не робить.

Щоб перевірити це, скопіюйте скрипт у файл і збережіть його як long_script.sh. Використовуйте chmod, щоб зробити його виконуваним.

chmod +x long_script.sh

Запустіть скрипт за допомогою наступної команди. Спробуйте ввести «так», «у» і будь-що інше як вхід, включаючи натиснення Enter без введення тексту.

./long_script.sh

Щоб отримати відповідь «так» на запитання сценарію, передайте вивід «так» у сценарій.

yes | ./long_script.sh

Деякі сценарії більш жорсткі у своїх вимогах і приймають лише повне слово «так» як позитивну відповідь. Ви можете вказати «так» як параметр для так, як показано нижче:

yes yes | ./long_script.sh

Не кажи так, не подумавши

Ви повинні бути впевнені, що вхідні дані, які ви збираєтеся ввести в сценарій або програму, безумовно, дадуть вам очікуваний результат. Щоб прийняти це рішення, ви повинні знати запитання та відповіді на них.

Логіка сценарію, команди або програми може не відповідати вашим очікуванням. У нашому прикладі сценарію запитання могло бути таким: «Чи бажаєте ви зупинитися? [y,n]». Якби це було так, негативна відповідь дозволила б продовжити сценарій.

Ви повинні бути знайомі зі сценарієм, командою або програмою, перш ніж безтурботно підтвердити їх.

Використання yes With Commands

На початковому етапі yes буде використовуватися з іншими командами Linux. З тих пір більшість цих інших команд Linux мають власний спосіб виконання без взаємодії з людиною. так більше не потрібно для досягнення цього.

Візьмемо для прикладу менеджер пакетів Ubuntu apt-get. Щоб інсталювати програму, не натискаючи «y» на півдорозі інсталяції, yes використовувався б таким чином:

yes | sudo apt-get install fortune-mod

Того ж результату можна досягти за допомогою параметра -y (припустимо, так) у apt-get:

sudo apt-get -y install fortune-mod

Ви побачите, що apt-get навіть не запитав свого звичайного «Ви хочете продовжити? [Y/n]” питання. Він просто припускав, що відповідь буде «так».

В інших дистрибутивах Linux така ж ситуація. У Fedora ви б використовували цей тип команди менеджера пакетів одного разу:

yes | yum install fortune-mod

Менеджер пакетів dnf замінив yum, а dnf має власну опцію -y (припустимо, так).

dnf -y install fortune-mod

Те ж саме стосується cp, fsck та rm. Кожна з цих команд має свої власні параметри -f (примус) або -y (припустимо, так).

Тож, здається, що yes було переведено лише на роботу зі сценаріями? Не зовсім. Є ще кілька хитрощів у старого пса.

Деякі додаткові так трюки

Ви можете використовувати yes з послідовністю цифр, створеною за допомогою seq, щоб керувати циклом повторюваних дій.

Цей однорядковий передає згенеровані цифри у вікно терміналу, а потім викликає сплячий режим на одну секунду.

Замість того, щоб просто відображати цифри у вікні терміналу, ви можете викликати іншу команду або сценарій. Цій команді або сценарію навіть не потрібно використовувати цифри, і вони призначені лише для того, щоб запускати кожен цикл циклу.

yes "$(seq 1 20)" | while read digit; do echo digit; sleep 1; done

Іноді корисно мати великий файл для перевірки. Можливо, ви хочете потренуватися у використанні команди zip або матимете значний файл для перевірки FTP-завантажень.

Ви можете швидко створювати великі файли за допомогою yes. Все, що вам потрібно зробити, це дати йому довгий рядок тексту для роботи та перенаправити вихід у файл. Не помиляйтеся; ці файли будуть швидко рости. Будьте готові натиснути Ctrl+C протягом кількох секунд.

yes long line of meaningless text for file padding > test.txt
ls -lh test.txt
wc test.txt

Файл, згенерований тут, зайняв близько п’яти секунд на тестовій машині, яка використовувалася для дослідження цієї статті. ls повідомляє, що він має розмір 557 Мб, а wc повідомляє, що в ньому 12,4 мільйона рядків.

Ми можемо обмежити розмір файлу, включивши заголовок у наш командний рядок. Ми повідомляємо йому, скільки рядків включити у файл. -50 означає, що голова пропускає лише 50 рядків до файлу test.txt.

yes long line of meaningless text for file padding | head -50 > test.txt

Як тільки у файлі test.txt буде 50 рядків, процес зупиниться. Вам не потрібно використовувати Ctrl+C. Це витончено зупиняється за власним бажанням.

wc повідомляє, що у файлі рівно 50 рядків, 400 слів і він має розмір 2350 байт.

Незважаючи на те, що вона все ще корисна для подачі відповідей у ​​довготривалі сценарії (і деякі інші прийоми), команда yes не буде частиною вашого щоденного набору команд. Але коли вам це знадобиться, ви побачите, що це сама простота — і все це в шести рядках золотого коду.