ไฟล์ปฏิบัติการที่ชื่อ 'ทดสอบ' อยู่ใน $ PATH แต่จะไม่ทำงาน


13

ฉันมีไฟล์ใน $ HOME / bin (ก่อนที่คุณจะถามใช่มันอยู่ในเส้นทางของฉัน) เรียกว่าtestฉันยืนยันว่าสามารถดำเนินการได้ดีเมื่อฉันรันด้วยพา ธ เต็มไปยังไฟล์ อย่างไรก็ตามฉันได้รับปัญหาแปลก ๆ จริง ๆ เมื่อฉันไม่เรียกใช้วิธีนี้ เมื่อฉันเพิ่งรันtestในเทอร์มินัลมันไม่ทำอะไรเลยและส่งคืนทันที ฉันรู้ว่านี่ไม่ใช่ปัญหาในการค้นหาไฟล์ด้วยเหตุผลหลายประการ:

  1. ไม่มีข้อความแสดงข้อผิดพลาด โดยปกติหากไม่พบไฟล์หรือไม่สามารถดำเนินการข้อความจะถูกพิมพ์ออกมาโดยบอกว่า

  2. การรันwhich testยังคงส่งคืนพา ธ ไฟล์ที่ถูกต้อง

  3. น่าจะเป็นที่แปลกประหลาดของทั้งหมด - straceสคริปต์ที่ทำงานได้ดีเมื่อวิ่งผ่าน ฉันพยายามใช้straceเพื่อดูว่าฉันสามารถทราบได้ว่าเกิดอะไรขึ้น แต่เมื่อฉันใช้งานด้วยstraceมันทำงานได้อย่างที่คาดไว้กับปัญหา 0 ข้อ



เคล็ดลับแรกที่wiki-dev.bash-hackers.org/scripting/debuggingtips
Mark Wagner

คำตอบ:


45

testเป็นชื่อที่โชคร้ายที่จะใช้มันเป็นยูทิลิตี้มาตรฐานสำหรับเงื่อนไขการทดสอบ (อันที่จริงมันเป็นคำสั่งเดียวกับที่[อยู่ในif [ ... ]นั้นมันดูเหมือนเป็นเรื่องเกี่ยวกับการสร้างประโยค แต่เป็นเพียงคำสั่งปกติ)

testยังสร้างขึ้นในเช่น Bash ดังนั้นการเรียกใช้จะtestไม่ค้นหาไบนารีของคุณจากเส้นทาง

bash$ help test | head
test: test [expr]
    Evaluate conditional expression.

    Exits with a status of 0 (true) or 1 (false) depending on
    the evaluation of EXPR.  Expressions may be unary or binary.  
    [...]

test โดยไม่มีข้อโต้แย้งจะส่งกลับ 1 (เท็จ)

การรันstrace testไม่เกี่ยวข้องกับเชลล์บิวด์อินเนื่องจากstraceไม่มีการใช้งานยูทิลิตี้ใด ๆ PATHมันก็ใช้สิ่งที่พบในของคุณ โปรดทราบว่าคุณอาจจะมีมาตรฐานtestใน/bin/testหรือ/usr/bin/testดังนั้นหากที่จะเป็นครั้งแรกในPATH, straceจะวิ่งว่า

ใน Bash ของฉันwhichยังเป็นคำสั่งจากภายนอกดังนั้นจึงไม่มีความคิดเกี่ยวกับบิวด์อินเช่นกัน บนมืออื่น ๆ , คำสั่งเป็น builtin เปลือกและจะแสดงให้เห็นว่าtypetype testtest is a shell builtin

ดูเพิ่มเติม: ทำไมไม่ใช้ "อัน" จะใช้อะไรดี?


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