Formas de ejecutar comandos en secuencia

Cuando se desea ejecutar una serie de comandos en cierto orden y consecutivamente, es común ingresar uno y según el resultado obtenido ejecutar o no el siguiente.

Para simplificar esta acción hay varias alternativas según lo que deseemos que suceda según el éxito o fallo del anterior:

1. Ejecutar cada comando sin importar el resultado del anterior

Se separan los comandos por ; (punto y coma) y se ejecutan TODOS.

mkdir temp; tar -cvzf temp/app1.tar.gz app1

Se crea el directorio y luego se genera un tar.gz dentro. Si el directorio existe, el primer comando falla pero no importa.

2. Ejecutar cada comando si el anterior fue exitoso

Se separan los comandos por && (operador Y) y se ejecutan hasta que uno falle.

tar -cvzf backup/docs.tar.gz docs_dir && rm -r docs_dir/

Se crea un tar.gz y solo si esta acción es exitosa, se elimina el directorio.

3. Ejecutar cada comando si el anterior falló

Se separan los comandos por || (operador O) y en este caso se detiene en el primer comando que se se ejecute con éxito.

wget http://server1/data.txt || wget http://server1/data.bkp || date >> failed_data.log

Se intenta obtener data.txt, si no es posible, se intenta con data.bkp. Si también falla, en última instancia se agrega a un log la fecha y hora del (doble) intento fallido.

 

Por supuesto, se pueden hacer combinaciones entre los casos:

mkdir check; cd check; wget http://server1/data.txt || wget http://server1/data.bkp && mv data.txt || date >> failed_data.log
  • Se crea el directorio y se lo accede. Si el directorio existe, el primer comando falla pero sigue la ejecución.
  • Se intenta obtener data.txt. Si esta descarga se completa, se detiene la ejecución de comandos.
  • De lo contrario, se intenta obtener data.bkp. Si esta descarga se completa se renombra el archivo a data.txt. Si esta última acción puede realizarse, se detiene la ejecución de comandos.
  • Si no se pudo descargar data.bkp o bien no se lo pudo renombrar, se agrega a un log la fecha y hora del (doble) intento fallido.

 

Importante: en lo casos mencionados, un comando no utiliza la salida del anterior como su entrada.

Tagged with:
Publicado en Linux