ไม่พบไฟล์หรือโฟลเดอร์? แต่ไฟล์มีอยู่!


186

ฉันดาวน์โหลดเกม (Shank) แล้ว แต่ไฟล์ bin ไม่ทำงาน ข้อผิดพลาดที่แสดงเมื่อฉันพยายามเปิดใช้งานโปรแกรมเรียกทำงานคือ:

bash: ./shank-linux-120720110-1-bin: No such file or directory

2
อาจเป็น "chmod u + x ./shank*bin" ก่อนหรือไม่
agent86

ก็ไม่ควรที่จะเป็น '.bin' มากกว่า '-bin' บางทีมันอาจจะเป็นแค่ตัวพิมพ์ใหญ่
Anake

ขอบคุณสำหรับการตอบกลับของคุณ. ฉันทำตามคำสั่งที่คุณพูด Agent86 แล้ว แต่ฉันก็มีผลลัพธ์เหมือนกัน ฉันได้ดาวน์โหลดไฟล์. deb ด้วย แต่ก็มีปัญหาเช่นกัน ฉันไม่รู้ว่าเกมนี้มีปัญหาอะไร
ฟรานเชสโก

โปรดยืนยันว่าคุณกำลังเรียกใช้การติดตั้ง 64 บิต (เป็นกรณีที่พบได้บ่อยที่สุดสำหรับปัญหานี้)
Gilles

ใช่ฉันยืนยันว่าฉันใช้สถาปัตยกรรม 64 บิตบนแล็ปท็อปของฉัน
ฟรานเชสโก

คำตอบ:


235

คุณอาจพยายามเรียกใช้ไบนารี 32 บิตบนระบบ 64 บิตที่ไม่ได้รับการสนับสนุน 32 บิต

มีสามกรณีที่คุณสามารถรับข้อความ“ ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว”:

  • ไฟล์นี้ไม่มีอยู่ ฉันคิดว่าคุณได้ตรวจสอบว่าไฟล์นั้นมีอยู่ (อาจเป็นเพราะเชลล์ทำเสร็จ)
  • มีไฟล์ชื่อนั้น แต่มันเป็นลิงก์สัญลักษณ์ห้อยต่องแต่ง
  • มีไฟล์อยู่และคุณสามารถอ่านได้ (ตัวอย่างเช่นคำสั่งfile shank-linux-120720110-1-binจะแสดงบางอย่างเช่น "ปฏิบัติการเอลเอสบี 32- บิต LSB ... ") และเมื่อคุณพยายามเรียกใช้งานคุณจะได้รับแจ้งว่าไฟล์นั้นไม่มีอยู่

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

fileคำสั่งจะบอกคุณเพียงแค่สิ่งที่ไบนารีนี้อยู่ ด้วยข้อยกเว้นบางประการคุณสามารถเรียกใช้ไบนารีสำหรับสถาปัตยกรรมตัวประมวลผลที่ Ubuntu ของคุณใช้สำหรับเท่านั้น ข้อยกเว้นหลักคือคุณสามารถรันไบนารีแบบ 32 บิต (x86, aka IA32) บนระบบ 64- บิต (amd64, aka x86_64)

ใน Ubuntu ถึง 11.04 เพื่อใช้ไบนารี 32 บิตในการติดตั้ง 64 บิตคุณจำเป็นต้องติดตั้งia32-libs ติดตั้ง ia32-libsแพคเกจ คุณอาจต้องติดตั้งไลบรารีเพิ่มเติม (คุณจะได้รับข้อความแสดงข้อผิดพลาดอย่างชัดเจน)

ตั้งแต่ 11.10 (oneiric) แนะนำการสนับสนุนมัลติฮาร์ทคุณยังสามารถติดตั้งia32-libsได้ แต่คุณสามารถเลือกวิธีที่ละเอียดยิ่งขึ้นก็เพียงพอที่จะรับ(รวมทั้งไลบรารีที่จำเป็นอื่น ๆ )libc6-i386 ติดตั้ง libc6-i386


ขอบคุณสำหรับคำตอบที่ยอดเยี่ยม Gilles ในขณะที่ฉันยังไม่ประสบปัญหานี้ (แต่!) ฉันได้ส่งคำตอบของคุณออกไปสำหรับการอ้างอิงในอนาคต
Jim C

ขอบคุณสำหรับคำตอบที่ครบถ้วนสมบูรณ์! ไฟล์ bin ที่ฉันดาวน์โหลดเป็นไฟล์เดียวที่มีในรูปแบบนี้ (bin) ดังนั้นฉันคิดว่าดีสำหรับสถาปัตยกรรมทั้งหมด ฉันยังดาวน์โหลดไฟล์. deb สำหรับสถาปัตยกรรมของฉัน (64 บิต) แต่มีข้อผิดพลาดแตกต่างกัน ณ จุดนี้ฉันคิดว่าเกมได้รับผลกระทบจากข้อบกพร่องบางอย่างหรือฉันไม่สามารถติดตั้งเกมนี้ได้ ตอนนี้ฉันพยายามดาวน์โหลด libc6-i386 และฉันยังคงพยายามติดตั้ง ฉันจะเขียนอีกครั้งหากมีการเปลี่ยนแปลงที่สำคัญ ขอบคุณสำหรับเวลา
ฟรานเชสโก

2
@ ฟรานเชสโกกรุณาโพสต์โซลูชัน! มีแนวโน้มที่จะช่วยให้คนอื่นพยายามใช้ Shank บน Ubuntu คุณสามารถตอบคำถามของคุณเองได้อย่างสมบูรณ์
Gilles

1
คุณสามารถใช้lddเพื่อตรวจสอบว่าคุณไม่มีห้องสมุดหรือไม่ ldd kgio_ext.soอาจพูดบางสิ่งบางอย่างเหมือนlibruby.so.2.3 => not foundคนอื่น ๆ
EnabrenTane

1
เห็นได้ชัดว่ามีสถานการณ์อื่นเมื่อbash: ...some...path...: No such file or directoryสามารถแสดง: หลังจากย้ายไฟล์ปฏิบัติการ Bash ดูเหมือนว่าจะแคชพา ธ ไปยัง executables ที่พบใน $ PATH; วิ่งhash -rเพื่อล้างมัน ดู: unix.stackexchange.com/a/5610/11352
akavel

53

ระบบ Ubuntu Multiarch 64 บิต

ทำตามคำตอบนี้เฉพาะเมื่อผลลัพธ์ของfile file-nameรายการ

file-name: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped

เมื่อต้องการเรียกใช้แฟ้มที่ปฏิบัติการ 32 บิตใน 64 บิตหลายโค้งระบบอูบุนตู, คุณจะต้องเพิ่มi386สถาปัตยกรรมและยังให้คุณมีการติดตั้งlibc6:i386, libncurses5:i386, libstdc++6:i386เหล่านี้สามแพคเกจห้องสมุด

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
./file-name

ฉันจะใช้ sudo สำหรับคำสั่งสุดท้าย: เปิดตัวไบนารี 32 บิต (เห็นได้ชัดว่าไม่ได้รวบรวมโดยคุณหรือ Ubuntu) เนื่องจาก sudo อาจมีความเสี่ยง (ดีแม้ไม่ใช่รูท, น่ายอมรับ)
alci

มันอาจจะเป็นในที่สุด แต่มันก็ใช้งานได้
Avinash Raj

1
ควรสังเกตว่าถ้าคุณใช้ CentOS หรือ RedHat คำตอบนี้จะไม่มีผล ถูกโยนทิ้งไปสองสามชั่วโมงด้วยเหตุนี้
ข้าม

1
บน Kali 2 64 บิตฉันต้องติดตั้งเท่านั้นlibselinux1:i386
Aralox

4

ด้วยการติดตั้ง deb สำหรับ 32 บิตฉันรู้ว่าฉันขาดไลบรารี่บางส่วน (นอกเหนือจาก ia32-libs และ libc6) ฉันก่อนแก้ไขปัญหานี้โดยให้คำสั่งนี้:

sudo apt-get install -f          

จากนั้นฉันได้รับข้อผิดพลาดอื่น:

Message: SDL_GL_LoadLibrary 
Error: Failed loading libGL.so.1

เห็นได้ชัดว่าห้องสมุดเหล่านี้ติดตั้งอย่างถูกต้อง โดยไม่ต้องลงรายละเอียดฉันต้องเชื่อมโยงห้องสมุดด้วยมือ ฉันรู้แล้วว่าสามารถแก้ปัญหาได้ง่ายขึ้นผ่านทาง Synaptic ติดตั้งแพคเกจต่อไปนี้:

libgl1-mesa-glx:i386
libgl1-mesa-dri: i386.

หลังจากนั้นปัญหาต่อไปคือหน้าจอสีดำในขณะที่เล่นซึ่งฉันแก้ไขโดยแทนที่ปฏิบัติการใน / Shank / bin ด้วย: http://treefort.icculus.org/smb/smb-linux-mesa-hotfix-test.tar .bz2

ฉันหวังว่ามันจะเป็นประโยชน์กับใครบางคน หากคุณต้องการความช่วยเหลือเพิ่มเติมหรือรายละเอียดเพิ่มเติมโปรดติดต่อฉัน


3

นี่คือหลักฐานที่แสดงให้เห็นเพิ่มเติมเล็กน้อยเกี่ยวกับลักษณะของปัญหาและวิธีการแก้ไขในฐานะ Ubuntu 16.04 โปรดสังเกตว่าถึงแม้ว่าfileรายงาน "ลิงก์แบบไดนามิก" แต่lddรายงาน "ไม่ใช่ไฟล์ที่รันได้แบบไดนามิก"

$ ./myprogram
bash: myprogram: No such file or directory

$ file myprogram
myprogram: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.2.5, not stripped

$ ldd myprogram
    not a dynamic executable

เมื่อคุณติดตั้ง libc6: i386 สิ่งต่าง ๆ เริ่มดีขึ้น ...

$ sudo apt-get install libc6:i386 # the initial fix
...

$ ldd myprogram
    linux-gate.so.1 =>  (0xf77fd000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7626000)
    /lib/ld-linux.so.2 (0x56578000)

$ ./myprogram
myprogram: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

เพื่อให้งานสำเร็จคุณอาจต้องระบุและติดตั้งไลบรารีเพิ่มเติมทีละรายการ ...

$ sudo apt-get install libstdc++6:i386 ## may require various additional libs

$ ./myprogram
... works correctly ...

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


ldd(ไม่ถูกต้อง) รายงาน "ไม่ใช่ไฟล์เรียกทำงานแบบไดนามิก"
สูงศักดิ์

3

หากต้องการขยายคำตอบ @Gilles มีอย่างน้อยสามสถานการณ์ที่ทำให้เกิดข้อผิดพลาดนี้:

  1. ไฟล์นี้ไม่มีอยู่
  2. ไฟล์มีอยู่ แต่เป็นลิงก์สัญลักษณ์ห้อยต่องแต่ง
  3. ไฟล์มีอยู่ (เช่นfileคำสั่งใช้งานได้) ทำให้เกิดข้อผิดพลาดที่ทำให้งง นี่อาจหมายความว่ามีปัญหากับตัวโหลด

หมวดหมู่ของปัญหาตัวโหลด:

  1. โหลดเดอร์ของ executable ไม่มีอยู่ คุณสามารถตรวจสอบได้โดยใช้คำสั่ง file และดูว่าตัวโหลดนั้นมีอยู่หรือไม่ เช่น

    file lmgrd
    lmgrd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-lsb-x86-64.so.3, for GNU/Linux 2.6.18, stripped
    

    ประกาศinterpreter /lib64/ld-lsb-x86-64.so.3; หากไฟล์นี้ไม่มีอยู่คุณจะต้องติดตั้ง สำหรับรถตักดินแบบนี้โดยเฉพาะในวันที่ 16.04 sudo apt-get install lsbคำตอบเปิดออกมาเป็น

  2. ปัญหาเกี่ยวกับโหลดเดอร์ของสคริปต์ (ดูคำตอบนี้ )

  3. ไม่มีไลบรารีที่ใช้ร่วมกัน - ใช้ldd <file-name>เพื่อตรวจสอบไลบรารี "ไม่พบ" ใด ๆ ดูคำตอบนี้สำหรับข้อมูลเพิ่มเติม

ตัวโหลดที่ไม่ได้มีอยู่อาจเป็นเพราะ 32/64 บิตไม่ตรงกันหรือสาเหตุอื่น อาจมีข้อผิดพลาดของโหลดเดอร์ชนิดอื่นที่ฉันไม่รู้


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