Make: как продолжить после сбоя команды? - PullRequest
116 голосов
/ 19 апреля 2010

Команда $ make all выдает такие ошибки, как rm: cannot remove '.lambda': No such file or directory, поэтому она останавливается. Я хочу, чтобы он игнорировал rm-not-found-errors. Как я могу форсировать?

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

Ответы [ 7 ]

208 голосов
/ 19 апреля 2010

Попробуйте флаг -i (или --ignore-errors). Документация , кажется, предлагает более надежный способ достижения этого, кстати:

Чтобы игнорировать ошибки в командной строке, напишите - в начале текста строки (после начальной вкладки). - сбрасывается до того, как команда будет передана в оболочку для выполнения.

Например,

clean:
  -rm -f *.o

Это приводит к продолжению rm, даже если он не может удалить файл.

Все примеры с rm, но применимы к любой другой команде, от которой нужно игнорировать ошибки (т. Е. mkdir).

30 голосов
/ 19 апреля 2010

make -k (или --keep-going на gnumake), я думаю, сделает то, о чем вы просите.

Вы действительно должны найти строку del или rm, которая терпит неудачу, и добавить к ней -f, чтобы эта ошибка не происходила с другими.

19 голосов
/ 19 апреля 2010

Изменить чистую на

rm -f .lambda .lambda_t .activity .activity_t_lambda

т.е. не запрашивать удаление; не жалуйтесь, если файл не существует.

11 голосов
/ 08 января 2013

Чтобы заставить make фактически игнорировать ошибки в одной строке, вы можете просто добавить к суффиксу ; true, установив возвращаемое значение равным 0. Например:

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

Это перенаправит вывод stderr в null и последует команде с true (который всегда возвращает 0, заставляя make полагать, что команда выполнена успешно независимо от того, что на самом деле произошло), позволяя продолжить выполнение программы.

8 голосов
/ 20 июля 2016

Вернуть успешно, заблокировав код возврата rm позади канала с помощью команды true, которая всегда возвращает 0 (успех)

rm file | true
2 голосов
/ 19 апреля 2010

Измените clean, чтобы rm не жаловался:

clean:
    rm -f .lambda .lambda_t .activity .activity_t_lambda
0 голосов
/ 19 апреля 2010

Вставьте параметр -f в команду rm.

rm -f .lambda .lambda_t .activity .activity_t_lambda
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...