Хостинг

Как автоматически отвечать на Да или Нет в командах Linux-Unix

Как автоматически отвечать на Да или Нет в командах Linux-Unix

Как автоматически отвечать «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)
Так файлы попадают в штатную корзину и их легче восстановить.