Respostas:
Deseja que ele funcione sem digitar um comando extra, por exemplo
$ rm file
Ou apenas quando o usuário digita algo como
$ confirm rm file
Ou apenas quando o usuário tenta executar certos comandos, por exemplo
$ rm file
mas não para
$ echo "Hello"
Se a opção 1, isso pode ser feito usando o gancho preexec no zsh ou a interceptação DEBUG no bash.
Se a opção 2, coloque algo assim /etc/bash.bashrcou em outro arquivo de inicialização do shell.
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
}
Se a opção 3, você pode modificar o confirmscript acima, ou, alguns comandos têm uma opção para perguntar antes de fazer algo, por exemplo rm -i. Você poderia colocar
alias rm='rm -i'em /etc/bash.bashrc.
Eu brinquei um pouco com o bash e descobri um truque pelo qual isso poderia ser possível.
#!/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
Você pode salvar esse script em, digamos, confirm-any-command.she sourceno seu bashrc. Ele solicitará a confirmação de cada comando que você tentará executar.
Observe que isso nada mais é do que um truque de prova de conceito; Duvido que possa realmente ser útil nesta forma. Se você precisar confirmar todos os comandos digitados, em breve adquirirá o hábito de pressionar automaticamente "yes" após cada comando. Seu mapeamento mental para "final de comando" vai mudar a partir de apenas Entera Enter, yes, Enter- você vai estar digitando-o como um todo, nem sequer tentando passar algum tempo na verificação de que você realmente quer este comando para executar. Isso é contraproducente e não o ajudará.
Allow? 1) yes 2) no #? nenhum yesnem notrabalho causando loop infinito (Debian 8)
help select: você deve inserir 1ou 2melhor do que yesou no. A nova tentativa automática para entradas inválidas é o comportamento pretendido (para que o escritor do script não precise se reinventar while, mantendo a concisão e a clareza), e a entrada EOF finaliza o loop. Sabendo disso, você pode verificar se o script acima funciona. Não vou modificá-lo, pois é uma prova grosseira de conceito.
y e s Enterexemplo
cdels?