วิธีการจับข้อผิดพลาดจากคำสั่งดำเนินการ?


20

ฉันได้รับมอบหมายให้สร้างสคริปต์การทำให้เซิร์ฟเวอร์แข็งโดยอัตโนมัติและสิ่งหนึ่งที่พวกเขาต้องการก็คือรายงานของเอาต์พุตทั้งหมดของแต่ละคำสั่งที่เรียกใช้งาน ฉันต้องการเก็บข้อความแสดงข้อผิดพลาดภายในสตริงและต่อท้ายในไฟล์ข้อความ

สมมติว่าฉันรันคำสั่งนี้:

/sbin/modprobe -n -v hfsplus

ผลลัพธ์ของการทำงานในเครื่องของฉันจะเป็น:

FATAL: Module hfsplus not found

ฉันจะเก็บข้อความแสดงข้อผิดพลาดนั้นไว้ในสตริงได้อย่างไร? ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก. ขอบคุณ!


ฉันพยายามเรียกใช้คำสั่งนี้: var = $ (/ sbin / modprobe -n -v hfsplush) จากนั้นแสดง: $ var แต่ก็ยังไม่จับข้อความแสดงข้อผิดพลาดภายในสตริง
Miguel Roque

คำตอบ:


23

คุณสามารถทำได้โดยเปลี่ยนเส้นทางคำสั่งข้อผิดพลาด:

/sbin/modprobe -n -v hfsplus 2> fileName 

เป็นสคริปต์

#!/bin/bash
errormessage=$( /sbin/modprobe -n -v hfsplus 2>&1)
echo $errormessage

หรือ

 #!/bin/bash
errormessage=`/sbin/modprobe -n -v hfsplus 2>&1 `
echo $errormessage

หากคุณต้องการผนวกข้อผิดพลาดที่ใช้>>แทน>

ตรวจสอบให้แน่ใจว่าได้ใช้2>&1และ2> &1หลีกเลี่ยงข้อผิดพลาด "ข้อผิดพลาดทางไวยากรณ์ใกล้กับโทเค็นที่ไม่คาดคิด` & '"


ฉันได้ลองวิธีการนั้นแล้วมันจะเก็บไว้ในไฟล์ข้อความโดยตรง ฉันต้องการเก็บไว้ในสายอักขระก่อนเพื่อให้สามารถจัดรูปแบบเนื้อหาได้อย่างง่ายดาย
Miguel Roque

1
@MiguelRoque ดูการอัปเดต
Networker

1
ฉันพยายามวางผลลัพธ์ลงใน HEREDOC และก็ใช้งานได้ ขอบคุณมาก @Networker!
Miguel Roque

1
มีคนย้อนกลับการแก้ไขที่ฉันทำเพราะฉันมี "ข้อผิดพลาดทางไวยากรณ์ใกล้ &" และลบช่องว่างหลังจาก> การให้เหตุผลจะเป็นสิ่งที่ดี
Pierre.Sassoulas

ฉันพยายามแก้ไขเพราะ: ตรวจสอบให้แน่ใจว่าได้ใช้ 2> & 1 และไม่ใช่ 2> & 1 เพื่อหลีกเลี่ยงข้อผิดพลาด "ข้อผิดพลาดทางไวยากรณ์ใกล้โทเค็น` & '"
peter_v

15

เพียงเพื่อเก็บเป็นสตริงในสคริปต์ทุบตี:

X=`/sbin/modprobe -n -v hfsplus 2>&1`
echo $X

สิ่งนี้อาจดีกว่านี้เล็กน้อยเนื่องจากคุณจะเห็นข้อความเมื่อคำสั่งถูกเรียกใช้:

TMP=$(mktemp)
/sbin/modprobe -n -v hfsplus 2>&1 | tee $TMP
OUTPUT=$(cat $TMP)
echo $OUTPUT
rm $TMP

1
ใช้ $ (command) แทน backticks เสมอเพื่อทดแทนคำสั่ง มันจะดีกว่า :)
ซรี

ฉันรู้ว่ามันดีกว่า (ฉันมีปัญหาน้อยลงเมื่อใช้ $ ()) แต่ทำไมถึงเป็นเช่นนั้น
KolonUK

4

ฉันจับข้อผิดพลาดเช่นนี้

. ${file} 2>&1 | {
  read -d "\0" -t 0.01 error
    [ -z "$error" ] || log_warn Load completion ${file} failed: "\n${error}"
}

หากแหล่งที่มาล้มเหลวฉันจะจับข้อผิดพลาดและเข้าสู่ระบบ log_warn เป็นเพียงฟังก์ชั่นที่เรียบง่าย

BTW ฉันใช้สิ่งนี้ในdotfiles



2

รุ่นทุบตีที่ใหม่กว่า (เช่น bash 4.1+):

$ msg=$(ls -la nofile 2>&1)
$ echo $msg
ls: cannot access nofile: No such file or directory
$ 

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