ทำ: วิธีการดำเนินการต่อหลังจากคำสั่งล้มเหลว?


143

คำสั่ง$ 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

คำตอบ:


264

ลองใช้-iธง (หรือ--ignore-errors) เอกสารดูเหมือนว่าจะแนะนำวิธีที่มีประสิทธิภาพมากขึ้นเพื่อให้บรรลุนี้โดยวิธี

หากต้องการละเว้นข้อผิดพลาดในบรรทัดคำสั่งให้เขียน a -ที่ด้านบนของข้อความของบรรทัด (หลังจากแท็บเริ่มต้น) -จะถูกยกเลิกก่อนที่คำสั่งจะถูกส่งผ่านไปยังเปลือกสำหรับการดำเนินการ

ตัวอย่างเช่น,

clean:
  -rm -f *.o

นี่เป็นสาเหตุrmให้ดำเนินการต่อแม้ว่าจะไม่สามารถลบไฟล์ได้

ตัวอย่างทั้งหมดมาพร้อมกับrmแต่ใช้ได้กับคำสั่งอื่น ๆ ที่คุณต้องการละเว้นข้อผิดพลาดจาก (เช่นmkdir)


30
อย่าทำอย่างนั้น! คุณไม่ควรละเลยข้อผิดพลาด เพียงเพิ่มแฟล็ก -f ใน rm และจะไม่ล้มเหลวอีกต่อไปเมื่อพยายามลบไฟล์ที่ไม่มีอยู่ อย่างไรก็ตามจะยังคงส่งคืนและเกิดข้อผิดพลาดหากไม่สามารถลบไฟล์ได้ นั่นเป็นพฤติกรรมที่คุณต้องการล้มเหลวเมื่อมีปัญหา!
Kristof Provost

15
@Kristof พระครูตกลงกัน rm -fดีกว่าสำหรับปัญหาเฉพาะที่ผู้ใช้มี แต่ก็ยังดีที่รู้เกี่ยวกับการแก้ปัญหาทั่วไปแม้ว่าบางครั้งมันจะไม่ปลอดภัย
brian_o

1
นั่นเป็นประโยชน์จริงๆเอลี ขอบคุณ.
ดร. เบ

1
ยี่ห้อนอกจากนี้ยังมีซึ่งคุณสามารถใช้แทน$(RM) rm -f
reitermarkus

32

make -k(หรือ--keep-goinggnumake) จะทำสิ่งที่คุณขอฉันคิดว่า

คุณควรหาบรรทัด del หรือ rm ที่ล้มเหลวและเพิ่ม-fไปเพื่อป้องกันข้อผิดพลาดนั้นไม่ให้เกิดขึ้นกับผู้อื่น


1
ฉันไม่อยากพูดอะไรเลย แต่ฉันสงสัยว่าพวกเขาคิดอะไรอยู่ หากมีเหตุผลบางอย่างที่ฉันไม่เห็นว่าทำไมการตั้งค่าสถานะนั้นไม่เหมาะสมมันจะเป็นการดีที่จะนำขึ้น
TED

3
คุณไม่ควรละเลยข้อผิดพลาด โซลูชันที่เสนอโดย Brian, Oded และ NebuSoft นั้นถูกต้อง หนึ่งและคำตอบที่ยอมรับนี้ผิด
Kristof Provost

1
@KristofProvost - Ah ยุติธรรมพอฉันเดา โดยทั่วไปฉันยังเชื่อว่าคำตอบที่มาจากสาเหตุของปัญหานั้นดีกว่าคำตอบ (เช่นนี้) ที่ตอบคำถามที่ถามบ่อย ผมไม่แน่ใจว่าผมต้องการdownvoteใครสักคนสำหรับว่า แต่จังหวะที่แตกต่างกัน ...
TED

5
คำตอบที่ดี มันมีธงระดับบนที่ตรงไปตรงมาซึ่งไม่มีคำตอบอื่น ๆ ที่มี แต่ยังแนะนำพฤติกรรมที่ถูกต้อง ไม่ควรละเลยข้อผิดพลาด แต่เป็นการดีที่จะรู้ว่าตัวเลือกต่าง ๆ
brian_o

1
สิ่งที่มีประโยชน์ที่ต้องทำคือละเว้นข้อผิดพลาดของคอมไพเลอร์ ... ซึ่งอนุญาตให้makeสร้างยูนิตคอมไพล์ได้มากที่สุดในขณะที่คุณไปแก้ไขสิ่งที่คอมไพเลอร์สำลัก ด้วยวิธีนี้เมื่อคุณแก้ไขสิ่งที่เสียหายคุณไม่ต้องรอให้ทุกอย่างสร้างขึ้นด้วย
inetknght


16

ส่งคืนสำเร็จโดยการบล็อกrmreturncode ของไปป์ด้วยtrueคำสั่งซึ่งจะส่งคืน0(สำเร็จ)

rm file | true

11

ในการทำให้การเพิกเฉยข้อผิดพลาดจริง ๆ ในบรรทัดเดียวคุณสามารถต่อท้ายด้วย; trueการตั้งค่าส่งคืนเป็น 0 ตัวอย่างเช่น

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

สิ่งนี้จะเปลี่ยนเส้นทางเอาต์พุต stderr ไปเป็นโมฆะและทำตามคำสั่งด้วยจริง (ซึ่งมักจะส่งกลับ 0 ทำให้ทำให้เชื่อคำสั่งประสบความสำเร็จโดยไม่คำนึงถึงสิ่งที่เกิดขึ้นจริง) ช่วยให้การไหลของโปรแกรมเพื่อดำเนินการต่อ


1
วิธีนี้ใช้ได้ผลสำหรับฉันที่ไม่มีขีดกลาง (ฉันได้รับ makefile เพื่อทำการทดสอบที่จำเป็นต้องล้มเหลวและจะแยกบันทึกในภายหลัง)
Sean Houlihane

2

เปลี่ยนของคุณcleanดังนั้นrmจะไม่บ่น:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.