
Estoy creando un archivo sh para ejecutar varios comandos en segundo plano.
En alguna línea de este archivo, hay un comando para actualizar un archivo zip como:
zip -d archive.zip file.txt
Es posible que este archivo.txt no siempre forme parte del archivo.zip. Cuando no es así, el script de shell se interrumpe en esa línea con:
zip warning: name not matched
Quiero que continúe con las siguientes líneas ignorando la inexistencia de este archivo. ¿Cómo puedo lograr esto?
Respuesta1
Normalmente, en un script de shell, incluso una línea que genere un error no detendrá la ejecución del script de shell. Simplemente pasará a la siguiente línea.
La excepción notable es si ha configurado el indicador para que salga del shell si falla algún subcomando. A veces, esto se hace agregando "set -e" cerca de la parte superior de un script. Si tiene algo así en su secuencia de comandos, se cancelará cuando cualquier comando en la secuencia de comandos devuelva un error. Tus opciones en este caso son:
Elimina esa opción. Esto podría tener ramificaciones para el resto del script, así que no lo hagas por capricho.
Desactive la opción para la sección del script en la que se encuentra y luego vuelva a activarla para continuar:
set +e zip -d archive.zip file.txt set -e
Proporcione una salida para la línea fallida para que el shell vea el comando como un éxito incluso si algo falló. Esto se puede hacer de muchas maneras, pero una sencilla es utilizar el operador OR:
zip -d archive.zip file.txt || true
Esto ejecutará el comando zip, pero si falla, ejecutará el comando verdadero y el shell principal obtendrá el código de retorno (lo cual, por supuesto, es un éxito). Es posible que a veces veas esto escrito,
||:
que es un poco más rápido y complicado, pero no mágico;:
Resulta que es un comando no operativo incorporado en el shell que también devolverá un código de error de éxito aunque no haga nada.Otra forma de hacer esto es ejecutar el comando en un subshell rodeándolo de
()
modo que, si bien el comando dentro de él puede fallar, el subshell habrá hecho su trabajo para que el script principal conset -e
set no muera. Esto no es óptimo para un solo comando, pero puede ser útil si desea ejecutar un conjunto completo de cosas.
Por otro lado, si solo desea suprimir el mensaje de error generado por zip, puede redirigir el flujo de error estándar a /dev/null con ( 2> /dev/null
) para suprimir los mensajes generados (o cerrarlo con 2>&-
).