Thực hiện: làm thế nào để tiếp tục sau khi một lệnh thất bại?


143

Lệnh $ make allđưa ra các lỗi như rm: cannot remove '.lambda': No such file or directoryvậy để nó dừng lại. Tôi muốn nó bỏ qua các lỗi rm-not-Found-error. Làm thế nào tôi có thể buộc thực hiện?

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

Câu trả lời:


264

Hãy thử -icờ (hoặc --ignore-errors). Các tài liệu dường như đề xuất một cách mạnh mẽ hơn để đạt được điều này, bằng cách này:

Để bỏ qua lỗi trong một dòng lệnh, hãy viết một -ở đầu văn bản của dòng (sau tab ban đầu). Các- bị loại bỏ trước khi lệnh được chuyển đến shell để thực thi.

Ví dụ,

clean:
  -rm -f *.o

Điều này gây ra rmtiếp tục ngay cả khi nó không thể xóa một tập tin.

Tất cả các ví dụ đều có rm, nhưng có thể áp dụng cho bất kỳ lệnh nào khác mà bạn cần bỏ qua các lỗi từ (tức là mkdir).


30
Đừng làm vậy! Bạn không nên bỏ qua lỗi. Chỉ cần thêm cờ -f vào rm và nó sẽ không còn bị lỗi khi cố xóa các tệp không tồn tại. Tuy nhiên, nó vẫn trả về và lỗi nếu thực sự không xóa được tệp. Đó là hành vi bạn muốn, thất bại khi có vấn đề!
Kristof Provost

15
@Kristof Provost Đồng ý. rm -ftốt hơn cho vấn đề cụ thể mà người dùng đang gặp phải, nhưng thật tuyệt khi biết về giải pháp chung ngay cả khi đôi khi nó không an toàn.
brian_o

1
Điều đó thực sự hữu ích, Eli. Cảm ơn bạn.
Bác sĩ Beco

1
Make cũng cung cấp $(RM), mà bạn có thể sử dụng thay vì rm -f.
reitermarkus

32

make -k(hoặc --keep-goingtrên gnumake) sẽ làm những gì bạn đang yêu cầu, tôi nghĩ vậy.

Bạn thực sự phải tìm dòng del hoặc rm bị lỗi và thêm một dòng -fđể giữ lỗi đó không xảy ra với người khác.


1
Tôi không muốn nói bất cứ điều gì, nhưng tôi đã tự hỏi suy nghĩ của họ là gì. Nếu có một số lý do tôi không thấy lý do tại sao lá cờ đó không phù hợp, đó sẽ là một điều tốt để đưa lên.
TED

3
Bạn không nên bỏ qua lỗi. Giải pháp được đề xuất bởi Brian, Oded và NebuSoft là chính xác. Điều này và câu trả lời được chấp nhận là sai.
Kristof Provost

1
@KristofProvost - À. Tôi đoán đủ công bằng. Nói chung, tôi cũng tin rằng các câu trả lời có gốc rễ của vấn đề là vượt trội so với câu trả lời (như câu hỏi này) mà trước đây tôi trả lời câu hỏi được hỏi. Tôi không chắc chắn tôi muốn downvote ai đó cho rằng, nhưng đột quỵ khác nhau ...
TED

5
Câu trả lời tốt đẹp. Nó chứa một cờ cấp cao nhất, đơn giản mà không có câu trả lời nào khác chứa, nhưng vẫn đề xuất hành vi đúng. Lỗi không nên bỏ qua, nhưng thật tốt khi biết các tùy chọn.
brian_o

1
Một cái gì đó hữu ích để làm là bỏ qua các lỗi trình biên dịch ... cho phép makexây dựng càng nhiều đơn vị biên dịch càng tốt trong khi bạn sửa bất cứ thứ gì trình biên dịch bị nghẹn. Theo cách đó, khi bạn đã sửa bất cứ thứ gì bị hỏng, bạn cũng không phải chờ đợi mọi thứ khác được xây dựng.
inetknght

20

Thay đổi sạch sẽ thành

rm -f .lambda .lambda_t .activity .activity_t_lambda

Tức là không nhắc gỡ bỏ; đừng phàn nàn nếu tập tin không tồn tại


16

Trả về thành công bằng cách chặn rmmã trả về phía sau một đường ống bằng truelệnh, lệnh này luôn trả về 0(thành công)

rm file | true

11

Để thực hiện để thực sự bỏ qua lỗi trên một dòng, bạn chỉ cần có hậu tố với ; true , đặt giá trị trả về là 0. Ví dụ:

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

Điều này sẽ chuyển hướng đầu ra stderr thành null và thực hiện theo lệnh với true (luôn trả về 0, khiến cho tin rằng lệnh thành công bất kể điều gì thực sự xảy ra), cho phép dòng chương trình tiếp tục.


1
Điều này hoạt động với tôi khi mà dấu gạch đầu dòng không (Tôi được tạo một tệp thực hiện để chạy thử nghiệm cần thất bại và sẽ phân tích các bản ghi sau)
Sean Houlihane

2

Thay đổi cleanđể rmkhông phàn nàn:

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

1

Đặt một -ftùy chọn trong rmlệnh của bạn .

rm -f .lambda .lambda_t .activity .activity_t_lambda
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.