Зробити: як продовжувати після відмови команди?


143

Команда $ make allвидає помилки, такі як rm: cannot remove '.lambda': No such file or directoryвони зупиняються. Я хочу, щоб він ігнорував rm-not-found-помилки. Як я можу примусити зробити?

Makefilefile

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

Відповіді:


264

Спробуйте -iпрапор (або --ignore-errors). Документація, здається, пропонує більш надійний спосіб досягти цього, до речі:

Щоб ігнорувати помилки в командному рядку, напишіть -на початку тексту рядка (після початкової вкладки). -Відкидається , перш ніж команда передається в оболонку для виконання.

Наприклад,

clean:
  -rm -f *.o

Це призводить rmдо продовження, навіть якщо він не в змозі видалити файл.

Усі приклади є rm, але застосовні до будь-якої іншої команди, яку потрібно ігнорувати помилки (тобто mkdir).


30
Не робіть цього! Не слід ігнорувати помилки. Просто додайте прапор -f до rm, і він більше не вийде з ладу при спробі видалити файли, яких не існує. Однак він все одно повернеться та помилиться, якщо дійсно не вдасться видалити файл. Така поведінка ви хочете, не вдається, коли є проблема!
Крістоф Простой

15
@ Крістоф Простой погодився. rm -fкраще для конкретної проблеми, яка виникає у користувача, але все-таки приємно знати про загальне рішення, навіть якщо це іноді небезпечно.
brian_o

1
Це справді корисно, Елі. Дякую.
Д-р Беко

1
Make також забезпечує $(RM), які ви можете використовувати замість rm -f.
reitermarkus

32

make -k(або --keep-goingна gnumake) зробить те, що ви просите, я думаю.

Ви дійсно повинні знайти лінію del або rm, яка не працює, і додати -fдо неї, щоб не допустити, щоб ця помилка сталася з іншими.


1
Я не хотів нічого говорити, але мені було цікаво, що теж їхнє мислення. Якщо з якихось причин я не бачу, чому цей прапор був би невідповідним, було б добре піднести його.
ТЕД

3
Не слід ігнорувати помилки. Рішення, запропоноване Брайаном, Одедом та NebuSoft, є правильним. Ця та прийнята відповідь помилкові.
Прорік Крістоф

1
@KristofProvost - Ага. Я досить справедливо здогадуюсь Як правило, я також вважаю, що відповіді, які отримують у корені проблеми, є вищими за відповідні (як ця), які суворо відповідають на задане питання. Я не впевнений, що я когось порушив за це, але різні удари ...
ТЕД,

5
Гарна відповідь. Він містить прямолінійний прапор верхнього рівня, який не містить жодної іншої відповіді, але все ж рекомендує правильну поведінку. Помилки не слід ігнорувати, але добре знати варіанти.
brian_o

1
Щось корисне зробити - це ігнорувати помилки компілятора ... що дозволяє makeстворити якомога більше одиниць компіляції, поки ви виправляєте те, що компілятор задушив. Таким чином, коли ви виправили все, що було зламано, вам не доведеться чекати, коли все інше теж збудеться.
inetknght

20

Змініть чистий на

rm -f .lambda .lambda_t .activity .activity_t_lambda

Тобто не вимагає видалення; не скаржтеся, якщо файл не існує.


16

Повернення успішно, блокуючи rmкод повернення за трубою з trueкомандою, яка завжди повертається 0(успіх)

rm file | true

11

Щоб змусити насправді ігнорувати помилки в одному рядку, ви можете просто суфіксувати їх ; true, встановивши значення повернення до 0. Наприклад:

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

Це призведе до перенаправлення висновку stderr на null і дотримується команди true (яка завжди повертає 0, що змушує вірити, що команда вдалася незалежно від того, що насправді сталося), дозволяючи продовжувати потік програми.


1
Це працює для мене там, де ведучий тире не робить (мені надається файл файлу, щоб запустити тест, який повинен вийти з ладу, і згодом розберемо журнали)
Шон Хуліхане

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.