Hacer: ¿cómo continuar después de que falla un comando?

143

El comando $ make allda errores como rm: cannot remove '.lambda': No such file or directorypara que se detenga. Quiero que ignore los errores rm-not-found-errors. ¿Cómo puedo forzar la fabricación?

Makefile

all:
        make clean
        make .lambda
        make .lambda_t
        make .activity
        make .activity_t_lambda
clean:
        rm .lambda .lambda_t .activity .activity_t_lambda

.lambda:
        awk '{printf "%.4f \n", log(2)/log(2.71828183)/$$1}' t_year > .lambda

.lambda_t:
        paste .lambda t_year > .lambda_t

.activity:
        awk '{printf "%.4f \n", $$1*2.71828183^(-$$1*$$2)}' .lambda_t > .activity

.activity_t_lambda:
        paste .activity t_year .lambda  | sed -e 's@\t@\t\&\t@g' -e 's@$$@\t\\\\@g' | tee > .activity_t_lambda > ../RESULTS/currentActivity.tex
hhh
fuente

Respuestas:

264

Prueba la -ibandera (o --ignore-errors). La documentación parece sugerir una forma más sólida de lograr esto, por cierto:

Para ignorar los errores en una línea de comando, escriba un -al comienzo del texto de la línea (después de la pestaña inicial). El -se descarta antes de que el comando se pase al shell para su ejecución.

Por ejemplo,

clean:
  -rm -f *.o

Esto hace rmque continúe incluso si no puede eliminar un archivo.

Todos los ejemplos son con rm, pero son aplicables a cualquier otro comando del que deba ignorar los errores (es decir mkdir).

Eli Bendersky
fuente
30
¡No hagas eso! No debes ignorar los errores. Simplemente agregue el indicador -f a rm y ya no fallará cuando intente eliminar archivos que no existen. Sin embargo, aún regresará y generará un error si realmente no puede eliminar un archivo. Ese es el comportamiento que quieres, ¡falla cuando haya un problema!
Kristof Provost
15
@ Kristof Provost De acuerdo. rm -fes mejor para el problema específico que tiene el usuario, pero aún así es bueno saber acerca de la solución general, incluso si a veces es insegura.
brian_o
1
Eso es realmente útil, Eli. Gracias.
Dr Beco
1
Make también proporciona $(RM), que puedes usar en lugar de rm -f.
reitermarkus
32

make -k(o --keep-goingen gnumake) hará lo que está pidiendo, creo.

Realmente debería encontrar la línea del o rm que está fallando y agregarle una -fpara evitar que ese error ocurra a otros.

TED
fuente
1
No quería decir nada, pero también me preguntaba cuál era su pensamiento. Si hay alguna razón por la que no veo por qué esa bandera no sería apropiada, sería bueno mencionarla.
TED
3
No debes ignorar los errores. La solución propuesta por Brian, Oded y NebuSoft es correcta. Esta y la respuesta aceptada son incorrectas.
Kristof Provost
1
@ KristofProvost - Ah. Bastante justo, supongo. En general, también creo que las respuestas que llegan a la raíz del problema son superiores a las (como esta) que simplemente responden a la pregunta. No estoy seguro de haber votado a alguien por eso, pero diferentes golpes ...
TED
55
Buena respuesta. Contiene un indicador directo de nivel superior que ninguna otra respuesta contiene, pero aún así recomienda el comportamiento correcto. Los errores no deben ignorarse, pero es bueno conocer las opciones.
brian_o
1
Algo útil para hacer es ignorar los errores del compilador ... lo que permite makeconstruir tantas unidades de compilación como sea posible mientras arreglas lo que el compilador se atragantó. De esa manera, cuando haya arreglado lo que estaba roto, no tiene que esperar a que todo lo demás se construya también.
inetknght 01 de
20

Cambiar limpio a

rm -f .lambda .lambda_t .activity .activity_t_lambda

Es decir, no solicitar la eliminación; No te quejes si el archivo no existe.

Brian Carlton
fuente
16

Regrese con éxito bloqueando rmel código de retorno detrás de una tubería con el truecomando, que siempre regresa 0(éxito)

rm file | true
Bryce Guinta
fuente
11

Para hacer que realmente ignore los errores en una sola línea, simplemente puede agregarle un sufijo ; true, estableciendo el valor de retorno en 0. Por ejemplo:

rm .lambda .lambda_t .activity .activity_t_lambda 2>/dev/null; true

Esto redirigirá la salida de stderr a nulo y seguirá el comando con verdadero (que siempre devuelve 0, lo que hace creer que el comando tuvo éxito independientemente de lo que realmente sucedió), permitiendo que el flujo del programa continúe.

Alboroto
fuente
1
Esto funciona para mí donde el guión principal no funciona (me dan un archivo MAKE para ejecutar una prueba que debe fallar y analizará los registros más tarde)
Sean Houlihane
2

Cambia tu cleanasí rmno te quejarás:

clean:
    rm -f .lambda .lambda_t .activity .activity_t_lambda
Oded
fuente
1

Pon una -fopción en tu rmcomando.

rm -f .lambda .lambda_t .activity .activity_t_lambda
NebuSoft
fuente