คำถามติดแท็ก error-handling

ใช้แท็กนี้สำหรับคำถามเกี่ยวกับวิธีจัดการข้อผิดพลาดที่สร้างขึ้นในเชลล์สคริปต์

2
ทำไมรูปแบบ“ คำสั่ง || จริง” มีประโยชน์หรือไม่
ขณะนี้ฉันกำลังสำรวจแพ็คเกจ Debian และฉันได้อ่านตัวอย่างโค้ดแล้ว และในทุกบรรทัดตัวอย่างpostinstสคริปต์เป็นรูปแบบ some command || true another command || true ดังนั้นหากคำสั่งบางตัวล้มเหลวบรรทัดจะส่งกลับค่าจริง แต่ฉันไม่เห็นว่าสิ่งนี้จะส่งผลกระทบต่อผลลัพธ์ของโปรแกรมอย่างไร

4
จะออกจากเชลล์สคริปต์ได้อย่างไรหากส่วนหนึ่งล้มเหลว?
ฉันจะเขียนเชลล์สคริปต์ที่ออกได้อย่างไรหากส่วนหนึ่งล้มเหลว? ตัวอย่างเช่นหากข้อมูลโค้ดต่อไปนี้ล้มเหลวสคริปต์ควรออก n=0 until [ $n -ge 5 ] do gksu *command* && break n=$[$n+1] sleep 3

3
chmod + โหมดเงียบ + วิธีบังคับให้ออกรหัส 0 แม้มีข้อผิดพลาด
มันเป็นไปได้รัน chmod และละเว้นข้อผิดพลาดจากคำสั่ง ตัวอย่าง (หมายเหตุ file.txt ไม่แสดงเพื่อแสดงตัวอย่าง) เมื่อฉันพิมพ์ chmod 777 file.txt ฉันได้รับข้อผิดพลาดในผลลัพธ์ chmod: cannot access file.txt : no such file or directory ดังนั้นฉันจึงเพิ่มแฟล็ก -f ลงในคำสั่งดังต่อไปนี้: (file.txt ไม่มีอยู่เพื่อแสดงเคส) chmod -f 777 file.txt echo $? 1 แต่จากตัวอย่าง chmod ส่งคืน 1 โปรดแนะนำวิธีการบังคับให้คำสั่ง chmod ให้รหัสทางออก 0 ทั้งๆที่มีข้อผิดพลาด

7
จะปิด X Server ได้อย่างไรเพื่อหลีกเลี่ยงข้อผิดพลาดขณะอัพเดทไดรเวอร์ nVidia
ฉันพยายามอัปเดตไดรเวอร์ nVidia ของฉัน แต่ฉันพบข้อผิดพลาดเมื่อฉันติดตั้งไดรเวอร์ ดูข้อผิดพลาด: ข้อผิดพลาด: ดูเหมือนว่าคุณกำลังใช้งานเซิร์ฟเวอร์ X อยู่ โปรดออกจาก X ก่อน การติดตั้ง สำหรับรายละเอียดเพิ่มเติมโปรดดูในส่วนการติดตั้ง NVIDIA DRIVER ใน README มีอยู่ในไดรเวอร์ Linux หน้าดาวน์โหลดที่ www.nvidia.com หมายเหตุ: ฉันลองทำตามคำแนะนำโดยพิมพ์init 3แต่ยังไม่มีอะไรเปลี่ยนแปลง .. จะปิดเซิร์ฟเวอร์ X ได้อย่างไร? ดังนั้นฉันสามารถอัปเดตไดรเวอร์

6
Trap, ERR และ echoing บรรทัดข้อผิดพลาด
ฉันกำลังพยายามสร้างการรายงานข้อผิดพลาดโดยใช้ Trap เพื่อเรียกใช้ฟังก์ชันกับข้อผิดพลาดทั้งหมด: Trap "_func" ERR เป็นไปได้ไหมที่จะรับสัญญาณ ERR ที่เป็นเส้นตรง? เปลือกเป็นทุบตี หากฉันทำเช่นนั้นฉันสามารถอ่านและรายงานคำสั่งที่ใช้และบันทึก / ดำเนินการบางอย่าง หรือบางทีฉันอาจจะทำผิดทั้งหมดนี้? ฉันทดสอบกับสิ่งต่อไปนี้: #!/bin/bash trap "ECHO $LINENO" ERR echo hello | grep "asdf" และ$LINENOกำลังกลับมา 2 ไม่ทำงาน

5
ป้องกัน grep ไม่ให้ออกในกรณีที่มีการระบุชื่อ
สคริปต์นี้ไม่ได้สะท้อน "หลัง": #!/bin/bash -e echo "before" echo "anything" | grep e # it would if I searched for 'y' instead echo "after" exit และถ้าฉันลบ-eตัวเลือกในบรรทัด shebang ออก แต่ฉันต้องการเก็บไว้เพื่อให้สคริปต์ของฉันหยุดทำงานหากมีข้อผิดพลาด ฉันไม่คิดว่า grep ไม่พบการจับคู่เป็นข้อผิดพลาด ฉันจะป้องกันไม่ให้ออกโดยทันทีได้อย่างไร

2
ฉันจะหารายการรหัสข้อผิดพลาด 'ทำ' ได้จากที่ใด
ฉันพยายามรวบรวมโปรแกรมที่เขียนใน Fortran โดยใช้make(ฉันมีMakefileและในขณะที่อยู่ในไดเรกทอรีที่มีMakefileฉันพิมพ์คำสั่ง$ make targetโดยที่ "เป้าหมาย" คือข้อกำหนดคุณสมบัติเป้าหมายเฉพาะระบบอยู่ในMakefileของฉัน ทดสอบกับการแก้ไขต่าง ๆ ของการกำหนดเป้าหมายของฉันฉันมักจะได้รับความหลากหลายของข้อผิดพลาดเมื่อพยายามที่จะเรียกร้องmakeเพื่อให้ไม่กี่ตัวอย่าง. make[1]: Entering directory /bin/sh: line 0: test: too many arguments ./dpp angfrc.f > angfrc.tmp.f /bin/sh: ./dpp: Permission denied make[1]: *** [angfrc.o] Error 126 make[1]: Leaving directory make: *** [cmu60] Error 2 และ make[1]: Entering directory /bin/sh: line 0: test: too …

2
วิธีการตรวจสอบว่าคำสั่งเช่น curl เสร็จสมบูรณ์โดยไม่มีข้อผิดพลาด?
ฉันใช้ curl เพื่ออัปโหลดไฟล์ไปยังเซิร์ฟเวอร์ผ่านโพสต์ HTTP curl -X POST -d@myfile.txt server-URL "Upload successful"เมื่อฉันด้วยตนเองรันคำสั่งนี้ในบรรทัดคำสั่งฉันได้รับการตอบสนองจากเซิร์ฟเวอร์เช่น อย่างไรก็ตามถ้าฉันต้องการรันคำสั่ง curl นี้ผ่านสคริปต์ฉันจะทราบได้อย่างไรว่าคำขอ POST ของฉันสำเร็จหรือไม่

6
ฉันจะระงับเอาต์พุตได้อย่างไรถ้าคำสั่งสำเร็จ
ฉันต้องการทำให้เอาต์พุตของสคริปต์ง่ายขึ้นโดยระงับเอาต์พุตของคำสั่งรองที่มักจะประสบความสำเร็จ อย่างไรก็ตามการใช้-qมันซ่อนเอาท์พุทเมื่อมันล้มเหลวเป็นครั้งคราวดังนั้นฉันจึงไม่มีทางเข้าใจข้อผิดพลาด stderrนอกจากนี้คำสั่งเหล่านี้เข้าสู่ระบบการส่งออกของพวกเขาใน มีวิธีระงับเอาต์พุตของคำสั่งเฉพาะเมื่อสำเร็จหรือไม่? ตัวอย่างเช่น (แต่ไม่ จำกัด เฉพาะ) สิ่งเช่นนี้: mycommand | fingerscrossed หากทุกอย่างเป็นไปด้วยดีfingerscrossedจับเอาท์พุทและทิ้งมันไป มิฉะนั้นจะส่งกลับไปยังเอาต์พุตมาตรฐานหรือข้อผิดพลาด (อะไรก็ตาม)

2
rsync: ข้ามไฟล์ที่ฉันไม่มีสิทธิ์
ฉันใช้rsync -rlptDเพื่อคัดลอกไดเรกทอรีจากผู้ใช้รายอื่น มีไฟล์อยู่สองสามไฟล์ (ฉันไม่ทราบวิธีการเหล่านี้ล่วงหน้า) ซึ่งฉันไม่ได้รับอนุญาตให้คัดลอก มีวิธีที่ rsync ไม่สนใจสิ่งเหล่านี้หรือไม่ ปัญหาคือว่าถ้า rsync กลับไม่ใช่ศูนย์ bash -x สคริปต์ของฉันจะออก

7
ฉันจะตรวจสอบว่าไฟล์สามารถสร้างหรือตัดทอน / เขียนทับในทุบตีได้อย่างไร?
ผู้ใช้เรียกสคริปต์ของฉันกับเส้นทางของไฟล์ที่จะได้รับการอย่างใดอย่างหนึ่งจะสร้างหรือเขียนทับในบางจุดในสคริปต์เหมือนหรือfoo.sh file.txtfoo.sh dir/file.txt พฤติกรรมการสร้างหรือเขียนทับเป็นเหมือนข้อกำหนดสำหรับการวางไฟล์ทางด้านขวาของ>โอเปอเรเตอร์เอาท์พุทหรือส่งต่อเป็นอาร์กิวเมนต์ไปที่tee(อันที่จริงการส่งเป็นอาร์กิวเมนต์เพื่อteeเป็นสิ่งที่ฉันกำลังทำอยู่ ) ก่อนที่ฉันจะเข้าไปในความกล้าของสคริปต์ฉันต้องการตรวจสอบอย่างสมเหตุสมผลว่าไฟล์สามารถสร้าง / เขียนทับได้ แต่ไม่ได้สร้างจริง การตรวจสอบนี้ไม่จำเป็นต้องสมบูรณ์แบบและใช่ฉันรู้ว่าสถานการณ์สามารถเปลี่ยนแปลงได้ระหว่างการตรวจสอบและจุดที่ไฟล์ถูกเขียนจริง - แต่ที่นี่ฉันโอเคด้วยวิธีแก้ไขปัญหาความพยายามที่ดีที่สุดเพื่อให้ฉันสามารถประกันตัวได้เร็ว ในกรณีที่เส้นทางของไฟล์ไม่ถูกต้อง ตัวอย่างของสาเหตุที่ไฟล์ไม่สามารถสร้างได้: ไฟล์มีองค์ประกอบไดเรกทอรีเช่นdir/file.txtแต่dirไม่มีไดเรกทอรี ผู้ใช้ไม่มีสิทธิ์ในการเขียนในไดเรกทอรีที่ระบุ (หรือ CWD หากไม่มีการระบุไดเรกทอรี ใช่ฉันรู้ว่าการตรวจสอบการอนุญาต "ล่วงหน้า" ไม่ใช่The UNIX Way ™แต่ฉันควรลองใช้งานและขอการให้อภัยในภายหลัง ในสคริปต์เฉพาะของฉันสิ่งนี้นำไปสู่ประสบการณ์การใช้งานที่ไม่ดีและฉันไม่สามารถเปลี่ยนองค์ประกอบที่รับผิดชอบได้

4
วิธีการทุบตียกเลิกการดำเนินการของสคริปต์ในข้อผิดพลาดทางไวยากรณ์หรือไม่
เพื่อความปลอดภัยฉันต้องการทุบตียกเลิกการทำงานของสคริปต์หากพบข้อผิดพลาดทางไวยากรณ์ ฉันประหลาดใจมากฉันไม่สามารถทำสิ่งนี้ได้ ( set -eไม่เพียงพอ) ตัวอย่าง: #!/bin/bash # Do exit on any error: set -e readonly a=(1 2) # A syntax error is here: if (( "${a[#]}" == 2 )); then echo ok else echo not ok fi echo status $? echo 'Bad: has not aborted execution on syntax error!' …

1
รหัสข้อผิดพลาดมาตรฐานใน Linux คืออะไร
เมื่อฉันเขียนรหัสในทุบตีเช่นคัดลอกไฟล์เมื่อไม่มีไฟล์ใน terminal ฉันเห็นข้อผิดพลาดคล้ายกับ "ไม่พบไฟล์" หากผู้ใช้สคริปต์ไม่ได้รับอนุญาตข้อผิดพลาดที่แสดง ขึ้นคล้ายกับ "ปฏิเสธสิทธิ์" โดยทั่วไปไม่ว่าภาษาการเขียนโปรแกรมเมื่อคุณเขียนรหัสเพื่อคัดลอกไฟล์เช่นภาษาการเขียนโปรแกรมที่คุณใช้จะขอให้ OS (linux ในกรณีของฉัน) ทำเช่นนั้นหากมีสิ่งผิดปกติเกิดขึ้น OS จะตอบสนองกับ ข้อผิดพลาดที่สะดวก (รหัส + ข้อความ) มีคำสั่งที่ฉันสามารถเรียกใช้ซึ่งจะแสดงรายการรหัสข้อผิดพลาดมาตรฐานทั้งหมดในระบบหรือไม่

4
ฉันจะจับรหัสทางออก / จัดการผิดได้อย่างถูกต้องเมื่อใช้การทดแทนกระบวนการได้อย่างไร
ฉันมีสคริปต์ที่แยกวิเคราะห์ชื่อไฟล์ลงในอาร์เรย์โดยใช้วิธีการต่อไปนี้ที่นำมาจากQ&A บน SO : unset ARGS ARGID="1" while IFS= read -r -d $'\0' FILE; do ARGS[ARGID++]="$FILE" done < <(find "$@" -type f -name '*.txt' -print0) วิธีนี้ใช้งานได้ดีและจัดการรูปแบบชื่อไฟล์ทุกประเภทได้อย่างสมบูรณ์แบบ อย่างไรก็ตามบางครั้งฉันจะส่งไฟล์ที่ไม่มีอยู่ไปยังสคริปต์เช่น: $ findscript.sh existingfolder nonexistingfolder find: `nonexistingfile': No such file or directory ... ภายใต้สถานการณ์ปกติฉันจะให้สคริปต์จับรหัสออกด้วยสิ่งที่ชอบRET=$?และใช้เพื่อตัดสินใจว่าจะดำเนินการอย่างไร ดูเหมือนจะไม่ทำงานกับการทดแทนกระบวนการด้านบน ขั้นตอนที่ถูกต้องในกรณีเช่นนี้คืออะไร? ฉันจะจับรหัสส่งคืนได้อย่างไร มีวิธีอื่นที่เหมาะสมกว่าหรือไม่ในการพิจารณาว่ามีบางอย่างผิดพลาดในกระบวนการทดแทนหรือไม่

2
วิธีการทริกเกอร์ข้อผิดพลาดโดยใช้คำสั่ง Trap
ฉันใช้ Ubuntu 12.04.2 ฉันพยายามใช้คำสั่ง "trap" เพื่อจับภาพผิดปกติหรือข้อผิดพลาดในเชลล์สคริปต์ของฉัน แต่ฉันยังพยายามที่จะออกจาก "Error" ด้วยตนเอง ฉันลองใช้ทางออก 1 แล้ว แต่จะไม่ส่งสัญญาณ "ข้อผิดพลาด" #!/bin/bash func() { exit 1 } trap "echo hi" INT TERM ERR func ไม่แน่ใจว่าจะเรียกสัญญาณออก "ผิดพลาด" ด้วยตนเองได้อย่างไร

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