Какова цель команды “yes”?

Вопрос или проблема

В unix/linux существует команда yes, которая бесконечно выводит y в stdout. Какова её суть и как она может быть полезной?

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

Команда yes в сочетании с командой head может быть использована для генерации файлов большого объёма с целью тестирования.

Её также можно использовать для проверки, как система справляется с высокими нагрузками, так как использование yes приводит к 100% загрузке процессора на системах с одним процессором (для многопроцессорной системы процесс должен выполняться для каждого процессора). Это, например, может быть полезно для проверки эффективности системы охлаждения, когда процессор работает на 100%.

В 2006 году команда yes получила известность как способ выяснить, подвержен ли MacBook пользователя синдрому случайного отключения. Запустив команду yes дважды через Terminal в Mac OS X, пользователи могли максимизировать загрузку процессора своего компьютера и, таким образом, определить, связана ли неисправность с перегревом.

через wikipedia: http://en.wikipedia.org/wiki/Yes_(Unix)

Возможно, это спорное мнение, но, на мой взгляд, это некрасивое исправление плохого интерфейса командных инструментов.

Некоторые командные инструменты задают пользователю вопросы с предложением и не имеют опции для неинтерактивного запуска; представьте, например, что-то вроде

$ frobnicate *
frobnicate file a.txt? (y/n) y
frobnicate file b.txt? (y/n) y
...

Поскольку ответ на вопрос берется из стандартного ввода, быстрое решение этой проблемы заключается в использовании приложения, которое непрерывно выводит строку y\n, что именно и делает yes. В Unix конвейеры могут быть использованы для отправки этого вывода как ввода данной команде.

$ yes | frobnicate

Одна из проблем с этим подходом заключается в том, что yes не может проверить вопрос, на который она отвечает:

frobnicate file a.txt? (y/n) y
frobnicate file b.txt? (y/n) y
format device /dev/sda1? (y/n) y
frobnicate file c.txt? (y/n) y

Лучшим решением, когда оно доступно, является наличие специальной опции для неинтерактивного запуска, такой как rm -f или apt-get -y. Это позволяет реализовать более разумное поведение в приложении.

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

yes | for z in *.zip; do unzip "$z"; done 

Недавно я наткнулся на ещё одно использование этой команды: мне понравилось очищать жёсткий диск с использованием отличного от нулей шаблона (например, dd if=/dev/zero of=/dev/sdd bs=1M), и я использовал ‘yes‘ для этого:

yes UUUUUUUUUUUUU > /dev/sdd

Сотрудник использовал это оригинальным способом для ввода пароля

yes password | passwd

Например, использование curl как ping

yes https://unix.stackexchange.com | xargs curl -I -vsS --connect-timeout 60

Ответ или решение

Команда yes — это утилита в Unix/Linux системах, предназначенная для непрерывного вывода определённой строки, по умолчанию «y», в стандартный вывод (stdout). На первый взгляд, это может показаться не самой полезной командой, поскольку она просто повторяет введённый символ или строку бесконечно. Однако в различных контекстах, yes оказывается весьма полезной и практичной.

Теория (Theory)

Команда yes была изначально разработана для автоматизации подтверждений в командной строке. В Unix-подобных системах многие команды запрашивают у пользователя подтверждение, прежде чем выполнить потенциально разрушительные операции, такие как удаление файлов или форматирование устройств. Для таких сценариев ideal-решение — использование флага в программе, который позволяет запускать операцию без запроса подтверждения, например rm -f или apt-get -y. Однако не все программы и команды имеют такой флаг; здесь может пригодиться yes.

Пример (Example)

Рассмотрим несколько примеров использования команды yes:

  1. Автоматическое подтверждение: Если вы сталкиваетесь с командой, которая требует многочисленных подтверждений, например, frobnicate, которое запрашивает подтверждение для каждого файла, вы можете легко направить вывод yes в frobnicate, чтобы подтвердить каждое действие.

    yes | frobnicate
  2. Генерация данных: Команда yes может использоваться вместе с head для генерации больших файлов данных, которые необходимы для тестирования, особенно если нужно заполнить файл большим объемом одинаковых строк данных.

    yes "строка данных" | head -n 1000 > testfile.txt
  3. Тест производительности системы: Поскольку выполнение команды yes использует 100% процессорного времени на системах с одним процессором, она может быть использована для тестирования системы на предмет работы под высокими нагрузками. Например, это может быть полезно для анализа работы системы охлаждения.

    yes > /dev/null
  4. Диагностика проблем оборудования: yes получила известность в 2006 году, когда она использовалась для диагностики проблемы "Intermittent Shutdown Syndrome" у MacBook. Запуская yes дважды через Terminal, пользователи могли максимизировать нагрузку на процессор и проверить, не были ли отключения вызваны перегревом.

Применение (Application)

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

Тем не менее следует отметить, что использование команды yes имеет свои риски. Например, она не анализирует контекст команд, которым предлагает подтверждение. Это может привести к нежелательным результатам, если команда требует подтверждения для значимых и необратимых действий, таких как форматирование жёсткого диска. Поэтому в случае, если команда поддерживает опцию для неинтерактивного выполнения, предпочитайте её использованию yes.

Кроме того, yes может быть использована в различных других креативных сценариях. Одним из примеров является использование для заполнения строк указанным шаблоном, например, для заполнения содержимого жёсткого диска определёнными данными:

yes "UUUUUUUUUUUUUUUU" > /dev/sdd

Также yes иногда применяется при вводе паролей в случаях, когда необходимо автоматизировать процесс:

yes пароль | passwd

И в более продвинутых кейсах, таких как использование команды curl для тестирования доступности узлов:

yes https://unix.stackexchange.com | xargs curl -I -vsS --connect-timeout 60

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...