261 votes

En Bash, comment ajouter "Êtes-vous sûr que [Y/n]" pour toute commande ou un alias?

Dans ce cas particulier, je tiens à ajouter confirmer dans Bash

Êtes-vous sûr? [O/n]

pour de Mercurial hg push ssh://username@www.example.com//somepath/morepath, qui est en fait un alias. Est-il un standard de la commande qui peut être ajouté à l'alias pour l'atteindre?

La raison en est qu' hg push et hg out peut sembler similaires, et parfois quand je veux, hgoutrepo, j'ai peut-accidentlly type hgpushrepo (les deux sont des alias).

Mise à jour: s'il peut être quelque chose comme une commande intégrée avec une autre commande, tels que: confirm & hg push ssh://... , ce serait sympa... juste 1 commande qui demandent un yes et continuer avec le reste si.

394voto

Dennis Williamson Points 105818

Ils sont plus compacts et polyvalents formes de Hamish de réponse. Ils la poignée d'un mélange de lettres majuscules et minuscules:

read -r -p "Are you sure? [y/N] " response
case $response in
    [yY][eE][sS]|[yY]) 
        do_something
        ;;
    *)
        do_something_else
        ;;
esac

Ou, pour Bash >= version 3.2:

read -r -p "Are you sure? [y/N] " response
if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
then
    do_something
else
    do_something_else
fi

Ou, Bash 4.x:

read -r -p "Are you sure? [y/N] " response
response=${response,,}    # tolower
if [[ $response =~ ^(yes|y)$ ]]
...

Edit:

En réponse à votre edit, voici comment vous pouvez créer et utiliser un confirm de commande basée sur la première version de ma réponse (cela fonctionnerait de la même manière avec les deux autres):

confirm () {
    # call with a prompt string or use a default
    read -r -p "${1:-Are you sure? [y/N]} " response
    case $response in
        [yY][eE][sS]|[yY]) 
            true
            ;;
        *)
            false
            ;;
    esac
}

Pour utiliser cette fonction:

confirm && hg push ssh://..

ou

confirm "Would you really like to do a push?" && hg push ssh://..

23voto

Hamish Grubijan Points 2078

Voici à peu près un extrait de code que vous voulez. Permettez-moi de trouver comment transférer les arguments.

read -p "Are you sure you want to continue? <y/N> " prompt
if [[ $prompt == "y" || $prompt == "Y" || $prompt == "yes" || $prompt == "Yes" ]]
then
  # http://stackoverflow.com/questions/1537673/how-do-i-forward-parameters-to-other-command-in-bash-script
else
  exit 0
fi

Surveillez yes | command name here :)

13voto

user389850 Points 133

Pour éviter explicitement la vérification de ces variantes de "oui", vous pourriez utiliser le bash expression régulière de l'opérateur '=~' avec une expression régulière:

read -p "Are you sure you want to continue? <y/N> " prompt
if [[ $prompt =~ [yY](es)* ]]
then
(etc...)

Qui teste si la saisie de l'utilisateur commence par " y " ou " Y " et est suivi par zéro ou plusieurs 'es.

8voto

動靜能量 Points 33008

Cela peut être un hack:

tout comme pour la question sous Unix / Bash, est "xargs -p" une bonne façon de demande de confirmation avant d'exécuter n'importe quelle commande?

nous pouvons à l'aide de xargs pour faire le travail:

echo ssh://username@www.example.com//somepath/morepath | xargs -p hg push

bien sûr, ce sera définie comme un alias, comme hgpushrepo

4voto

MattyV Points 719

Ajoutez les lignes suivantes à /etc/bashrc fichier. Ce script ajoute un résident "fonction" au lieu d'un alias appelé "confirmer".


function confirm( )
{
#alert the user what they are about to do.
echo "About to $@....";
#confirm with the user
read -r -p "Are you sure? [Y/n]" response
case "$response" in
    [yY][eE][sS]|[yY]) 
              #if yes, then execute the passed parameters
               "$@"
               ;;
    *)
              #Otherwise exit...
              echo "ciao..."
              exit
              ;;
esac
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X