Không có tập tin hoặc thư mục? Nhưng các tập tin tồn tại!


186

Tôi đã tải xuống một trò chơi (Shank) nhưng tệp bin không chạy. Lỗi được hiển thị khi tôi cố khởi chạy tệp thực thi là:

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

2
Có thể "chmod u + x ./shank*bin" trước?
lý86

cũng không nên là '.bin' thay vì '-bin', có thể đó chỉ là một lỗi đánh máy
Anake

Cảm ơn bạn đã trả lời của bạn. Tôi đã thực hiện lệnh bạn nói Agent86 nhưng tôi có kết quả tương tự. Tôi cũng đã tải xuống tệp .deb nhưng cũng có một vấn đề. Tôi không biết vấn đề gì với trò chơi này.
Francesco

Vui lòng xác nhận xem bạn có đang chạy cài đặt 64 bit hay không (đó là trường hợp phổ biến nhất cho sự cố này).
Gilles

Có, tôi xác nhận rằng tôi đang sử dụng kiến ​​trúc 64 bit trên máy tính xách tay của mình.
Francesco

Câu trả lời:


236

Có lẽ bạn đang cố chạy nhị phân 32 bit trên hệ thống 64 bit không cài đặt hỗ trợ 32 bit.

Có ba trường hợp bạn có thể nhận được thông báo. Không có tập tin hoặc thư mục nào như vậy:

  • Các tập tin không tồn tại. Tôi đoán bạn đã kiểm tra xem tập tin có tồn tại không (có lẽ vì trình bao hoàn thành nó).
  • Có một tập tin theo tên đó, nhưng đó là một liên kết tượng trưng lơ lửng.
  • Tệp tồn tại và thậm chí bạn có thể đọc nó (ví dụ: lệnh file shank-linux-120720110-1-binhiển thị một cái gì đó giống như EL ELF 32 bit thực thi LSB), và khi bạn cố gắng thực thi thì bạn đã nói rằng tệp không tồn tại.

Thông báo lỗi trong trường hợp cuối cùng này được thừa nhận là khó hiểu. Điều nó nói với bạn là một thành phần chính của môi trường thời gian chạy cần thiết để chạy chương trình bị thiếu. Thật không may, kênh thông báo lỗi chỉ có chỗ cho mã lỗi và không có thông tin bổ sung này thực sự là môi trường thời gian chạy đáng trách. Nếu bạn muốn phiên bản kỹ thuật của lời giải thích này, hãy đọc Nhận thông báo Không tìm thấy tin nhắn khi chạy một tệp nhị phân 32 bit trên hệ thống 64 bit .

Các filelệnh sẽ cho bạn biết hệ nhị phân này là chỉ là những gì. Với một vài ngoại lệ, bạn chỉ có thể chạy nhị phân cho kiến ​​trúc bộ xử lý mà bản phát hành Ubuntu của bạn dành cho. Ngoại lệ chính là bạn có thể chạy các tệp nhị phân 32 bit (x86, còn gọi là IA32) trên các hệ thống 64 bit (amd64, còn gọi là x86_64).

Trong Ubuntu tối đa 11.04, để chạy tệp nhị phân 32 bit khi cài đặt 64 bit, bạn cần cài đặt ia32-libsgói Cài đặt ia32-libs . Bạn có thể cần cài đặt các thư viện bổ sung (bạn sẽ nhận được thông báo lỗi rõ ràng nếu bạn làm như vậy).

Kể từ 11.10 (Oneiric) giới thiệu multiarch hỗ trợ, bạn vẫn có thể cài đặt ia32-libs, nhưng bạn có thể chọn một cách tiếp cận tốt hơn-grained, nó đủ để có được (cộng với bất kỳ thư viện cần thiết khác).libc6-i386 Cài đặt libc6-i386


Cảm ơn cho một câu trả lời tuyệt vời, Gilles. Mặc dù tôi chưa gặp phải vấn đề này (nhưng!), Tôi đã gửi câu trả lời của bạn đi để tham khảo trong tương lai.
Jim C

Cảm ơn bạn đã trả lời đầy đủ của bạn! Tệp bin tôi đã tải xuống là tệp duy nhất có sẵn ở định dạng này (bin). Vì vậy, tôi nghĩ là tốt cho tất cả các kiến ​​trúc. Tôi cũng đã tải xuống tệp .deb cho kiến ​​trúc của mình (64 bit) nhưng với các lỗi khác nhau. Tại thời điểm này, tôi nghĩ rằng trò chơi bị ảnh hưởng bởi một số lỗi hoặc tôi không thể cài đặt trò chơi này. Bây giờ tôi cố gắng tải libc6-i386 và tôi vẫn cố gắng cài đặt nó. Tôi sẽ viết lại nếu có thay đổi đáng kể. Cảm ơn bạn đã dành thời gian cho bạn.
Francesco

2
@Francesco Xin vui lòng gửi giải pháp! Nó có khả năng giúp những người khác cố gắng chạy Shank trên Ubuntu. Hoàn toàn ổn khi trả lời câu hỏi của bạn .
Gilles

1
Bạn có thể sử dụng lddđể kiểm tra nếu bạn thiếu một thư viện. ldd kgio_ext.socó thể nói điều gì đó giống như libruby.so.2.3 => not foundnhững người khác
EnabrenTane

1
Rõ ràng có một kịch bản khác khi bash: ...some...path...: No such file or directorycó thể hiển thị: sau khi di chuyển tệp thực thi. Bash dường như lưu trữ các đường dẫn đến các tệp thực thi được tìm thấy trong $ PATH; chạy hash -rđể xóa nó Xem: unix.stackexchange.com/a/5610/11352
akavel

53

Hệ thống Multiarch Ubuntu 64 bit

Chỉ làm theo câu trả lời này nếu đầu ra của file file-namechương trình,

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

Để chạy tập tin thực thi 32bit trong một đa vòm hệ thống Ubuntu 64 bit, bạn phải thêm i386kiến trúc và cũng có thể bạn phải cài đặt libc6:i386, libncurses5:i386, libstdc++6:i386ba gói thư viện.

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

Tôi sẽ sử dụng sudo cho lệnh cuối cùng: khởi chạy nhị phân 32 bit (vì vậy rõ ràng không phải do bạn hoặc Ubuntu biên dịch) vì sudo có thể gặp rủi ro. (tốt, ngay cả khi không root, được thừa nhận)
alci

những gì có thể cuối cùng nhưng nó hoạt động.
Avinash Raj

1
Cần lưu ý rằng nếu bạn đang sử dụng CentOS hoặc RedHat, câu trả lời này không áp dụng. Đã bị ném ra trong một vài giờ vì điều này.
omike

1
Trên Kali 2 64 bit, tôi chỉ phải cài đặtlibselinux1:i386
Aralox

4

Bằng cách cài đặt deb cho 32 bit, tôi nhận ra rằng tôi đã thiếu một số thư viện (ngoài ia32-libs và libc6). Trước tiên tôi đã giải quyết vấn đề này bằng cách đưa ra lệnh này:

sudo apt-get install -f          

Sau đó, tôi đã nhận được một lỗi khác:

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

Rõ ràng, các thư viện đã được cài đặt đúng. Không đi sâu vào chi tiết, tôi phải liên kết các thư viện bằng tay. Tôi nhận ra rằng đó cũng có thể là một giải pháp dễ dàng hơn thông qua Synaptic cài đặt các gói sau:

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

Sau đó, vấn đề tiếp theo là màn hình đen trong khi chơi, tôi đã giải quyết bằng cách thay thế tệp thực thi trong / Shank / bin bằng cách này: http://treefort.icculus.org/smb/smb-linux-mesa-hotfix-test.tar .bz2 .

Tôi hy vọng nó sẽ hữu ích cho ai đó. Nếu bạn cần thêm trợ giúp hoặc biết thêm chi tiết xin vui lòng liên hệ với tôi.


3

Đây là bản ghi hiển thị thêm một chút về bản chất của sự cố và cách khắc phục sự cố kể từ Ubuntu 16.04. Lưu ý rằng mặc dù filebáo cáo "được liên kết động", lddbáo cáo "không phải là tệp thực thi động".

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

Khi bạn cài đặt libc6: i386, mọi thứ bắt đầu cải thiện ...

$ 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

Để hoàn thành công việc, bạn có thể cần xác định và cài đặt từng thư viện bổ sung ...

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

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

Tôi không biết nếu có một cách có hệ thống để xác định các thư viện chính xác để cài đặt. Có một chút phỏng đoán ánh xạ các thông báo lỗi thành tên gói (giúp hoàn thành tab).


ldd(không chính xác) báo cáo "không phải là một thực thi động".
tộc

3

Để mở rộng câu trả lời @Gilles, có ít nhất ba kịch bản dẫn đến lỗi này:

  1. Các tập tin không tồn tại.
  2. Các tập tin tồn tại nhưng là một liên kết tượng trưng lơ lửng.
  3. Tệp tồn tại (ví dụ filelệnh hoạt động), tạo ra một thông báo lỗi khó hiểu. Điều này có thể có nghĩa là có vấn đề với trình tải.

Các loại sự cố của trình tải:

  1. Trình tải của tệp thực thi không tồn tại. Bạn có thể kiểm tra điều này bằng lệnh tập tin và xem liệu trình tải có tồn tại không. Ví dụ

    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
    

    Thông báo interpreter /lib64/ld-lsb-x86-64.so.3; Nếu tập tin này không tồn tại, bạn cần cài đặt nó. Đối với trình tải đặc biệt này vào ngày 16.04, câu trả lời hóa ra là sudo apt-get install lsb.

  2. Các vấn đề với trình tải của tập lệnh (xem câu trả lời này ).

  3. Thiếu thư viện dùng chung - sử dụng ldd <file-name>để kiểm tra mọi thư viện "không tìm thấy". Xem câu trả lời này để biết thêm.

Trình tải không tồn tại có thể là do sự không phù hợp 32/64 bit hoặc một số lý do khác. Có thể có các loại lỗi trình tải khác mà tôi không biết.


1
Trong trường hợp của tôi, file lmutilđã không hiển thị trình thông dịch, nhưng lddđã làm và cài đặt đã lsbgiải quyết vấn đề.
davidA
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.