Unterschied zwischen "Befehl nicht gefunden" und "keine solche Datei oder Verzeichnis"?

33

Beispielsweise:

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

Was ist der Unterschied? In beiden Fällen nodeund foosind ungültige Befehle, aber es scheint, als ob Unix die nodeBinärdatei einfach nicht finden kann ? Bei der Deinstallation eines Programms gibt es zB nodeeine Möglichkeit, dieses aufzuräumen, damit ich es bekomme

$ node
-bash: node: command not found

BEARBEITEN:

Ergebnisse vom typeBefehl:

$ type node
node is hashed (/usr/local/bin/node)
$ type foo
-bash: type: foo: not found
gwg
quelle
Können Sie Ihre Frage mit der Ausgabe von beiden type nodeund aktualisieren type foo(obwohl wahrscheinlich nur die erste wirklich hilfreich ist).
Eric Renouf
@ EricRenouf, okay, ich habe.
GWG
2
Es ist wahrscheinlich, dass 'node' eine symbolische Verknüpfung von / usr / bin / node -> / usr / local / bin / node ist und letztere nicht verfügbar ist, daher der Fehler, der darauf hindeutet, dass / usr / local / bin / node gelöscht wurde nachdem der symbolische Link erstellt wurde.
Likewhoa

Antworten:

59

Das liegt daran, bashdass Sie sich an Ihren Befehlsspeicherort erinnert haben und ihn in einer Hash- Tabelle speichern .

Nach der Deinstallation nodewird die Hash-Tabelle nicht gelöscht, sondern es wird bashweiterhin nodean /usr/local/bin/nodegedacht, die PATHSuche zu überspringen und /usr/local/bin/nodedirekt mit aufzurufen execve(). Da, wenn nodenicht mehr da ist, Fehler execve()zurückgibt ENOENT, bedeutet dies, dass keine solche Datei oder kein solches Verzeichnis bashdiesen Fehler an Sie gemeldet hat.

In bashkönnen Sie einen Eintrag aus der Hash-Tabelle entfernen:

hash -d node

oder entfernen Sie die gesamte Hash-Tabelle ( funktioniert in allen POSIX-Shell ):

hash -r
cuonglm
quelle
2
Beachten Sie, dass es nicht unbedingt /usr/local/bin/nodefehlen muss. Wenn es sich bei dieser Datei um eine dynamisch verknüpfte ausführbare Datei handelt und eine der Abhängigkeiten fehlt, wird die Meldung "Keine solche Datei oder Verzeichnis" angezeigt. Dies kann Sie verrückt machen, bis Sie ldddiese Datei anprobieren .
Guntram Blohm unterstützt Monica am
@GuntramBlohm aber auf einigen Linux-Distributionen ist bash gepatcht, um verständlichere Fehlermeldungen auszugeben, zB progname: error while loading shared libraries: badLib.so.1: cannot open shared object file: No such file or directory(oder es könnte in diesem speziellen Fall nicht bash sein, aber ld-linux.so).
Ruslan
@ Ruslan Nach meiner Erfahrung wird beim Laden von gemeinsam genutzten Bibliotheken der Fehler angezeigt, wenn eine "normale" gemeinsam genutzte Bibliothek fehlt, und das unerklärliche "Keine solche Datei oder kein solches Verzeichnis", wenn der dynamische Linker selbst fehlt. Dies ist sinnvoll, wenn Sie feststellen, dass der erstere Fall vom dynamischen Linker erkannt wird , während der letztere vom Kernel erkannt wird und es für den dynamischen Linker viel einfacher ist, eine hilfreiche Nachricht auszudrucken ( execveSchreiben an stderr als Nebeneffekt bei einem Fehler) würde wahrscheinlich gegen POSIX verstoßen oder so)
zwol
@zwol ah, das ist es, wofür manche Distributionen (zB CentOS) Patches verwenden. Eine solche gepatchte Version druckt dann Fehler wie /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory.
Ruslan
-6

Ich habe unter Ubuntu Linux 16.04 festgestellt, dass "Keine solche Datei oder kein solches Verzeichnis" bedeutet, dass Sie Ihr aktuelles Arbeitsverzeichnis wechseln müssen, während "Befehl nicht gefunden" bedeutet, dass Sie apt-get install xxxyyy_zzz verwenden müssen, um das Problem zu beheben.

Frank
quelle
10
Wenn Ihr cwd irgendeinen Einfluss darauf hat, was gefunden wird oder nicht (es sei denn, Sie stellen ./ voran), ist Ihr PATH auf eine ziemlich unsichere Weise eingerichtet. Und ein nicht gefundener Befehl ist nicht immer ein Problem, das Sie beheben möchten :)
rackandboneman