Sebagai contoh:
$ node
-bash: /usr/local/bin/node: No such file or directory
$ foo
-bash: foo: command not found
Apa bedanya? Dalam kedua kasus, node
dan foo
perintah yang tidak valid, tetapi sepertinya Unix tidak dapat menemukan node
biner? Saat mencopot program, misalnya node
, apakah ada cara untuk membersihkannya sehingga saya dapat
$ node
-bash: node: command not found
EDIT:
Hasil dari type
perintah:
$ type node
node is hashed (/usr/local/bin/node)
$ type foo
-bash: type: foo: not found
type node
dantype foo
(meskipun mungkin hanya yang pertama yang sangat membantu).Jawaban:
Itu karena
bash
ingat lokasi perintah Anda, simpan di tabel hash .Setelah Anda dihapus
node
, tabel hash tidak dihapus,bash
masih berpikirnode
ada di/usr/local/bin/node
, melewatkanPATH
pencarian, dan menelepon/usr/local/bin/node
langsung, menggunakanexecve()
. Karena ketikanode
tidak ada lagi,execve()
mengembalikanENOENT
kesalahan, berarti tidak ada file atau direktori tersebut,bash
melaporkan kesalahan itu kepada Anda.Di
bash
, Anda dapat menghapus entri dari tabel hash:atau hapus seluruh tabel hash ( berfungsi di semua shell POSIX ):
sumber
/usr/local/bin/node
yang 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 mencobaldd
file itu.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, tetapild-linux.so
).execve
menulis ke stderr sebagai efek samping pada kegagalan mungkin akan melanggar POSIX atau sesuatu)/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
.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.
sumber