¿Cómo puedo usar los comandos if test y find juntos de bash?

Pregunta:

Tengo un directorio con registros de fallos y me gustaría usar una declaración condicional en un script bash basado en un comando de búsqueda.

Los archivos de registro se almacenan en este formato:

/var/log/crashes/app-2012-08-28.log
/var/log/crashes/otherapp-2012-08-28.log

Quiero que la declaración if solo sea verdadera si hay un registro de fallas para una aplicación específica que se ha modificado en los últimos 5 minutos. El comando de find que usaría es:

find /var/log/crashes -name app-\*\.log -mmin -5

No estoy seguro de cómo incorporar eso en una declaración if correctamente. Creo que esto podría funcionar:

if [ test `find /var/log/crashes -name app-\*\.log -mmin -5` ] then
 service myapp restart
fi

Hay algunas áreas en las que no tengo claro:

  • He mirado las banderas if pero no estoy seguro de cuál debería usar, si es que debería usar alguna.
  • ¿Necesito la directiva de test o debo procesar directamente los resultados del comando find, o quizás usar find... | wc -l para obtener un recuento de líneas en su lugar?
  • No es 100% necesario para responder a esta pregunta, pero la test es para probar los códigos de retorno que devuelven los comandos. Y son algo invisibles, ¿fuera de stdout / stderr ? Leí la página de man , pero todavía no tengo muy claro cuándo usar la test y cómo depurarla.

Respuesta:

[ y test son sinónimos (excepto [ requiere ] ), por lo que no desea utilizar [ test :

[ -x /bin/cat ] && echo 'cat is executable'
test -x /bin/cat && echo 'cat is executable'

test devuelve un estado de salida cero si la condición es verdadera, de lo contrario diferente de cero. En realidad, esto puede ser reemplazado por cualquier programa para verificar su estado de salida, donde 0 indica éxito y un valor distinto de cero indica falla:

# echoes "command succeeded" because echo rarely fails
if /bin/echo hi; then echo 'command succeeded'; else echo 'command failed'; fi

# echoes "command failed" because rmdir requires an argument
if /bin/rmdir; then echo 'command succeeded'; else echo 'command failed'; fi

Sin embargo, todos los ejemplos anteriores solo se comparan con el estado de salida del programa e ignoran la salida del programa.

Para find , deberá probar si se generó algún resultado. -n prueba para una cadena no vacía:

if [[ -n $(find /var/log/crashes -name "app-*.log" -mmin -5) ]]
then
    service myapp restart
fi

Una lista completa de argumentos de prueba está disponible invocando help test en la línea de comandos de bash .

Si está usando bash (y no sh ), puede usar [[ condition ]] , que se comporta de manera más predecible cuando hay espacios u otros casos especiales en su condición. De lo contrario, generalmente es lo mismo que usar [ condition ] . He usado [[ condition ]] en este ejemplo, como lo hago siempre que puedo.

También cambié `command` a $(command) , que generalmente también se comporta de manera similar, pero es más agradable con los comandos anidados.

Leave a Comment

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

web tasarım