Ответы:
Вы хотите, чтобы это работало без ввода дополнительной команды, например
$ rm file
Или только когда пользователь вводит что-то вроде
$ confirm rm file
Или только когда пользователь пытается выполнить определенные команды, например
$ rm file
но не для
$ echo "Hello"
Если выбрана опция 1, это можно сделать с помощью перехвата preexec в zsh или ловушки DEBUG в bash.
Если вариант 2, поместите что-то подобное в /etc/bash.bashrcдругой файл запуска оболочки.
confirm() {
echo -n "Do you want to run $*? [N/y] "
read -N 1 REPLY
echo
if test "$REPLY" = "y" -o "$REPLY" = "Y"; then
"$@"
else
echo "Cancelled by user"
fi
}
Если выбрана опция 3, вы можете изменить приведенный confirmвыше скрипт, или у некоторых команд есть опция запроса, прежде чем что-то делать, например rm -i. Вы можете поместить
alias rm='rm -i'в /etc/bash.bashrc.
Я немного поиграл с bash и понял, как это можно сделать.
#!/bin/bash
debug_trap () {
echo "executing $BASH_COMMAND"
echo "Allow?"
select choice in yes no
do
if [ "$choice" = "yes" ]
then break
elif [ "$choice" = "no" ]
then return 1
fi
done
}
shopt -s extdebug
trap debug_trap DEBUG
Вы можете сохранить этот скрипт, скажем, confirm-any-command.shи sourceв своем bashrc. Он запросит подтверждение каждой команды, которую вы попытаетесь выполнить.
Пожалуйста, обратите внимание, что это не что иное, как проверка концепции; Я сомневаюсь, что это действительно может быть полезным в этой форме. Если вам придется подтверждать каждую введенную вами команду, вы очень скоро приобретете привычку автоматически нажимать «да» после каждой команды. Ваше психическое отображение для «конца команды» будет меняться от только Enterк Enter, yes, Enter- вы будете вводить его в целом, даже не пытаясь потратить некоторое время на проверке того, что вы действительно хотите эту команду для выполнения. Это контрпродуктивно и вам не поможет.
Allow? 1) yes 2) no #? ни , yesни noработа не вызывает бесконечный цикл (Debian 8)
help select: вы должны ввести 1или 2вместо yesили no. Автоматическая повторная попытка для недопустимых вводов - это предполагаемое поведение (чтобы создателю сценария не приходилось заново изобретать whileсебя, сохраняя краткость и ясность), а ввод EOF завершает цикл. Зная это, вы можете сами убедиться, что приведенный выше скрипт работает. Я не буду изменять его, так как в любом случае это грубое доказательство концепции.
y e s Enterпримером
cdиls?