Как автоматически отвечать «Yes» или «No» в Linux/Unix
1 мая 2024 г.
Внимание! Автоматическое подтверждение может привести к безвозвратной потере данных. Всегда проверяйте, что именно отправляете программе.
1. Команда yes
Утилита yes бесконечно выводит указанную строку (y по умолчанию) и подаёт её в STDIN другой программе. Подходит, когда подтверждений много.
# отвечать «yes» на все вопросы
yes | <команда>
# отвечать «no»
yes n | <команда>
# пример: rm -i без вопросов
yes | rm -i *.log
2. Разовое подтверждение через echo, printf или «here-string»
# одно «y»
echo y | <команда>
# два последовательных ответа
printf 'y\ny\n' | <команда>
# «here-string»
<команда> <<< $'y\n'
3. Встроенные флаги «без вопросов»
Многие программы уже имеют собственный неинтерактивный режим:
-
apt install -y -
dnf remove -y -
rm -f— «force», не спрашивать подтверждений -
cp -f— перезаписывать без диалога -
curl -fS— «fail silently»
Всегда смотрите --help или man — явный режим надёжнее, чем «подсовывать» ответы через yes.
4. expect, pexpect, coprocess — для сложных сценариев
Если диалог многошаговый или формат вопроса меняется, используйте инструменты автоматизации:
#!/usr/bin/expect -f
spawn some_interactive_tool
expect "Do you want to continue?" { send "y\r" }
expect eof
Альтернативы: Python-модуль pexpect, coproc (Bash 4+), Ansible + expect-модуль и др.
5. Быстрые примеры «в одну строку»
# «no» на каждый запрос rm -rI
yes n | rm -rI Downloads/
# установить пакеты без подтверждения
sudo apt-get -y install nginx
# подтвердить перезапись файла при cp
echo y | cp -i src.conf /etc/myapp.conf
# автоматизация mysql_secure_installation (используем expect)
expect -c '
spawn mysql_secure_installation
expect "enter for none": { send "\r" }
expect "Y/n" : { send "y\r" }
interact
'
6. Краткая памятка
-
yesилиecho y — универсально.
-
Для одного-двух ответов достаточно
echo/printf. -
Если есть ключ
-y,-f,--quiet— используйте его. -
Сложные диалоги ➜
expect/pexpect.
Если удаление уже работает, вернуть стёртые файлы зачастую невозможно без резервной копии. Ниже описано, как остановить процесс и минимизировать потери.
1. Быстрое прерывание в активном терминале: Ctrl + C
Находясь в том же окне, где запущена команда yes | rm …, нажмите Ctrl + C. Сигнал SIGINT отправится сразу всему конвейеру, и завершатся оба процесса: yes и rm.
2. Процесс запущен в фоне или в другом окне
- Выясните PID’ы:
ps -o pid,cmd | grep -E 'rm |yes '
- Пошлите сигнал прерывания:
kill -INT
или сразу всем одноимённым процессам:
pkill -INT rm # прервать все rm
pkill -INT yes # прервать все yes
3. «Заморозить», затем убить: Ctrl + Z
Если Ctrl + C не помогает:
-
Нажмите Ctrl + Z — процессы попадут в состояние stopped.
-
Посмотрите список фоновых заданий:
jobs -l
- Окончательно завершите:
kill %1 # вместо 1 — номер job
# при необходимости
kill -9 %1 # принудительное завершение
4. Остановить только поток «yes»
Иногда достаточно прекратить генерацию «y», чтобы rm -i снова стал ждать ваш ответ:
pkill yes # или killall yes
# теперь можно вручную отвечать «n» или нажать Ctrl + C
5. Восстановление уже удалённых данных
После остановки проверьте, что именно удалено. Если необходимы попытки восстановления, используйте:
-
extundelete,testdisk,photorec— для ext-файловых систем. -
Аппаратные/ПО-решения для btrfs/zfs снапшотов, если они были настроены.
-
Бэкап (RSnapshot, Borg, Restic, Time Machine и т. п.).
Гарантировать успех нельзя: чем раньше остановлено удаление и меньше перезаписано данных, тем выше шанс спасти файлы.
6. Как не допустить повторения
-
Вместо
yes | rmиспользуйте флагrm -fили безопасныйrm -I(спрашивает максимум пару раз). -
Добавьте алиас в
~/.bashrc:
alias rm='rm -I --preserve-root'
-
Работайте в непроверенных каталогах с помощью
trash(trash-cli) илиgio trash, чтобы файлы сначала перемещались в корзину. -
Поддерживайте регулярные резервные копии.
⚠️ Команда
rm -rfбезвозвратно стирает файлы. Убедитесь, что путь указан верно, и у вас есть резервная копия важного.
1. Почему yes | rmdir menu не удаляет содержимое?
Утилита rmdir умеет удалять только пустые каталоги. Если внутри лежат файлы или подпапки (а в bitrix их обычно множество), rmdir вернёт ошибку. «Подсовывать» ответы через yes бесполезно — вопросов всё равно не задаётся, каталог просто не считается пустым.
2. Удалить только содержимое, оставить сам каталог
Иногда нужно очистить папку, но оставить её на месте:
# вариант 1: звёздочка
rm -rf bitrix/*
# вариант 2: безопаснее при пробелах в именах
rm -rf bitrix/{.,}* 2>/dev/null
Первая команда стирает обычные файлы и подкаталоги. Вторая захватывает скрытые («точечные») элементы. Подстановку {.,}*
поддерживает Bash 4+.
3. Удалить каталог вместе со всем содержимым
rm -rf bitrix # быстрый и без вопросов
Ключи расшифровываются так:
-
-r/--recursive— рекурсивно заходить во все подпапки. -
-f/--force— не спрашивать подтверждения, игнорировать несуществующие файлы.
4. Нужна подстраховка? Интерактивные варианты
Чтобы случайно не стереть лишнего, используйте:
rm -ri bitrix # спросит перед каждым файлом
rm -rI bitrix # спросит один раз, если файлов > 3
Система попросит ввести y/n. Так меньше шанс ошибки.
5. Делаем «сухой прогон»
Смотрите, что будет удалено, не затрагивая файлы:
find bitrix -mindepth 1 -print # покажет всё, что внутри
Если вывод вас устраивает, выполните rm -rf bitrix.
6. Альтернатива: отправить в «корзину»
На рабочих станциях можно вместо жёсткого удаления использовать:
gio trash bitrix # среды GNOME/GTK
trash put bitrix # пакет trash-cli (pip / apt)
Так файлы попадают в штатную корзину и их легче восстановить.
Ищете надежного партнера по веб-разработке и автоматизации? Мы помогаем бизнесу расти с помощью современных технологий, автоматизации процессов и экспертного SEO. Свяжитесь с нами, чтобы обсудить вашу задачу.