En este caso particular, me gustaría agregar una confirmación en Bash para
¿Estás seguro? [S / n]
para Mercurial hg push ssh://[email protected]//somepath/morepath
, que en realidad es un alias. ¿Existe un comando estándar que se pueda agregar al alias para lograrlo?
La razón es que hg push
, y hg out
pueden parecer similares y, a veces, cuando quiero hgoutrepo
, puedo escribir accidentlly hgpushrepo
(ambos son alias).
Actualización: si puede ser algo así como un comando incorporado con otro comando, como: confirm && hg push ssh://...
eso sería genial ... solo un comando que puede solicitar un yes
o no
y continuar con el resto si yes
.
bash
alias
confirmation
nonopolaridad
fuente
fuente
info bash
: "Para casi cualquier propósito, las funciones de shell son preferibles a los alias".ls -l
orm -i
?alias rm='rm -i'
. Un día, cuando más lo necesites, el alias no estará allí yboom!
se perderá algo importante.rm -i
, entonces no puede contar con tener un script de shell también. Entonces, ¿siempre escribesrm -i
todo el tiempo?rm
y esperar el-i
comportamiento, luego, un día, el alias no está allí (por alguna razón se desarma o no se configura o está en un sistema diferente ) y escriberm
y continúa inmediatamente eliminando cosas sin confirmación. ¡Uy! Sin embargo, si hizo un alias comoalias askrm='rm -i'
entonces estaría bien, ya que obtendría un error de "comando no encontrado".Respuestas:
Estas son formas más compactas y versátiles de la respuesta de Hamish . Manejan cualquier combinación de letras mayúsculas y minúsculas:
O, para Bash> = versión 3.2:
Nota: Si
$response
es una cadena vacía, dará un error. Para solucionarlo, basta con añadir las comillas:"$response"
. - Utilice siempre comillas dobles en variables que contengan cadenas (por ejemplo: prefiera usar"$@"
en su lugar$@
).O, Bash 4.x:
Editar:
En respuesta a su edición, así es como crearía y usaría un
confirm
comando basado en la primera versión en mi respuesta (funcionaría de manera similar con los otros dos):Para usar esta función:
o
fuente
not equal to
el segundo ejemplo, debe convertir la$response
variable. Por ejemplo:if [[ ! $response =~ ^([yY][eE][sS]|[yY])$ ]]
.=~
es el operador de coincidencia de expresiones regulares.Aquí hay más o menos un fragmento que desea. Déjame descubrir cómo reenviar los argumentos.
Cuidado con
yes | command name here
:)fuente
Las confirmaciones se omiten fácilmente con los retornos de carro, y me resulta útil solicitar continuamente una entrada válida.
Aquí hay una función para facilitar esto. "entrada no válida" aparece en rojo si Y | N no se recibe, y se le solicita al usuario nuevamente.
Puede cambiar la solicitud predeterminada pasando un argumento
fuente
Para evitar comprobar explícitamente estas variantes de 'sí', puede usar el operador de expresión regular bash '= ~' con una expresión regular:
Eso prueba si la entrada del usuario comienza con 'y' o 'Y' y es seguida por cero o más 'es's.
fuente
Esto puede ser un truco:
como en cuestión En Unix / Bash, ¿es "xargs -p" una buena forma de solicitar confirmación antes de ejecutar cualquier comando?
podemos usar
xargs
para hacer el trabajo:por supuesto, esto se establecerá como un alias, como
hgpushrepo
Ejemplo:
fuente
Agregue lo siguiente a su archivo / etc / bashrc. Este script agrega una "función" residente en lugar de un alias llamado "confirmar".
fuente
$response
y$@
para evitar errores de análisis, hay algunos puntos y comas redundantes, y la*
condición debe regresar, no salir.Esto puede ser un poco corto, pero para mi uso privado, funciona muy bien
El
read -n 1
solo lee un personaje. No es necesario presionar enter. Si no es una 'n' o 'N', se supone que es una 'Y'. Simplemente presionando enter significa Y también.(en cuanto a la pregunta real: haga que sea un script bash y cambie su alias para que apunte a ese script en lugar de lo que apuntaba antes)
fuente
fuente
No presionar enter requerido
Aquí hay un enfoque más largo, pero reutilizable y modular:
0
= sí y1
= nozsh
ybash
.Por defecto a "no" al presionar enter
Tenga en cuenta que el
N
está en mayúscula. Aquí se presiona enter, aceptando el valor predeterminado:También tenga en cuenta que eso
[y/N]?
se agregó automáticamente. Se acepta el "no" predeterminado, por lo que no se repite nada.Vuelva a preguntar hasta que se dé una respuesta válida:
Por defecto a "sí" al presionar enter
Tenga en cuenta que
Y
se escribe con mayúscula:Arriba, solo presioné enter, por lo que el comando se ejecutó.
Sin valor predeterminado activado enter: requiere
y
on
Aquí,
1
o falso fue devuelto. Tenga en cuenta que no hay mayúsculas en[y/n]?
Código
fuente
Bueno, aquí está mi versión de
confirm
, modificada de la de James:Estos cambios son:
local
para evitar que los nombres de variables choquenread
use$2 $3 ...
para controlar su acción, por lo que puede usar-n
y-t
read
sale sin éxito,echo
un salto de línea para bellezaGit on Windows
único tienebash-3.1
y no tienetrue
ofalse
, así que usereturn
en lugar. Por supuesto, esto también es compatible con bash-4.4 (el actual en Git para Windows).fuente
Esta versión le permite tener más de un caso
y
oY
,n
oN
Opcionalmente: repita la pregunta hasta que se proporcione una pregunta de aprobación
Opcionalmente: ignore cualquier otra respuesta
Opcionalmente: salga de la terminal si lo desea
Observe esto también: en la última línea de esta función, borre la variable REPLY. De lo contrario, si
echo $REPLY
verá, todavía está configurado hasta que abra o cierre su terminal o lo vuelva a configurar.fuente
Tarde al juego, pero creé otra variante de las
confirm
funciones de las respuestas anteriores:Para usarlo:
caracteristicas:
Loco:
echo -en
funcionabash
pero puede fallar en su shellecho
oxargs
fuente
Tratar,
fuente
Esto no es exactamente un "pedir sí o no", sino solo un truco: alias the but to
hg push ...
tohgpushrepo
tohgpushrepoconfirmedpush
y para cuando pueda explicar todo, el cerebro izquierdo ha tomado una decisión lógica.fuente
TAB
llave!No es lo mismo, pero idea que funciona de todos modos.
Salida:
¿otra vez? S / n N
otra vez? S / n ¿Algo
nuevo? S / n 7
otra vez? S / n &
otra vez? S / n nsijf
$
Ahora solo verifica el 1er carácter de $ i read.
fuente
El siguiente código combina dos cosas
shopt -s nocasematch que se ocupará de mayúsculas y minúsculas
y si la condición que aceptará tanto la entrada pasa sí, sí, sí, y.
shopt -s nocasematch
if [[sed-4.2.2. $ LINE = ~ (yes | y) $]]
luego salga 0
fi
fuente
Aquí está mi solución que usando expresiones regulares localizadas. Así que en alemán también "j" para "Ja" se interpretaría como sí.
El primer argumento es la pregunta, si el segundo argumento es "y", sí sería la respuesta predeterminada; de lo contrario, no sería la respuesta predeterminada. El valor de retorno es 0 si la respuesta fue "sí" y 1 si la respuesta fue "no".
Aquí hay un uso básico
fuente