Score:0

เรียกใช้คำสั่งในพื้นหลัง แต่รับรหัสทางออกที่ไม่ใช่ศูนย์ *ทันที* เมื่อ 'ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว'

ธง cn

ฉันต้องเรียกใช้คำสั่ง (ไม่รู้จัก) ในพื้นหลังดังนี้:

ไม่อัพ some_command &

เนื่องจากคำสั่งดังกล่าวจะทำงานและ (หวังว่าจะ) เสร็จสมบูรณ์ในเบื้องหลัง ฉันจึงไม่สามารถรับสถานะการออกได้ทันที ไม่เป็นไร

อย่างไรก็ตาม ฉันต้องได้รับสถานะการออก "ข้อผิดพลาด" โดยทันที ในกรณีที่ some_command ไม่พบ (เช่น เมื่อข้อความแสดงข้อผิดพลาดจาก bash คือ ไม่พบไฟล์หรือโฟลเดอร์ที่คุณค้นหา หรือ ไม่พบคำสั่ง).

อะไรคือทางเลือกในการแก้ปัญหาที่สั้นและง่ายที่สุดที่ฉันสามารถใช้ได้


ข้อมูลพื้นฐานสำหรับคำถามที่ถามในความคิดเห็น: นี่คือโปรแกรม "ส่วนหน้า" GUI ที่โต้ตอบกับผู้ใช้ ผู้ใช้ป้อนคำสั่งบางอย่าง (เช่น gedit some_file) และโปรแกรม GUI ของฉันดำเนินการคำสั่งนี้และกลับไปที่ลูปทันทีเพื่อยอมรับคำสั่งถัดไปจากผู้ใช้ ดังนั้น คำสั่งที่ป้อนควรรัน "แยก" จากโปรแกรม GUI อย่างไรก็ตาม หากผู้ใช้ป้อนคำสั่งผิด (เช่น geditxyz) ฉันต้องการเตือนผู้ใช้ทันทีว่าไม่พบคำสั่ง

ar flag
คุณจำเป็นต้องใช้ทั้ง 'nohup' ในตอนเริ่มต้นและ '&' ในตอนท้ายหรือไม่? มันจะทำงานถ้าคุณใช้อย่างใดอย่างหนึ่ง?
raj avatar
cn flag
raj
โดย "รับ" สถานะการออก คุณหมายถึงการรับโดยทางโปรแกรม (เพื่อใช้ในภายหลังในสคริปต์) หรือเพียงแค่แสดงบนเทอร์มินัล เนื่องจากในกรณีที่สอง bash จะทำด้วยตัวเองหากคุณตั้งค่า `set -b` ลองพิมพ์ `nohup nonexistent &` และคุณจะได้ผลลัพธ์เช่น `[1]+ Exit 127 nohup nonexistent` ทันที
Score:3
ธง cn

เนื่องจากคำสั่งดังกล่าวจะทำงานและ (หวังว่าจะ) เสร็จสมบูรณ์ในเบื้องหลัง ฉันจึงไม่สามารถรับสถานะออกได้ ไม่เป็นไร

ข้อความนี้ไม่ถูกต้องที่จะเริ่มต้นด้วย:

#!/bin/bash
some_command &
pid="$!"
รอ -n "$pid"
echo "สถานะคือ ${?}"

หากคุณต้องการรับการแจ้งเตือนทันที คุณสามารถใช้เคล็ดลับตามสัญญาณบางอย่างได้

การจัดการของ SIGCHLD จะเป็นตัวเลือกที่ชัดเจนที่สุด แต่ (1) รองรับใน Bash เป็นรถ และ (2) แม้ว่า ชุด -b, กับดัก ตัวจัดการจะรอขอบเขตคำสั่ง

ที่กล่าวว่าเป็นตัวเลือกที่ดีที่สุดถัดไป (ซึ่งขัดจังหวะการประมวลผลเบื้องหน้าที่ใช้เวลานาน โดยทันที เมื่อไร some_command ล้มเหลว) คือ (เทียบเท่ากับ) สร้าง Ctrl+C สำหรับกลุ่มกระบวนการทั้งหมดของคุณ สิ่งนี้จะถูกส่งและดำเนินการทันที ตัวเชลล์เองสามารถจัดการกับสัญญาณและดำเนินการต่อได้หากต้องการ ในขณะที่กระบวนการเบื้องหน้าจะออกโดยค่าเริ่มต้น เป็นต้น

#!/bin/bash
ตั้ง -e

ตัวจัดการ () {
  echo 'สัญญาณล้มเหลวของคำสั่ง'
  กับดัก - INT
}
ตัวจัดการกับดัก INT

พื้นหลัง() {
  ท้องถิ่น -ir pid="$1"
  กะ
  "$@" || ฆ่า -INT -- -"$pid"
}
พื้นหลัง "$$" some_command &

# งานเบื้องหน้าที่ใช้เวลานาน
echo 'ก่อนการประมวลผลแบบยาว'
นอน 5 || echo 'การประมวลผลที่ยาวนานถูกขัดจังหวะ'
echo 'หลังจากประมวลผลนาน'

ลองเปลี่ยน some_command ด้วย (เช่น) นอน2 เพื่อทดสอบกรณี "สำเร็จ"

FedKad avatar
cn flag
ขอบคุณสำหรับคำตอบ. ใกล้เคียงกับที่ฉันต้องการมาก แต่ก็ยัง "ค่อนข้างซับซ้อน" นอกจากนี้ ฉันได้ชี้แจงข้อความก่อนหน้าของฉันโดยเพิ่มคำว่า **ทันที**

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา