Dans ce cas particulier, je voudrais ajouter une confirmation dans Bash pour
Êtes-vous sûr? [O / n]
pour Mercurial hg push ssh://[email protected]//somepath/morepath
, qui est en fait un alias. Existe-t-il une commande standard qui peut être ajoutée à l'alias pour y parvenir?
La raison en est que , hg push
et hg out
peut sembler similaire et parfois quand je veux hgoutrepo
, je peux taper accidentlly hgpushrepo
( les deux sont des alias).
Mise à jour: si cela peut être quelque chose comme une commande intégrée avec une autre commande, comme: confirm && hg push ssh://...
ce serait génial ... juste une commande qui peut demander un yes
ou no
et continuer avec le reste si yes
.
bash
alias
confirmation
non-polarité
la source
la source
info bash
: "Pour presque tous les usages, les fonctions shell sont préférées aux alias."ls -l
ourm -i
?alias rm='rm -i'
. Un jour, lorsque vous en aurez le plus besoin, l'alias ne sera plus là etboom!
quelque chose d'important sera perdu.rm -i
, vous ne pouvez pas compter sur un script shell également. Alors, tapez-vous toujours àrm -i
chaque fois?rm
et d'attendre le-i
comportement, puis un jour l'alias n'est pas là (pour une raison quelconque, il n'est pas défini ou n'est pas défini ou vous êtes sur un système différent ) et vous tapezrm
et il continue immédiatement la suppression des éléments sans confirmation. Oups! Cependant, si vous avez fait un alias commealias askrm='rm -i'
ça, vous serez OK, car vous obtiendrez une erreur "commande introuvable".Réponses:
Ce sont des formes plus compactes et polyvalentes de la réponse de Hamish . Ils gèrent n'importe quel mélange de lettres majuscules et minuscules:
Ou, pour Bash> = version 3.2:
Remarque: Si
$response
est une chaîne vide, cela donnera une erreur. Pour résoudre, il suffit d' ajouter des guillemets:"$response"
. - Utilisez toujours des guillemets doubles dans les variables contenant des chaînes (par exemple: préférez utiliser à la"$@"
place$@
).Ou, Bash 4.x:
Éditer:
En réponse à votre modification, voici comment créer et utiliser une
confirm
commande basée sur la première version de ma réponse (cela fonctionnerait de manière similaire avec les deux autres):Pour utiliser cette fonction:
ou
la source
not equal to
le deuxième exemple, vous devez convertir la$response
variable. Par exemple:if [[ ! $response =~ ^([yY][eE][sS]|[yY])$ ]]
.=~
c'est l'opérateur de correspondance regex.Voici à peu près un extrait que vous souhaitez. Permettez-moi de savoir comment transmettre les arguments.
Attention à
yes | command name here
:)la source
Les confirmations sont facilement contournées avec les retours chariot, et je trouve utile de demander continuellement une entrée valide.
Voici une fonction pour vous faciliter la tâche. "entrée invalide" apparaît en rouge si Y | N n'est pas reçu, et l'utilisateur est à nouveau invité.
Vous pouvez modifier l'invite par défaut en passant un argument
la source
Pour éviter de vérifier explicitement ces variantes de 'oui', vous pouvez utiliser l'opérateur d'expression régulière bash '= ~' avec une expression régulière:
Cela teste si l'entrée utilisateur commence par «y» ou «Y» et est suivie par zéro ou plusieurs «es».
la source
Cela peut être un hack:
comme en question Sous Unix / Bash, "xargs -p" est-il un bon moyen de demander une confirmation avant d'exécuter une commande?
nous pouvons utiliser
xargs
pour faire le travail:bien sûr, cela sera défini comme un alias, comme
hgpushrepo
Exemple:
la source
Ajoutez ce qui suit à votre fichier / etc / bashrc. Ce script ajoute une "fonction" résidente au lieu d'un alias appelé "confirmer".
la source
$response
et$@
pour éviter les erreurs, il y a des points-virgules redondants, et la*
condition devrait revenir, pas quitter.Cela peut être un peu trop court, mais pour mon usage privé, cela fonctionne très bien
Le
read -n 1
lit juste un caractère. Pas besoin d'appuyer sur Entrée. Si ce n'est pas un «n» ou un «N», il est supposé être un «Y». Une simple pression sur enter signifie également Y.(comme pour la vraie question: faites-en un script bash et changez votre alias pour pointer vers ce script au lieu de ce qui pointait auparavant)
la source
la source
Aucune pression sur enter requise
Voici une approche plus longue, mais réutilisable et modulaire:
0
= oui et1
= nonzsh
etbash
.Par défaut à "non" lorsque vous appuyez sur Entrée
Notez que le
N
est en majuscule. Ici, appuyez sur Entrée, en acceptant la valeur par défaut:Notez également que cela a
[y/N]?
été automatiquement ajouté. Le "non" par défaut est accepté, donc rien n'est répété.Invitez à nouveau jusqu'à ce qu'une réponse valide soit donnée:
Par défaut "oui" lorsque vous appuyez sur Entrée
Notez que le
Y
est en majuscule:Ci-dessus, je viens d'appuyer sur Entrée, donc la commande s'est exécutée.
Aucune valeur par défaut sur enter- nécessite
y
oun
Ici,
1
ou faux a été retourné. Notez pas de capitalisation dans[y/n]?
Code
la source
Eh bien, voici ma version de
confirm
, modifiée de celle de James:Ces changements sont:
local
pour empêcher les noms de variables d'entrer en collisionread
utiliser$2 $3 ...
pour contrôler son action, vous pouvez donc utiliser-n
et-t
read
sortie infructueuse,echo
un fil de ligne pour la beautéGit on Windows
seulementbash-3.1
et n'a pastrue
oufalse
, utilisez donc à lareturn
place. Bien sûr, cela est également compatible avec bash-4.4 (l'actuel dans Git pour Windows).la source
Cette version vous permet d'avoir plus d'un cas
y
ouY
,n
ouN
Facultativement: répétez la question jusqu'à ce qu'une question d'approbation soit fournie
Facultativement: ignorer toute autre réponse
En option: quittez le terminal si vous le souhaitez
Remarquez cela aussi: sur la dernière ligne de cette fonction, effacez la variable REPLY. Sinon, si vous
echo $REPLY
le voyez, il est toujours réglé jusqu'à ce que vous ouvriez ou fermiez votre terminal ou le réinitialisiez.la source
Tard dans le jeu, mais j'ai créé une autre variante des
confirm
fonctions des réponses précédentes:Pour l'utiliser:
Fonctionnalités:
Bugs:
echo -en
fonctionne avecbash
mais pourrait échouer dans votre shellecho
ouxargs
la source
Essayer,
la source
Ce n'est pas exactement un "demander oui ou non" mais juste un hack: alias le
hg push ...
nonhgpushrepo
mais lehgpushrepoconfirmedpush
et au moment où je peux expliquer le tout, le cerveau gauche a fait un choix logique.la source
TAB
clé!Pas la même chose, mais l'idée qui fonctionne quand même.
Sortie:
encore une fois? O / n N
Encore? O / n
Encore une fois? O / n 7
Encore? O / n et
encore? O / n nsijf
$
Maintenant, ne vérifie que le premier caractère de $ i read.
la source
Le code ci-dessous combine deux choses
shopt -s nocasematch qui s'occupera de la casse
et si la condition accepte les deux entrées, vous passez oui, oui, oui, oui.
shopt -s nocasematch
si [[sed-4.2.2. $ LINE = ~ (oui | y) $]]
puis quittez 0
Fi
la source
Voici ma solution qui utilise l'expression régulière localisée. Donc en allemand aussi "j" pour "Ja" serait interprété comme oui.
Le premier argument est la question, si le deuxième argument est "y" que oui serait la réponse par défaut sinon non serait la réponse par défaut. La valeur de retour est 0 si la réponse est "oui" et 1 si la réponse est "non".
Voici une utilisation basique
la source