Scripting bash: bucle hasta que el valor de retorno sea 0

Pregunta:

Necesito desmontar algo en mi secuencia de comandos, pero a veces se desmonta antes de que todos los datos hayan terminado de copiarse y provoque que el desmontaje falle. Busqué una manera de hacer un desmontaje de "bloqueo", pero no encontré nada. Entonces, intenté escribir un script para que se repitiera hasta que se pudiera desmontar, pero no funciona.

while [ `sudo umount mount` ]
do
    sleep 0.1
done
rmdir mount

Cuando ejecute salidas:

umount: /home/evantandersen/mount: device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))
rmdir: failed to remove `mount': Device or resource busy

¿No debería repetirse hasta que el valor de retorno de sudo umount mount sea ​​0, lo que significa que se desmontó correctamente?

Respuesta:

El comando [ es para evaluar expresiones condicionales. Aquí no sirve de nada.

Debido a que umount no umount nada en su salida estándar (los errores van a stderr), `sudo umount mount` expande a nada.

Entonces es como:

while [ ]
do
  sleep 0.1
done

El comando [ , cuando no se pasa ningún argumento al lado de [ y ] devuelve falso (un estado de salida distinto de cero), por lo que no ingresará al ciclo.

Incluso si umount hubiera umount sus errores en stdout, usar el comando [ no habría tenido sentido, porque las palabras resultantes de esa salida nunca habrían formado una expresión condicional válida.

Aquí quieres:

until sudo umount mount
do
  sleep 0.1
done

Es decir, desea verificar el estado de salida de sudo / umount, no de un [ comando.

Si quisiera verificar si umount algún error o advertencia en su stderr, ahí es donde el [ podría haber sido útil. La -n "some-string" es una expresión condicional reconocida por el comando [ para probar si "some-string" está vacía o no, así que algo como:

while [ -n "$(sudo umount mount 2>&1 > /dev/null)" ]; do
  sleep 0.1
done

Pero buscar la presencia de mensajes de error o advertencia generalmente es una mala idea. El comando umount nos dice si tiene éxito o no con su código de salida, eso es mucho más confiable. Podría tener éxito y aún generar algún mensaje de advertencia. Podría fallar y no generar un error (como cuando se mata).

En este caso particular, tenga en cuenta que umount puede fallar porque el directorio no está montado y, en ese caso, haría un bucle para siempre, por lo que podría probar otro enfoque como:

while mountpoint -q mount && ! sudo umount mount; do
  sleep 0.1
done

O si "mount" se puede montar varias veces y desea desmontarlos todos:

while mountpoint -q mount; do
  sudo umount mount || sleep 0.1
done

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım