2011-03-07 14 views
6

quiero escribir este bucle de bash para zsh¿Cómo puedo pausar en zsh?

while true; do echo "print something"; read -p "pause"; done 

Este ecos de bucle, espera a que el usuario pulse ENTER. Si lo introduzco como está, la instrucción de lectura no se detiene, haciendo que zsh emita un eco infinito de "imprimir algo" sin esperar a que el usuario presione enter.

Respuesta

10

Parece que -p hace algo diferente en zsh. Probablemente necesites algo como read some_variable\?pause.

+0

Uso de '_' no funciona: zsh genera un error' zsh: sólo lectura variable: _ '. Sin embargo, cualquier otra cosa funciona. Gracias por el consejo. – k107

+0

+1 La misma técnica funciona en ksh. –

9

Dado que este es el único resultado de búsqueda que pude encontrar, y lo encontré útil pero aún un poco confuso, aquí hay otra forma de expresarlo: si todo lo que quiere hacer es repetir una línea de texto y esperar que el usuario presione eNTRAR ... read \?"I am waiting for you to press [Enter] before I continue."

0
#!/bin/zsh 

pause() 
{ 
    echo "$*"; read -k1 -s 
} 

ahora podemos llamar a la función con cualquier texto de solicitud:

pause "paused! press any key to continue" 
pause "you can write anything here :)" 
1

En zsh:

read -s -k '?Press any key to continue.' 

De man zshbuiltins:

  • -s No resonancia de caracteres si la lectura de la terminal.
  • -k Leer solo un personaje.
  • name?prompt El nombre se omite, por lo que la entrada del usuario se almacena en la variable REPLY (y la ignoramos). El primer argumento contiene un ?, por lo que el resto de esta palabra se utiliza como un mensaje de error estándar cuando el shell es interactivo.

Para incluir una nueva línea después de la línea de comandos:

read -s -k $'?Press any key to continue.\n' 

$'' se explica en QUOTING en man zshmisc.

Por último, una función pause que toma un mensaje de solicitud arbitraria en un script que hace lo que el PO se pregunta:

#!/usr/bin/env zsh 

pause() read -s -k "?$*"$'\n' 

while true; do 
    echo "print something" 
    pause "pause" 
done