"Không có tệp hoặc thư mục như vậy" nhưng nó tồn tại


93

Tôi chỉ muốn chạy một tệp thực thi từ dòng lệnh ./arm-mingw32ce-g++, nhưng sau đó tôi nhận được thông báo lỗi,

bash: ./arm-mingw32ce-g++: No such file or directory

Tôi đang chạy Ubuntu Linux 10.10. ls -ldanh sách

-rwxr-xr-x 1 root root  433308 2010-10-16 21:32 arm-mingw32ce-g++

Sử dụng sudo ( sudo ./arm-mingw32ce-g++) cho

sudo: unable to execute ./arm-mingw32ce-g++: No such file or directory

Tôi không biết tại sao hệ điều hành thậm chí không thể nhìn thấy tệp khi nó ở đó. Có suy nghĩ gì không?

Câu trả lời:


81

Lỗi này có thể có nghĩa là ./arm-mingw32ce-g++nó không tồn tại (nhưng nó có), hoặc nó tồn tại và là một tệp thực thi được liên kết động được kernel nhận ra nhưng có bộ tải động không khả dụng. Bạn có thể xem trình tải động nào được yêu cầu khi chạy ldd /arm-mingw32ce-g++; bất cứ thứ gì được đánh dấunot found là trình tải động hoặc thư viện mà bạn cần cài đặt.

Nếu bạn đang cố chạy tệp nhị phân 32-bit trên cài đặt amd64:

  • Lên đến Ubuntu 11.04, hãy cài đặt gói ia32-libs.
  • Trên Ubuntu 11.10, hãy cài đặt ia32-libs-multiarch.
  • Bắt đầu với 12.04, hãy cài đặt ia32-libs-multiarchhoặc chọn một bộ :i386gói hợp lý ngoài các :amd64gói.

16
Tuyệt vời, hoạt động! Nhân tiện, đầu ra của ldd là not a dynamic executable(trước khi tôi cài đặt ia32-libs).
Warpspace

3
ia32-libs-*không được dùng nữa trong Ubuntu 16.04, hãy cài đặt lib32ncurses5lib32z1thay vào đó.
GaloisPlusPlus Ngày

2
Đây là vấn đề phổ biến trên Nix hoặc NixOS khi cố gắng chạy các tệp nhị phân của bên thứ 3; xem giá đỡ.
bbarker

29

Tôi gặp phải lỗi này khi tôi đang cố gắng tạo nguồn Selenium trên Ubuntu. Tập lệnh shell đơn giản với shebang chính xác đã không thể chạy ngay cả khi tôi đã che tất cả các điều kiện tiên quyết.

file file-name # helped me in understanding that CRLF ending were present in the file.

Tôi đã mở tệp bằng Vim và tôi có thể thấy rằng chỉ vì tôi đã từng chỉnh sửa tệp này trên máy Windows, nó có định dạng DOS. Tôi đã chuyển đổi tệp sang định dạng Unix bằng lệnh dưới đây:

dos2unix filename # actually helped me and things were fine.

Tôi hy vọng rằng chúng ta nên cẩn thận bất cứ khi nào chúng ta chỉnh sửa tệp trên các nền tảng, chúng ta cũng nên quan tâm đến định dạng tệp.


Nó đã làm việc! sau khi thử nhiều thứ, đây là giải pháp. Cảm ơn!
Pedro Perez

20

Lỗi này cũng có thể xảy ra nếu cố gắng để chạy một kịch bản và các công việc được sai chính tả. Đảm bảo rằng nó đọc #!/bin/sh, #!/bin/bashhoặc bất kỳ trình thông dịch nào bạn đang sử dụng.


4
Tôi đang đề cập đến một tệp thực thi, không phải một tập lệnh. Sau đó, một lần nữa, người khác có thể tìm thấy nhận xét này hữu ích
Warpspace

1
Đúng, nhưng tôi đặt câu hỏi này cho vấn đề chính xác này, vì vậy như bạn đã nói, có thể ai đó cũng sẽ làm như vậy.
Zoltán

Trong trường hợp của tôi, tôi đã cố gắng chạy ./my/full/path/myscriptthay vì ./myscript.
Noumenon

8

Tôi đã gặp thông báo lỗi tương tự khi cố gắng chạy một tập lệnh Python - đây không phải là trường hợp sử dụng dự kiến ​​của @ Warpspace (xem các nhận xét khác), nhưng đây là một trong những lượt truy cập hàng đầu cho tìm kiếm của tôi, vì vậy có thể ai đó sẽ thấy nó hữu ích.

Trong trường hợp của tôi, đó là phần cuối của dòng DOS ( \r\nthay vì \n) mà dòng shebang ( #!/usr/bin/env python) sẽ đi qua. Một đơn giản đã dos2unix myfile.pysửa nó.


4

Tôi gặp lỗi tương tự đối với một tập lệnh bash đơn giản không gặp sự cố 32/64-bit. Điều này có thể do tập lệnh bạn đang cố chạy có lỗi trong đó. Điều này đăng trên diễn đàn ubuntu chỉ ra rằng với các tệp script bình thường, bạn có thể thêm 'sh' vào phía trước và bạn có thể nhận được một số đầu ra gỡ lỗi từ nó. ví dụ

$ sudo sh arm-mingw32ce-g++

và xem bạn có nhận được bất kỳ đầu ra nào không.

Trong trường hợp của tôi, vấn đề thực sự là tệp mà tôi đang cố gắng thực thi ở định dạng Windows chứ không phải linux.


3

Tôi gặp lỗi này “No such file or directory”nhưng nó tồn tại vì tệp của tôi được tạo trong Windows và tôi đã cố chạy nó trên Ubuntu và tệp chứa 15 \ r không hợp lệ khi có dòng mới. Tôi vừa tạo một tệp mới cắt bớt những thứ không mong muốn

sleep: invalid time interval ‘15\r’
Try 'sleep --help' for more information.
script.sh: 5: script.sh: /opt/ag/cont: not found
script.sh: 6: script.sh: /opt/ag/cont: not found
root@Ubuntu14:/home/abc12/Desktop# vi script.sh 
root@Ubuntu14:/home/abc12/Desktop# od -c script.sh 
0000000   #   !   /   u   s   r   /   b   i   n   /   e   n   v       b
0000020   a   s   h  \r  \n   w   g   e   t       h   t   t   p   :   /

0000400   :   4   1   2   0   /  \r  \n
0000410
root@Ubuntu14:/home/abc12/Desktop# tr -d \\015 < script.sh > script.sh.fixed
root@Ubuntu14:/home/abc12/Desktop# od -c script.sh.fixed 
0000000   #   !   /   u   s   r   /   b   i   n   /   e   n   v       b
0000020   a   s   h  \n   w   g   e   t       h   t   t   p   :   /   /

0000400   /  \n
0000402
root@Ubuntu14:/home/abc12/Desktop# sh -x script.sh.fixed 

3

Lệnh dưới đây hoạt động trên Ubuntu 16.4

Sự cố này xảy ra khi tệp .sh của bạn bị hỏng hoặc không được định dạng theo giao thức unix.

dos2unix chuyển đổi tệp .sh sang định dạng Unix!

sudo apt-get install dos2unix -y
dos2unix test.sh
sudo chmod u+x test.sh 
sudo ./test.sh

1

Tôi đã gặp sự cố tương tự với tệp mà tôi đã tạo trên máy mac của mình. Nếu tôi cố gắng chạy nó trong một trình bao với ./filename, tôi nhận được thông báo lỗi không tìm thấy tệp. Tôi nghĩ rằng có điều gì đó không ổn với tệp.

điều tôi đã làm:

mở một phiên ssh tới
tên tệp máy chủ,
sao chép đầu ra vào khay nhớ tạm.
rm tên tệp.
chạm vào tên tệp
vi tên tệp
i cho chế độ chèn,
dán nội dung từ bảng tạm
ESC vào chế độ chèn kết thúc
: wq!

Điều này đã làm việc cho tôi.


1

Tôi chỉ có vấn đề này trong mingw32 bash. Tôi đã thực thi nút / npm từ Program Files (x86)\nodejsđó và sau đó chuyển chúng vào disabledthư mục (về cơ bản là xóa chúng khỏi đường dẫn). Tôi cũng có Program Files\nodejs(tức là phiên bản 64bit) trong đường dẫn, nhưng chỉ sau phiên bản x86. Sau khi khởi động lại bash shell, có thể tìm thấy phiên bản 64bit của npm. nodehoạt động chính xác mọi lúc (được kiểm tra vớinode -v điều đó đã thay đổi khi phiên bản x86 được di chuyển).

Tôi nghĩ bash -rsẽ hoạt động thay vì khởi động lại bash: https://unix.stackexchange.com/a/5610


1

Như những người khác đã đề cập, điều này là do không tìm thấy trình tải, không phải tệp thực thi của bạn. Thật không may, thông điệp không đủ rõ ràng.

Bạn có thể khắc phục nó bằng cách thay đổi trình tải mà tệp thực thi của bạn sử dụng, hãy xem câu trả lời cặn kẽ của tôi trong câu hỏi khác này: Nhiều thư viện glibc trên một máy chủ duy nhất

Về cơ bản, bạn phải tìm trình tải mà nó đang cố gắng sử dụng:

$ readelf -l arm-mingw32ce-g++ | grep interpreter
  [Requesting program interpreter: /lib/ld-linux.so.2]

Sau đó, tìm đường dẫn phù hợp cho trình tải tương đương và thay đổi tệp thực thi của bạn để sử dụng trình tải từ đường dẫn thực sự là:

$ ./patchelf --set-interpreter /path/to/newglibc/ld-linux.so.2 arm-mingw32ce-g++

Bạn có thể sẽ cần phải thiết lập đường dẫn của bao gồm, bạn sẽ biết nếu bạn muốn nó hay không sau khi bạn cố gắng chạy nó. Xem tất cả các chi tiết trong chủ đề khác.


1

Tôi đã tìm thấy giải pháp cho Ubuntu 18 của mình tại đây .

sudo dpkg --add-architecture i386

Sau đó:

sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386

0

Tôi gặp sự cố này và nguyên nhân là do EOL trong một số trình chỉnh sửa như Notepad ++. Bạn có thể kiểm tra nó trong menu Chỉnh sửa / chuyển đổi EOL. Unix (LF) nên được chọn. Tôi hy vọng nó sẽ hữu ích.


Đó không phải là vấn đề trong trường hợp này, vì lệnh không được thực thi từ tệp.
RalfFriedl

0

Đã thêm vào đây để tham khảo trong tương lai (đối với những người dùng có thể rơi vào trường hợp tương tự): Lỗi này xảy ra khi làm việc trên Windows (giới thiệu các ký tự phụ do dấu phân cách dòng khác với hệ thống Linux) và cố gắng chạy tập lệnh này (có chèn thêm các ký tự) trong Linux. Thông báo lỗi gây hiểu lầm.

Trong Windows, dấu phân tách dòng là CRLF ( \ r \ n ) trong khi trong Linux, nó là LF ( \ n ). Điều này thường có thể được chọn trong trình soạn thảo văn bản.

Trong trường hợp của tôi, điều này xảy ra do hoạt động trên Windows và tải lên máy chủ Unix để thực thi.


1
Tôi sử dụng docker, linux, nhưng xây dựng nó từ Windows. scriptdir=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd)Sau đó, tập lệnh của tôi bắt đầu cd $scriptdir || exit 1nhưng \rtệp trong tệp do cửa sổ chỉnh sửa của tôi đã được thêm vào scriptdirgiá trị. Vì vậy, thông báo : no such file or directorykhó hiểu nhất, vì cuối cùng nó đã xóa những gì nó đang phàn nàn.
Jesse Chisholm
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.