Make: jak kontynuować po niepowodzeniu polecenia?

143

Polecenie wyświetla $ make allbłędy, takie jak rm: cannot remove '.lambda': No such file or directorywięc zatrzymuje się. Chcę, aby ignorował błędy nie znalezionych-rm. Jak mogę wymusić zrobienie?

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
źródło

Odpowiedzi:

264

Wypróbuj -iflagę (lub --ignore-errors). Dokumentacja wydaje się sugerować solidniejszy sposób osiągnięcia tego, przy okazji:

Aby zignorować błędy w wierszu poleceń, napisz -na początku tekstu wiersza (po początkowej tabulatorze). Polecenie -jest odrzucane przed przekazaniem polecenia do powłoki w celu wykonania.

Na przykład,

clean:
  -rm -f *.o

Powoduje rmto kontynuację, nawet jeśli nie można usunąć pliku.

Wszystkie przykłady są z rm, ale mają zastosowanie do każdego innego polecenia, z którego musisz zignorować błędy (tj mkdir.).

Eli Bendersky
źródło
30
Nie rób tego! Nie powinieneś ignorować błędów. Po prostu dodaj flagę -f do rm, a próba usunięcia nieistniejących plików nie zakończy się niepowodzeniem. Jednak nadal będzie zwracać i wyświetlać błąd, jeśli naprawdę nie uda się usunąć pliku. To jest zachowanie, którego chcesz, przegrywaj, gdy jest problem!
Kristof Provost,
15
@Kristof Provost Zgoda. rm -fjest lepsze dla konkretnego problemu, który ma użytkownik, ale nadal dobrze jest wiedzieć o ogólnym rozwiązaniu, nawet jeśli czasami jest ono niebezpieczne.
brian_o
1
To jest naprawdę przydatne, Eli. Dziękuję Ci.
Dr Beco,
1
Make także zapewnia $(RM), których możesz użyć zamiast rm -f.
reitermarkus
32

make -k(lub --keep-goingna gnumake) zrobi to, o co prosisz, myślę.

Naprawdę powinieneś znaleźć linię del lub rm, która nie działa i dodać -fdo niej a, aby ten błąd nie spotkał innych.

PRZETRZĄSAĆ
źródło
1
Nie chciałem nic mówić, ale zastanawiałem się, co oni myślą. Jeśli jest jakiś powód, dla którego nie widzę powodu, dla którego ta flaga nie byłaby odpowiednia, dobrze byłoby o tym wspomnieć.
TED
3
Nie powinieneś ignorować błędów. Rozwiązanie zaproponowane przez Briana, Odeda i NebuSoft jest poprawne. Ten i przyjęta odpowiedź są błędne.
Kristof Provost,
1
@KristofProvost - Ah. Myślę, że w porządku. Generalnie uważam również, że odpowiedzi, które dochodzą do źródła problemu, są lepsze od tych (takich jak ta), które zwykle odpowiadają na zadane pytanie. Nie jestem pewien, czy kogoś za to zagłosowałbym , ale inne uderzenia ...
TED,
5
Niezła odpowiedź. Zawiera prostą flagę najwyższego poziomu, której nie zawiera żadna inna odpowiedź, ale nadal zaleca prawidłowe zachowanie. Nie należy ignorować błędów, ale dobrze jest znać dostępne opcje.
brian_o
1
Coś przydatnego do zrobienia to zignorowanie błędów kompilatora ... co pozwala makena zbudowanie jak największej liczby jednostek kompilacji podczas naprawiania tego, na czym kompilator się zaciął. W ten sposób, gdy naprawisz to, co zostało zepsute, nie musisz czekać, aż wszystko inne się zbuduje.
inetknght
20

Zmień czyste na

rm -f .lambda .lambda_t .activity .activity_t_lambda

To znaczy nie pytaj o usunięcie; nie narzekaj, jeśli plik nie istnieje.

Brian Carlton
źródło
16

Powróć pomyślnie, blokując rmkod powrotu za potokiem za pomocą truepolecenia, które zawsze zwraca 0(sukces)

rm file | true
Bryce Guinta
źródło
11

Aby make faktycznie ignorował błędy w pojedynczym wierszu, możesz po prostu dodać do niego sufiks ; true, ustawiając wartość zwracaną na 0. Na przykład:

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

Spowoduje to przekierowanie wyjścia stderr na null i wykonanie polecenia z wartością true (która zawsze zwraca 0, powodując, że make uważa, że ​​polecenie się powiodło, niezależnie od tego, co się faktycznie stało), umożliwiając kontynuację przepływu programu.

Zamieszki
źródło
1
To działa dla mnie tam, gdzie nie działa wiodący myślnik (otrzymuję plik makefile do uruchomienia testu, który musi się nie powieść, i przeanalizuje dzienniki później)
Sean Houlihane
2

Zmień swój, cleanwięc rmnie będziesz narzekać:

clean:
    rm -f .lambda .lambda_t .activity .activity_t_lambda
Oded
źródło
1

Umieść -fopcję w swoim rmpoleceniu.

rm -f .lambda .lambda_t .activity .activity_t_lambda
NebuSoft
źródło