“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.