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 test
resultados 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/bash
con 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)zsh
pero 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
–p
opción no significa lo mismo quebash
'sread
comando integrado yzsh
' sread
comando integrado. Enzsh
elread
comando,–p
significa –– adivinar –– “La entrada se lee desde el coproceso”. Sugiero que muestre su solicitud conecho
oprintf
.También es posible que deba reemplazar
–n 1
con–k
o–k 1
.El
zsh
equivalente debash
'sread -p prompt
esCualquier 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).
Tres 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
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á que todavía está configurado hasta que abra o cierre su terminal o lo configure de nuevo.fuente