Сделать: как продолжить после сбоя команды?


147

Команда $ 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

Ответы:


273

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

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

Например,

clean:
  -rm -f *.o

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

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


32
Не делай этого! Не стоит игнорировать ошибки. Просто добавьте флаг -f к rm, и он больше не будет терпеть неудачу при попытке удалить файлы, которые не существуют. Тем не менее, он все равно вернется и выдаст ошибку, если действительно не удастся удалить файл. Это то поведение, которое вы хотите, терпите неудачу, когда возникает проблема!
Кристоф Провост,

15
@Kristof Provost Согласен. rm -fлучше для конкретной проблемы, с которой сталкивается пользователь, но все же хорошо знать об общем решении, даже если оно иногда небезопасно.
brian_o 04

1
Это действительно полезно, Эли. Спасибо.
DrBeco

3
Make также предоставляет $(RM), которые вы можете использовать вместо rm -f.
reitermarkus

33

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

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


1
Я не хотел ничего говорить, но мне тоже было интересно, что они думают. Если по какой-то причине я не понимаю, почему этот флаг не подходит, было бы неплохо поднять его.
TED

3
Не стоит игнорировать ошибки. Решение, предложенное Брайаном, Одедом и NebuSoft, верное. Этот и принятый ответ неверны.
Кристоф Провост,

1
@KristofProvost - Ага. Думаю, достаточно справедливо. Как правило, я также считаю, что ответы, лежащие в основе проблемы, лучше, чем ответы (подобные этому), которые просто отвечают на заданный вопрос. Не уверен, что я бы проголосовал против кого-нибудь за это, но разные штрихи ...
TED

5
Хороший ответ. Он содержит простой флаг верхнего уровня, которого нет в других ответах, но все же рекомендует правильное поведение. Ошибки не следует игнорировать, но хорошо знать варианты.
brian_o

2
Что-то полезное - это игнорировать ошибки компилятора ... что позволяет makeсоздать как можно больше единиц компиляции, пока вы исправляете то, что компилятор подавил. Таким образом, когда вы исправите все, что было сломано, вам не придется ждать, пока все остальное будет построено.
inetknght 01

21

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

rm file | true

4
Вы также можете использовать rm file || true. Этот способ trueвызывается, если rmвозвращается код ошибки. Но любой вывод консоли rmне проглатывается трубой.
Джейсон Макветта,

20

Изменить чистый на

rm -f .lambda .lambda_t .activity .activity_t_lambda

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


11

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

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

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


1
Это работает для меня там, где ведущий тире не работает (мне дается make-файл для запуска теста, который должен завершиться неудачно, и я буду анализировать журналы позже)
Шон

2

Поменяй, cleanчтоб rmжаловаться не буду:

clean:
    rm -f .lambda .lambda_t .activity .activity_t_lambda

1

Поместите -fпараметр в свою rmкоманду.

rm -f .lambda .lambda_t .activity .activity_t_lambda
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.