ความแตกต่างระหว่าง“ ไม่พบคำสั่ง” และ“ ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว”?


33

ตัวอย่างเช่น:

$ node
-bash: /usr/local/bin/node: No such file or directory
$ foo
-bash: foo: command not found

ความแตกต่างคืออะไร? ในทั้งสองกรณีnodeและfooเป็นคำสั่งที่ไม่ถูกต้อง แต่ดูเหมือนว่า Unix จะไม่พบnodeไบนารี เมื่อถอนการติดตั้งโปรแกรมเช่นnodeมีวิธีล้างข้อมูลนี้เพื่อให้ได้รับหรือไม่

$ node
-bash: node: command not found

แก้ไข:

ผลลัพธ์จากtypeคำสั่ง:

$ type node
node is hashed (/usr/local/bin/node)
$ type foo
-bash: type: foo: not found

คุณสามารถอัปเดตคำถามของคุณด้วยผลลัพธ์ของทั้งสองtype nodeและtype foo(แม้ว่าอาจจะเป็นเพียงคนแรกที่เป็นประโยชน์จริงๆ)
Eric Renouf

@EricRenouf โอเคฉันทำแล้ว
gwg

2
อาจเป็นได้ว่า 'node' เป็นลิงก์สัญลักษณ์จาก / usr / bin / node -> / usr / local / bin / node และหลังไม่สามารถใช้ได้ดังนั้นข้อผิดพลาดซึ่งจะแนะนำ / usr / local / bin / node ถูกลบ หลังจากสร้างลิงก์สัญลักษณ์
likewhoa

คำตอบ:


59

นั่นเป็นเพราะbashจำตำแหน่งคำสั่งของคุณเก็บไว้ในตารางแฮช

หลังจากที่คุณถอนการติดตั้งnode, ตารางแฮชที่ไม่ได้ล้างbashยังคงคิดว่าnodeที่/usr/local/bin/nodeข้ามPATHการค้นหาและเรียกโดยตรงโดยใช้/usr/local/bin/node execve()ตั้งแต่เมื่อnodeไม่มีอยู่อีกต่อไปexecve()ส่งคืนENOENTข้อผิดพลาดหมายความว่าไม่มีไฟล์หรือไดเรกทอรีดังกล่าวbashรายงานข้อผิดพลาดนั้นถึงคุณ

ในbashคุณสามารถลบรายการออกจากตารางแฮช:

hash -d node

หรือลบตารางแฮชทั้งหมด ( ทำงานในเชลล์ POSIX ทั้งหมด ):

hash -r

2
โปรดทราบว่าไม่จำเป็นต้อง/usr/local/bin/nodeหายไป หากไฟล์นั้นเป็นไฟล์ปฏิบัติการที่ลิงก์ได้แบบไดนามิกและหนึ่งในการพึ่งพานั้นหายไปคุณจะได้รับข้อความ "ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว" สิ่งนี้จะทำให้คุณคลั่งไคล้จนกว่าคุณจะลองlddใช้ไฟล์นั้น
Guntram Blohm สนับสนุนโมนิก้า

@GuntramBlohm แต่ใน Linux ทุบตี distros บางอย่างได้รับการแก้ไขเพื่อพิมพ์ข้อความแสดงข้อผิดพลาดที่เข้าใจได้ง่ายขึ้นเช่นprogname: error while loading shared libraries: badLib.so.1: cannot open shared object file: No such file or directory(หรืออาจจะไม่ทุบตีในกรณีนี้ แต่ld-linux.so)
Ruslan

@Ruslan จากประสบการณ์ของฉันคุณจะได้รับ "ข้อผิดพลาดขณะโหลดไลบรารีที่ใช้ร่วมกัน" หากเป็นไลบรารีที่แชร์ "ธรรมดา" ที่ขาดหายไปและ "ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว" ที่อธิบายไม่ได้หากเป็นตัวเชื่อมโยงแบบไดนามิกที่ขาดหายไป สิ่งนี้สมเหตุสมผลเมื่อคุณตระหนักว่าตัวพิมพ์เล็กถูกตรวจพบโดยตัวเชื่อมโยงแบบไดนามิกในขณะที่ตัวตรวจจับตัวหลังถูกตรวจพบโดยเคอร์เนลและมันง่ายกว่าสำหรับตัวเชื่อมโยงแบบไดนามิกในการพิมพ์ข้อความที่มีประโยชน์ ( execveเขียนไปยัง stderr อาจจะละเมิด POSIX หรือบางอย่าง)
zwol

@zwol อ่าใช่นั่นคือสิ่งที่ distros (เช่น CentOS) ใช้สำหรับแก้ปัญหา รุ่น patched /lib/ld-linux.so.2: bad ELF interpreter: No such file or directoryดังกล่าวแล้วพิมพ์ข้อผิดพลาดเช่น
Ruslan

-6

ฉันพบใน Ubuntu Linux 16.04 ว่า "ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว" หมายความว่าคุณต้องเปลี่ยนไดเรกทอรีการทำงานปัจจุบันของคุณในขณะที่ "ไม่พบคำสั่ง" หมายความว่าคุณต้องใช้ apt-get install xxxyyy_zzz เพื่อแก้ไขปัญหา


10
หาก cwd ของคุณมีอิทธิพลกับสิ่งที่จะพบหรือไม่ (เว้นแต่คุณจะใส่คำนำหน้าด้วย. /), PATH ของคุณจะถูกตั้งค่าในลักษณะที่ค่อนข้างไม่ปลอดภัย และคำสั่งไม่ได้พบไม่ได้เป็นปัญหาเสมอคุณต้องการที่จะแก้ไข :)
rackandboneman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.