Sự khác biệt giữa lệnh không được tìm thấy trên mạng và không có tập tin hoặc thư mục nào như vậy?


33

Ví dụ:

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

Có gì khác biệt? Trong cả hai trường hợp nodefoolà các lệnh không hợp lệ, nhưng có vẻ như Unix không thể tìm thấy nodenhị phân? Khi gỡ cài đặt chương trình, ví dụ node, có cách nào để dọn sạch chương trình này để tôi nhận được

$ node
-bash: node: command not found

CHỈNH SỬA:

Kết quả từ typelệnh:

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

Bạn có thể cập nhật câu hỏi của bạn với đầu ra của cả hai type nodetype foo(mặc dù có lẽ chỉ lần đầu tiên thực sự hữu ích).
Eric Renouf

@EricRenouf, được rồi, tôi đã làm.
gwg

2
Có lẽ 'nút' là một liên kết tượng trưng từ / usr / bin / nút -> / usr / local / bin / nút và cái sau không có sẵn do đó lỗi này sẽ gợi ý / usr / local / bin / nút đã bị xóa sau khi liên kết tượng trưng được tạo ra.
likewhoa

Câu trả lời:


59

Đó là vì bashnhớ vị trí lệnh của bạn, lưu nó trong bảng băm .

Sau khi bạn gỡ cài đặt node, bảng băm không bị xóa, bashvẫn nghĩ nodelà tại /usr/local/bin/node, bỏ qua PATHtra cứu và gọi /usr/local/bin/nodetrực tiếp, sử dụng execve(). Vì khi nodekhông còn nữa, execve()trả về ENOENTlỗi, có nghĩa là không có tệp hoặc thư mục như vậy, bashđã báo cáo lỗi đó cho bạn.

Trong bash, bạn có thể xóa một mục từ bảng băm:

hash -d node

hoặc xóa toàn bộ bảng băm ( hoạt động trong tất cả vỏ POSIX ):

hash -r

2
Lưu ý rằng nó không phải /usr/local/bin/nodelà mất tích; nếu tệp đó là tệp thực thi được liên kết động và thiếu một trong các phụ thuộc, bạn sẽ nhận được thông báo "Không có tệp hoặc thư mục như vậy". Điều này có thể khiến bạn phát điên cho đến khi bạn thử lddtập tin đó.
Guntram Blohm hỗ trợ Monica

@GuntramBlohm nhưng trên một số bản phân phối Linux bash được vá để in các thông báo lỗi dễ hiểu hơn, như progname: error while loading shared libraries: badLib.so.1: cannot open shared object file: No such file or directory(hoặc có thể không phải là bash trong trường hợp cụ thể này, nhưng ld-linux.so).
Ruslan

@Ruslan Theo kinh nghiệm của tôi, bạn gặp phải "lỗi khi tải thư viện dùng chung" nếu đó là thư viện chia sẻ "thông thường" bị thiếu và không thể giải thích được "Không có tệp hoặc thư mục như vậy" nếu chính nó là trình liên kết động bị thiếu. Điều này có ý nghĩa khi bạn nhận ra rằng trường hợp trước được phát hiện bởi trình liên kết động, trong khi trường hợp sau được phát hiện bởi nhân, và trình liên kết động sẽ dễ dàng hơn để in một thông điệp hữu ích ( execveviết cho stderr như một tác dụng phụ khi thất bại có thể sẽ vi phạm POSIX hoặc một cái gì đó)
zwol

@zwol ah, đúng rồi, đó là những gì một số distro (ví dụ như CentOS) vá bash cho. Phiên bản vá như vậy sau đó in lỗi như/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory .
Ruslan

-6

Tôi đã tìm thấy trên Ubuntu Linux 16.04 rằng "Không có tệp hoặc thư mục như vậy" có nghĩa là bạn phải chuyển thư mục làm việc hiện tại của mình trong khi "không tìm thấy lệnh" có nghĩa là bạn phải sử dụng apt-get install xxxyyy_zzz để khắc phục sự cố.


10
Nếu cwd của bạn có bất kỳ ảnh hưởng nào đến những gì sẽ được tìm thấy hay không (trừ khi bạn đặt tiền tố với ./), PATH của bạn được thiết lập theo cách khá không an toàn. Và một lệnh không được tìm thấy không phải lúc nào cũng là vấn đề bạn muốn khắc phục :)
rackandboneman
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.