Editar:
Parece trabajar dentro bash. Parece que el problema está relacionado con zsh. Si hay un sitio mejor para publicar este problema, avíseme.
Estoy escribiendo un script simple que crea una serie de directorios. Quiero que el usuario dé una confirmación antes de hacerlo. Estoy usando lo siguiente como base, pero parece que no puedo ejecutarlo dentro de una función bash. Si lo pongo fuera de una función, funciona bien. Aquí hay un ejemplo aislado:
leer.sh
#!/bin/bash
test() {
read -p "Here be dragons. Continue?" -n 1 -r
if [[ $REPLY =~ ^[Yy]$ ]]
then
echo "You asked for it..."
fi
}
código de esta publicación SO.
Abastecimiento del archivo y / o testresultados en el siguiente error: read:1: -p: no coprocess. Misma salida cuando lo coloco en mi.bashrc
Editar :
@hennes
- Quiero que la función esté en un archivo de configuración, para poder llamarla desde cualquier directorio (idealmente mi .bashrc o .zshrc)
- He corregido el formato de la primera línea comentada. El problema aún existe en
zsh - La versión Bash es 3.2, pero me has ayudado a descubrir que el problema es con zsh y no bash.
zsh
bash-scripting
Nick Tomlin
fuente
fuente

#! /bin/bashcon un espacio detrás de ella shebang? Pensé que no estaban permitidos? 3) '#! / Usr / bin / env bash' es probablemente mejor. 4) ¿Qué versión de bash? (Probé con bash 4.1.10 en FreeBSD y no obtuve errores)zshpero no pensé que habría conflicto con los scripts de bash (tengo varios otros scripts similares ejecutándose correctamente). Lo volví a etiquetar y respondí a tus preguntas. ¡Gracias por señalarme en la dirección correcta!./read.sh. No es necesario si lo ejecuta de otra manera o si lo coloca en un script de inicio. Y si desea ejecutarlo en zsh con `zsh ./read.sh ', las líneas que comienzan con un # se ignoran. También confunden ya que dan la impresión de que usas bash cuando usas zsh).Respuestas:
La
–popción no significa lo mismo quebash'sreadcomando integrado yzsh' sreadcomando integrado. Enzshelreadcomando,–psignifica –– adivinar –– “La entrada se lee desde el coproceso”. Sugiero que muestre su solicitud conechooprintf.También es posible que deba reemplazar
–n 1con–ko–k 1.El
zshequivalente debash'sread -p promptesCualquier cosa después de a
?en el primer argumento se utiliza como cadena de solicitud.Y, por supuesto, puede especificar un nombre de variable para leer (y este puede ser un mejor estilo):
(Citar variables de shell es generalmente una buena idea también).
fuente
Este código parece hacer lo que quieres en zsh.
(Tenga en cuenta que la pregunta que mencionó explícitamente es para bash).
#! / usr / bin / env zsh prueba() { echo -n "Aquí hay dragones. ¿Continuar?" leer RESPUESTA si [[$ REPLY = ~ ^ [Yy] $]] luego echo "Lo pediste ..." fi } pruebaTres comentarios:
fuente
REPLY=""para borrar la variable REPLY. De lo contrario, si repite $ REPLY, verá que todavía está configurado hasta que abra o cierre su terminal o lo configure de nuevo.Esta versión le permite tener más de un caso
yoY,noNOpcionalmente: 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 $REPLYverá que todavía está configurado hasta que abra o cierre su terminal o lo configure de nuevo.fuente