Tidak ada berkas atau direktori seperti itu? Tetapi file itu ada!

186

Saya sudah mengunduh game (Shank) tetapi file bin tidak berjalan. Kesalahan yang ditampilkan ketika saya mencoba meluncurkan executable adalah:

bash: ./shank-linux-120720110-1-bin: No such file or directory
Francesco
sumber
2
Mungkin "chmod u + x ./shank*bin" dulu?
agent86
juga bukankah seharusnya '.bin' daripada '-bin', mungkin itu hanya kesalahan ketik
Anake
Terimakasih atas balasan anda. Saya telah melakukan perintah yang Anda katakan Agent86 tetapi saya memiliki hasil yang sama. Saya juga mengunduh file .deb tetapi ada masalah juga. Saya tidak tahu masalah apa yang ada pada game ini.
Francesco
Harap konfirmasi apakah Anda menjalankan instalasi 64-bit (itu kasus paling umum untuk masalah ini).
Gilles
Ya saya mengkonfirmasi bahwa saya menggunakan arsitektur 64-bit di laptop saya.
Francesco

Jawaban:

236

Anda mungkin mencoba menjalankan biner 32-bit pada sistem 64-bit yang tidak memiliki dukungan 32-bit yang diinstal.

Ada tiga kasus di mana Anda bisa mendapatkan pesan "Tidak ada file atau direktori":

  • File tidak ada. Saya kira Anda sudah memeriksa bahwa file tersebut memang ada (mungkin karena shell menyelesaikannya).
  • Ada file dengan nama itu, tapi itu adalah tautan simbolik yang menjuntai.
  • File ada, dan Anda bahkan dapat membacanya (misalnya, perintah file shank-linux-120720110-1-binmenampilkan sesuatu seperti "ELF 32-bit LSB executable ..."), namun ketika Anda mencoba untuk mengeksekusinya Anda diberitahu bahwa file tersebut tidak ada.

Pesan kesalahan dalam kasus terakhir ini memang membingungkan. Apa yang dikatakannya kepada Anda adalah bahwa komponen kunci dari lingkungan runtime yang diperlukan untuk menjalankan program tidak ada. Sayangnya, saluran melalui mana kesalahan dilaporkan hanya memiliki ruang untuk kode kesalahan dan tidak untuk informasi tambahan ini bahwa itu benar-benar lingkungan runtime yang harus disalahkan. Jika Anda menginginkan versi teknis dari penjelasan ini, baca Memperoleh pesan "Tidak ditemukan" saat menjalankan biner 32-bit pada sistem 64-bit .

The fileperintah akan memberitahu Anda apa biner ini. Dengan beberapa pengecualian, Anda hanya dapat menjalankan biner untuk arsitektur prosesor untuk Ubuntu Anda. Pengecualian utama adalah Anda dapat menjalankan binari 32-bit (x86, alias IA32) pada sistem 64-bit (amd64, alias x86_64).

Di Ubuntu hingga 11,04, untuk menjalankan biner 32-bit pada instalasi 64-bit, Anda perlu menginstal ia32-libspaket Instal ia32-libs . Anda mungkin perlu menginstal pustaka tambahan (Anda akan mendapatkan pesan kesalahan eksplisit jika melakukannya).

Karena 11.10 (oneiric) memperkenalkan dukungan multiarch , Anda masih dapat menginstal ia32-libs, tetapi Anda dapat memilih pendekatan yang lebih halus, cukup untuk mendapatkan (ditambah perpustakaan lain yang diperlukan).libc6-i386 Instal libc6-i386

Gilles
sumber
Terima kasih atas jawaban yang bagus, Gilles. Meskipun saya belum mengalami masalah ini (belum!), Saya telah mengirimkan jawaban Anda untuk referensi di masa mendatang.
Jim C
Terima kasih atas jawaban lengkap Anda! Bin file yang saya unduh adalah satu-satunya yang tersedia dalam format ini (bin). Jadi saya pikir bagus untuk semua arsitektur. Saya juga mengunduh file deb untuk arsitektur saya (64bit) tetapi dengan kesalahan yang berbeda. Pada titik ini saya pikir permainan dipengaruhi oleh beberapa bug atau saya tidak dapat menginstal game ini. Sekarang saya mencoba mengunduh libc6-i386 dan saya masih mencoba untuk menginstalnya. Saya akan menulis lagi jika ada perubahan signifikan. Terima kasih atas waktunya.
Francesco
2
@ Francesco, silakan kirim solusinya! Ini mungkin untuk membantu orang lain yang mencoba menjalankan Shank di Ubuntu. Tidak apa-apa untuk menjawab pertanyaan Anda sendiri .
Gilles
1
Anda dapat menggunakannya ldduntuk memeriksa apakah Anda kehilangan perpustakaan. ldd kgio_ext.somungkin mengatakan sesuatu seperti libruby.so.2.3 => not foundantara lain
EnabrenTane
1
Tampaknya ada skenario lain ketika bash: ...some...path...: No such file or directorybisa muncul: setelah memindahkan file yang dapat dieksekusi. Bash tampaknya men-cache path ke executable yang ditemukan di $ PATH; lari hash -runtuk membersihkannya. Lihat: unix.stackexchange.com/a/5610/11352
akavel
53

64 bit sistem Ubuntu Multiarch

Ikuti jawaban ini hanya jika output file file-namemenunjukkan,

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

Untuk menjalankan file executable 32bit dalam multi-arch sistem Ubuntu 64 bit, Anda harus menambahkan i386arsitektur dan juga Anda harus menginstal libc6:i386, libncurses5:i386, libstdc++6:i386tiga paket perpustakaan tersebut.

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
./file-name
Avinash Raj
sumber
Saya akan menggunakan sudo untuk perintah terakhir: meluncurkan biner 32bit (jadi jelas tidak dikompilasi oleh Anda atau Ubuntu) karena sudo bisa berisiko. (yah, bahkan sebagai non root,
diakui
apa pun itu pada akhirnya tetapi berhasil.
Avinash Raj
1
Harus dicatat bahwa jika Anda menggunakan CentOS atau RedHat, jawaban ini tidak berlaku. Terlempar selama beberapa jam karena ini.
omikes
1
Pada Kali 2 64 bit, saya hanya perlu menginstallibselinux1:i386
Aralox
4

Dengan menginstal deb selama 32 bit saya menyadari bahwa saya kehilangan beberapa perpustakaan (selain ia32-libs dan libc6). Saya pertama kali memecahkan masalah ini dengan memberikan perintah ini:

sudo apt-get install -f          

Lalu saya mendapat kesalahan lain:

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

Jelas, perpustakaan ini dipasang dengan benar. Tanpa merinci saya harus menghubungkan perpustakaan dengan tangan. Saya menyadari bahwa itu juga bisa menjadi solusi yang lebih mudah melalui Synaptic menginstal paket-paket berikut:

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

Setelah itu masalah berikutnya adalah layar hitam saat bermain, yang saya selesaikan dengan mengganti executable di / Shank / bin dengan ini: http://treefort.icculus.org/smb/smb-linux-mesa-hotfix-test.tar .bz2 .

Semoga bermanfaat bagi seseorang. Jika Anda memerlukan bantuan lebih banyak atau lebih banyak detail, jangan ragu untuk menghubungi saya.

Francesco
sumber
3

Berikut adalah transkrip yang menunjukkan lebih banyak tentang sifat masalahnya, dan cara memperbaikinya pada Ubuntu 16.04. Perhatikan bahwa meskipun filelaporan "ditautkan secara dinamis", lddlaporan "tidak dapat dieksekusi secara dinamis".

$ ./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

Setelah Anda menginstal libc6: i386, hal-hal mulai membaik ...

$ 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

Untuk menyelesaikan pekerjaan, Anda mungkin perlu mengidentifikasi dan menginstal perpustakaan tambahan satu per satu ...

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

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

Saya tidak tahu apakah ada cara sistematis untuk mengidentifikasi perpustakaan yang benar untuk diinstal. Ada sedikit dugaan yang memetakan pesan kesalahan ke nama paket (penyelesaian tab membantu).

bangsawan
sumber
ldd(salah) melaporkan "bukan eksekusi dinamis".
Nobar
3

Untuk memperluas jawaban @Gilles, setidaknya ada tiga skenario yang menghasilkan kesalahan ini:

  1. File tidak ada.
  2. File itu ada tetapi merupakan tautan simbolik yang menjuntai.
  3. File ada (mis. filePerintah berfungsi), membuat pesan kesalahan yang membingungkan. Ini mungkin berarti ada masalah dengan loader.

Kategori masalah loader:

  1. Loader yang dapat dieksekusi tidak ada. Anda dapat memeriksa ini menggunakan perintah file dan melihat apakah loader memang ada. Misalnya

    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
    

    Perhatikan interpreter /lib64/ld-lsb-x86-64.so.3; jika file ini tidak ada, Anda harus menginstalnya. Untuk pemuat khusus ini pada 16,04, jawabannya ternyata sudo apt-get install lsb.

  2. Masalah dengan pemuat skrip (lihat jawaban ini ).

  3. Pustaka bersama yang hilang - gunakan ldd <file-name>untuk memeriksa pustaka "tidak ditemukan". Lihat jawaban ini untuk info lebih lanjut.

Loader yang tidak ada dapat disebabkan oleh ketidakcocokan 32/64 bit atau alasan lainnya. Mungkin ada jenis kesalahan pemuat lainnya yang tidak saya ketahui.

jtpereyda
sumber
1
Dalam kasus saya, file lmutiltidak menunjukkan penerjemah, tetapi lddmelakukannya, dan menginstal lsbmemecahkan masalah.
davidA