บังคับใช้“ ไม่ดี” (ไม่ใช่ 0) ส่งคืนรหัสคำสั่งเทอร์มินัลหรือไม่


8

ฉันมีเฟรมเวิร์กที่เขียนด้วยไพ ธ อนและเพื่อวัตถุประสงค์ในการทดสอบโดยทั่วไปฉันต้องการทำ subprocess (หรือที่เรียกว่า shell call) ... ซึ่งควรจะกลับมาพร้อมกับ RC! = 0 ฉันพยายามเรียกใช้ไฟล์ปฏิบัติการที่ไม่มีอยู่ หรือเรียกใช้ "ทางออก 1"; แต่มีเหตุผลบางประการที่แปลเป็น FileNotFoundError

ดังนั้นฉันสามารถทำอะไรได้อีกเพื่อเรียกรหัสส่งคืน! = 0 (ในลักษณะ "น่าเชื่อถือ" หมายถึงคำสั่งไม่ควรคืนค่า 0 ทันทีที่เวลาในอนาคต)

ฉันคิดว่าจะ "ค้นหา" สำหรับไบนารีที่เรียกว่า exit แต่ก็เป็นเช่นนั้น:

> /usr/bin/env exit
/usr/bin/env: exit: No such file or directory

1
exit 1เป็นวิธีพิสูจน์อนาคต FileNotFoundError ต้องเกิดจากสิ่งอื่น
Jos

เมื่อฉันทำ "ทางออกใด" ... ไม่พบสิ่งใด ดังนั้นฉันคิดว่า "exit" เป็นฟังก์ชันทุบตี อาจไม่พร้อมใช้งานเมื่อฉันทำการเรียก subprocess
GhostCat

nitpicking ทางเทคนิค: รหัสส่งคืนที่ไม่เป็นศูนย์ไม่ได้มีไว้เพื่อบ่งบอกถึงสถานการณ์ที่ไม่ดีเนื่องจากคำถามของคุณดูเหมือนจะบอกเป็นนัย "0" นั้นหมายถึง "ไม่มีอะไรผิดปกติ" เป็นเพียงเรื่องของการประชุม ในความเป็นจริงคุณมีข้อมูล 8 บิตเพื่อถ่ายทอดกลับไปยังกระบวนการเรียก
Jos

@Jos ฉันเข้าใจว่า แต่ประเด็นก็คือ RC! = 0 จะนำไปสู่ข้อยกเว้นเฉพาะจาก subprocess.check_call () ฉันต้องการบังคับใช้เงื่อนไขนั้นเพื่อให้แน่ใจว่ามีการจัดการอย่างถูกต้อง (เพื่อให้แน่ใจว่าสถานการณ์ RC! = 0 ในการทดสอบจริงได้รับการจัดการตามที่ควรจะเป็น)
GhostCat

2
แล้วไง/bin/falseล่ะ
ขับขี่เหล็ก

คำตอบ:


18

หากคุณกำลังมองหาคำสั่งระบบที่ส่งคืนรหัสออกที่ไม่เป็นศูนย์เสมอ/bin/falseดูเหมือนว่าควรจะทำงานให้คุณ จากman false:

NAME
       false - do nothing, unsuccessfully

SYNOPSIS
       false [ignored command line arguments]
       false OPTION

DESCRIPTION
       Exit with a status code indicating failure.

ไม่มันไม่ อย่างน้อยใน Ubuntu 16.04.4 ที่รัน bash บรรทัดคำสั่งต่อไปนี้ให้ 1 แทน 5:/bin/false 5; echo $?
fviktor

@fviktor ออกจากสถานะไม่เป็นศูนย์ - ดังที่บทสรุปกล่าวว่าอาร์กิวเมนต์บรรทัดคำสั่ง (เช่น5) จะถูกละเว้น
steeldriver

คุณถูก. ไม่มีทางที่จะควบคุมรหัสทางออกที่ไม่ใช่ศูนย์จริง
fviktor

7

คุณสามารถสร้างรหัสส่งคืนใหม่ด้วยคำสั่งbash -c "exit RETURNCODE"แทนที่ "RETURNCODE" ด้วยหมายเลขใด ๆ โปรดทราบว่ามันจะถูกตัดเป็นจำนวนเต็ม 8 บิต (0 ... 255) โดย (RETURNCODE mod 256)

คุณสามารถตรวจสอบรหัสการกลับมาของคำสั่งของเชลล์ที่ผ่านมาภายในอาคารผู้โดยสาร (!)echo $?ที่มีการดำเนินการ "$?" ตัวแปรประกอบด้วยโค้ดส่งคืนล่าสุดและ "echo" พิมพ์ไปยังเอาต์พุตมาตรฐาน


+1 โปรดทราบว่าหากคุณกำลังเขียนสิ่งนี้ในเชลล์สคริปต์คุณสามารถทำได้exit RETURNCODE(โดยไม่มีbash -cส่วนใดส่วนหนึ่ง)
Matt Browne

0

หลังจากการทดสอบเพิ่มเติมฉันพบว่าปัญหาของฉันไม่ได้อยู่ที่ด้าน "Linux"

Python มีโมดูล shlex ซึ่งควรใช้เพื่อ "แยก" สตริงคำสั่ง เมื่อฉันเปลี่ยนการเรียกใช้โพรเซสซิงย่อยเพื่อใช้เอาต์พุตของการshlex.split()เรียกใช้ "bash exit 1" ให้สิ่งที่ฉันต้องการ

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