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

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
NebuSoft
источник