Как автоматически отвечать «Yes» или «No» в Linux/Unix
<time datetime="2024-05-01">1 мая 2024 г.</time>
>
Внимание! Автоматическое подтверждение может привести к безвозвратной потере данных. Всегда проверяйте, что именно отправляете программе.
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)
Так файлы попадают в штатную корзину и их легче восстановить.