Risposte:
Vuoi che funzioni senza digitare un comando aggiuntivo, ad es
$ rm file
O solo quando l'utente digita qualcosa di simile
$ confirm rm file
O solo quando l'utente tenta di eseguire determinati comandi, ad es
$ rm file
ma non per
$ echo "Hello"
Se l'opzione 1, ciò può essere fatto usando l'hook preexec in zsh o la trap DEBUG in bash.
Se l'opzione 2, inserisci qualcosa del genere in /etc/bash.bashrc
o un altro file di avvio della 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 l'opzione 3, è possibile modificare lo confirm
script sopra o, alcuni comandi hanno un'opzione da chiedere prima di fare qualcosa, ad es rm -i
. Si potrebbe mettere
alias rm='rm -i'
in /etc/bash.bashrc
.
Ho giocato un po 'con Bash e ho scoperto un hack con cui questo potrebbe essere reso possibile.
#!/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
Puoi salvare questo script sotto, diciamo, confirm-any-command.sh
e source
nel tuo bashrc
. Chiederà la conferma di ogni comando che proverai ad eseguire.
Si noti che questo non è altro che un hack di prova di concetto; Dubito che possa davvero essere utile in questa forma. Se dovrai confermare ogni singolo comando che digiti, molto presto acquisirai l'abitudine di premere automaticamente "sì" dopo ogni comando. La mappatura mentale per "fine del comando" cambierà da solo Entera Enter, yes, Enter- sarete digitando nel suo insieme, non hanno nemmeno provare a passare un po 'di tempo sulla verifica che davvero desidera che questo comando da eseguire. Questo è controproducente e non ti aiuterà.
Allow? 1) yes 2) no #?
né yes
né no
lavoro causando ciclo infinito (Debian 8)
help select
: dovresti inserire 1
o 2
piuttosto che yes
o no
. Il tentativo automatico di input non validi è un comportamento previsto (in modo che lo sceneggiatore non debba reinventare while
se stesso, mantenendo concisione e chiarezza) e l'input EOF termina il ciclo. Sapendo ciò, puoi verificare che lo script sopra funzioni. Non lo modificherò, dato che è comunque una rozza prova del concetto.
y e s Enter
esempio
cd
els
?