Поиск по сайту:

Как использовать команду yes в Linux


Команда yes кажется слишком простой, чтобы иметь какое-либо практическое применение, но в этом руководстве мы покажем вам ее применение и то, как извлечь выгоду из ее сдерживаемой положительности в Linux и macOS.

Команда да

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

Но не списывайте это со счетов за то, что это простая маленькая команда. Его можно использовать интересными и полезными способами.

Что делает да?

При использовании без каких-либо параметров командной строки команда yes ведет себя так, как если бы вы вводили «y» и нажимали Enter снова и снова (и снова и снова). Очень быстро. И так будет продолжаться до тех пор, пока вы не нажмете Ctrl+C, чтобы прервать его.

yes

На самом деле, yes можно использовать для многократного создания любого выбранного вами сообщения. Просто введите yes, пробел, строку, которую вы хотите использовать, и нажмите Enter. Это часто используется, чтобы заставить yes генерировать выходной поток строк «да» или «нет».

yes yes
yes anything you like

Но какая от этого польза?

Вывод yes может быть передан в другие программы или скрипты.

Это звучит знакомо? Вы запускаете длительный процесс и уходите, оставляя его работать. Когда вы вернетесь к своему компьютеру, процесс еще не завершен. В ваше отсутствие он задал вам вопрос и ждет ответа «да» или «нет».

Если вы заранее знаете, что все ваши ответы будут положительными («да» или «д») или отрицательными («нет» или «н»), вы можете использовать yes, чтобы предоставить эти ответы для ты. Затем ваш долгий процесс завершится без присмотра, и yes предоставит ответы на любые вопросы, которые задает процесс.

Использование yes со сценариями

Посмотрите на следующий сценарий оболочки 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

Этот скрипт задает вопрос и ждет ответа. Логический поток в скрипте определяется вводом пользователя.

  • «Да» или «y» означает положительный ответ.
  • Любой другой ввод считается отрицательным ответом.
  • Нажатие Enter без ввода текста ничего не дает.

Чтобы проверить это, скопируйте скрипт в файл и сохраните его как long_script.sh. Используйте chmod, чтобы сделать его исполняемым.

chmod +x long_script.sh

Запустите скрипт с помощью следующей команды. Попробуйте указать «да», «y» и что-нибудь еще в качестве ввода, включая нажатие Enter без ввода текста.

./long_script.sh

Чтобы получить yes ответ на вопрос скрипта, передайте вывод yes скрипту.

yes | ./long_script.sh

Некоторые скрипты более жесткие в своих требованиях и принимают только полное слово «да» в качестве положительного ответа. Вы можете указать «да» в качестве параметра для yes следующим образом:

yes yes | ./long_script.sh

Не говори «да», не подумав

Вы должны быть уверены, что входные данные, которые вы собираетесь ввести в сценарий или программу, обязательно дадут вам ожидаемый результат. Чтобы принять это решение, вы должны знать вопросы и ответы на них.

Логика сценария, команды или программы может не соответствовать вашим ожиданиям. В нашем примере скрипта вопрос мог звучать так: «Вы хотите остановиться? [д, н]». Если бы это было так, отрицательный ответ позволил бы продолжить работу сценария.

Вы должны быть знакомы со сценарием, командой или программой, прежде чем беспечно направить в нее да.

Использование yes с командами

В зачаточном состоянии yes использовался с другими командами Linux. С тех пор большинство других команд Linux работают по-своему, без участия человека. Для этого больше не требуется yes.

В качестве примера возьмем диспетчер пакетов Ubuntu apt-get. Чтобы установить приложение без необходимости нажимать «y» в середине установки, yes можно было бы использовать следующим образом:

yes | sudo apt-get install fortune-mod

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

sudo apt-get -y install fortune-mod

Вы увидите, что apt-get даже не спросил своего обычного «Хотите продолжить? [Да/нет]». Он просто предполагал, что ответ будет «да».

В других дистрибутивах Linux ситуация такая же. В Fedora вы бы использовали этот тип команды менеджера пакетов в одно время:

yes | yum install fortune-mod

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

dnf -y install fortune-mod

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

Получается, что yes предназначен только для работы со скриптами? Не совсем. Есть еще несколько трюков в старой собаке еще.

Некоторые дополнительные да трюки

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

Этот однострочный текст отображает сгенерированные цифры в окне терминала, а затем вызывает sleep на одну секунду.

Вместо того, чтобы просто отображать цифры в окне терминала, вы можете вызвать другую команду или сценарий. Этой команде или сценарию даже не нужно использовать цифры, они нужны только для запуска каждого цикла цикла.

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 миллиона строк.

Мы можем ограничить размер файла, включив head в нашу командную строку. Мы говорим ему, сколько строк включить в файл. -50 означает, что head пропустит только 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 не станет частью вашего повседневного набора команд. Но когда вам это понадобится, вы обнаружите, что это сама простота — и все это в шести строках золотого кода.

RELATED: Best Linux Laptops for Developers and Enthusiasts