Perbedaan antara "perintah tidak ditemukan" dan "tidak ada file atau direktori"?

33

Sebagai contoh:

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

Apa bedanya? Dalam kedua kasus, nodedan fooperintah yang tidak valid, tetapi sepertinya Unix tidak dapat menemukan nodebiner? Saat mencopot program, misalnya node, apakah ada cara untuk membersihkannya sehingga saya dapat

$ node
-bash: node: command not found

EDIT:

Hasil dari typeperintah:

$ type node
node is hashed (/usr/local/bin/node)
$ type foo
-bash: type: foo: not found
gwg
sumber
Bisakah Anda memperbarui pertanyaan Anda dengan output keduanya type nodedan type foo(meskipun mungkin hanya yang pertama yang sangat membantu).
Eric Renouf
@ EricRenouf, oke, saya lakukan.
gwg
2
Mungkin 'simpul' adalah tautan simbolis dari / usr / bin / node -> / usr / local / bin / node dan yang terakhir tidak tersedia maka kesalahan, yang akan menyarankan / usr / local / bin / node dihapus setelah tautan simbolik dibuat.
likewhoa

Jawaban:

59

Itu karena bashingat lokasi perintah Anda, simpan di tabel hash .

Setelah Anda dihapus node, tabel hash tidak dihapus, bashmasih berpikir nodeada di /usr/local/bin/node, melewatkan PATHpencarian, dan menelepon /usr/local/bin/nodelangsung, menggunakan execve(). Karena ketika nodetidak ada lagi, execve()mengembalikan ENOENTkesalahan, berarti tidak ada file atau direktori tersebut, bashmelaporkan kesalahan itu kepada Anda.

Di bash, Anda dapat menghapus entri dari tabel hash:

hash -d node

atau hapus seluruh tabel hash ( berfungsi di semua shell POSIX ):

hash -r
cuonglm
sumber
2
Perhatikan bahwa tidak harus /usr/local/bin/nodeyang hilang; jika file itu adalah executable yang terhubung secara dinamis, dan salah satu dependensinya tidak ada, Anda akan mendapatkan pesan "Tidak ada file atau direktori" yang sama. Ini bisa membuat Anda gila sampai Anda mencoba lddfile itu.
Guntram Blohm mendukung Monica
@GuntramBlohm tetapi pada beberapa distro Linux bash ditambal untuk mencetak pesan kesalahan yang lebih dimengerti, seperti progname: error while loading shared libraries: badLib.so.1: cannot open shared object file: No such file or directory(atau mungkin bukan bash dalam kasus khusus ini, tetapi ld-linux.so).
Ruslan
@Ruslan Dalam pengalaman saya, Anda mendapatkan "kesalahan saat memuat pustaka bersama" jika itu adalah pustaka bersama "biasa" yang hilang, dan "Tidak ada file atau direktori" seperti itu yang dapat dijelaskan jika itu adalah penghubung dinamis itu sendiri yang hilang. Ini masuk akal ketika Anda menyadari bahwa case sebelumnya terdeteksi oleh dynamic linker, sedangkan case terakhir terdeteksi oleh kernel, dan jauh lebih mudah bagi dynamic linker untuk mencetak pesan yang bermanfaat ( execvemenulis ke stderr sebagai efek samping pada kegagalan mungkin akan melanggar POSIX atau sesuatu)
zwol
@ zwol ah, benar, itulah tujuan dari beberapa distro (misalnya CentOS). Versi tambalan tersebut kemudian mencetak kesalahan seperti /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory.
Ruslan
-6

Saya menemukan di Ubuntu Linux 16.04 bahwa "Tidak ada file atau direktori" berarti Anda harus mengganti direktori kerja Anda saat ini sementara "perintah tidak ditemukan" berarti Anda harus menggunakan apt-get install xxxyyy_zzz untuk memperbaiki masalah.

jujur
sumber
10
Jika cwd Anda memiliki pengaruh pada apa yang akan ditemukan atau tidak (kecuali jika Anda awali dengan ./), PATH Anda diatur dengan cara yang agak tidak aman. Dan perintah yang tidak ditemukan tidak selalu menjadi masalah yang ingin Anda perbaiki :)
rackandboneman