2012-05-29 17 views
69

Cuando nos fijamos en la forma en bucles infinitos deben aplicarse, en su mayoría se ve este enfoque:"mientras que" frente a "mientras que la verdadera"

while : 
do 
    # loop infinitely 
done 

Pero simplemente no entiendo el uso de : aquí. ¿No sería mejor usar:

while true 
do 
    # loop infinitely 
done 

?

+5

No se necesitan dos puntos después de 'true', ya que': 'es un comando, no la sintaxis. – chepner

Respuesta

51

de Manual:

: [argumentos] Sin efecto; el comando no hace nada más que expandir argumentos y realizar cualquier redirección especificada. Se devuelve un código de salida cero.

Como esto devuelve siempre, por tanto, el cero es similar para ser utilizado como true

Salida esta respuesta: What Is the Purpose of the `:' (colon) GNU Bash Builtin?

17

El colon es un built-in command que no hace nada, pero devuelve 0 (éxito). Por lo tanto, es más corto (y más rápido) que llamar a un comando real para hacer lo mismo.

+1

Es cierto. 'i = 0; tiempo mientras es verdadero; do ((i ++> 100000)) && break; done' tarda un poco más que la versión de dos puntos. –

+12

La diferencia no tiene nada que ver con comandos frente a construcciones internas, ya que ambos están integrados. Es puramente la cantidad adicional de caracteres con los que bash está lidiando. 'while: algo de galimatías', que sigue usando': ', es más lento que' verdadero'. Compare esto con un comando externo, como 'while/bin/true', que es literalmente cien veces más lento. –

+0

Encontré esta pregunta después de un desvío debido a las diferencias entre 'while true' y' while 1' - resulta que '1' es un alias a' cd -' que obviamente estaba pasando pero imprimiendo '~' (mi cwd al tiempo). Una advertencia con ':' Me di cuenta después de probar esto: las reglas habituales se aplican a ':', por lo que debe terminar con un punto y coma (o un salto de línea en casos como este, donde tiene un cierre bloque). Por lo tanto, para un trazador de líneas, escribiría 'while:; hacer ... done' en lugar de 'while: \ n do ... \ n done'. Realmente esto no es una advertencia. –

Cuestiones relacionadas