“Komut bulunamadı” ve “böyle bir dosya veya dizin yok” arasındaki fark?


33

Örneğin:

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

Fark ne? Her iki durumda da nodeve foogeçersiz komutlar, ancak Unix sadece nodeikili bulamıyor gibi görünüyor ? Bir programı kaldırırken, örneğin node, bunu temizlemenin bir yolu var.

$ node
-bash: node: command not found

DÜZENLE:

typeKomutunun sonuçları :

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

Sorunuzu her ikisinin de çıktısıyla güncelleyebilir misiniz? type nodetype foo ( ve muhtemelen yalnızca ilki gerçekten yardımcı olabilir).
— Eric Renouf,

@EricRenouf, tamam, yaptım.
— gwg

2
Muhtemelen 'düğüm', / usr / bin / node -> / usr / local / bin / node 'dan sembolik bir linktir ve ikincisi mevcut değildir; sembolik link oluşturulduktan sonra.
— Haziran’daki

Yanıtlar:


59

Bunun nedeni bashkomut konumunuzu hatırlamanız, bir karma tabloda saklamanız .

Kaldırdıktan sonra node, karma tablo temizlenmedi, bashhala olduğunu düşünüyor node, aramayı /usr/local/bin/nodeatlıyor PATHve /usr/local/bin/nodekullanarak doğrudan arama yapıyor execve(). nodeArtık ne zaman olmadığına göre, hata execve()döndürüyor ENOENT, böyle bir dosya veya dizin yok, bashbu hatayı size bildirdi.

İçinde bash, karma tablosundan bir girişi kaldırabilirsiniz:

hash -d node

veya tüm karma tablosunu kaldırın ( tüm POSIX kabuğunda çalışır ):

hash -r

2
/usr/local/bin/nodeKayıp olması gerekmediğini unutmayın ; Bu dosya dinamik olarak bağlanabilir bir çalıştırılabilir dosya ise ve bağımlılıklardan biri eksikse, aynı "Böyle bir dosya veya dizin yok" mesajını alırsınız. Bu dosyayı deneyene kadar bu seni deli edebilir ldd.
— Guntram Blohm,

@GuntramBlohm, ancak bazı Linux dağıtımlarında bash, daha fazla anlaşılabilir hata mesajları basmak için yamalı progname: error while loading shared libraries: badLib.so.1: cannot open shared object file: No such file or directory(ya da bu durumda bash olmayabilir, ama ld-linux.so).
— Ruslan

@Ruslan Tecrübeme göre, eksik olan "sıradan" bir paylaşılan kitaplıksa "paylaşılan kitaplıkları yüklerken hata" ve eksik olan dinamik bağlayıcının kendisi ise anlaşılmaz "böyle bir dosya ya da dizin yok" ifadesini alırsınız . Bu, eski durumun dinamik linker tarafından tespit edildiğini fark ettiğinizde anlamlıdır , oysa ikinci durum çekirdek tarafından tespit edilir ve dinamik linker'ın yararlı bir mesaj execveyazması çok daha kolaydır ( stderr'e başarısızlık üzerinde yan etki olarak yazma) Muhtemelen POSIX veya başka bir şeyi ihlal ederdi)
— zwol

@zwol ah, doğru, bazı dağıtımlar (örneğin CentOS) için bash işte budur. Böyle yamalı sürüm daha sonra gibi hataları yazdırır /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory.
— Ruslan

-6

Ubuntu Linux 16.04'te, "böyle bir dosya veya dizin yok" ifadesinin mevcut çalışma dizininizi değiştirirken "komut bulunamadı" anlamına geldiğini ve sorunu gidermek için apt-get install xxxyyy_zzz komutunu kullanmanız gerektiğini belirttim.


10
Eğer sizin cdd'nizin bulunup bulunmayacağı üzerinde bir etkisi varsa (./ ile ekini koymazsanız), PATH'niz güvenli olmayan bir şekilde kurulur. Ve bulunamayan bir komut her zaman düzeltmek istediğiniz bir sorun değildir :)
— rackandboneman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.