Differenza tra "comando non trovato" e "nessun file o directory"?


33

Per esempio:

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

Qual è la differenza? In entrambi i casi, nodee foosono comandi non validi, ma sembra che Unix non riesca a trovare il nodebinario? Quando si disinstalla un programma, ad esempio node, c'è un modo per ripulirlo in modo che io ottenga

$ node
-bash: node: command not found

MODIFICARE:

Risultati dal typecomando:

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

Puoi aggiornare la tua domanda con l'output di entrambi type nodee type foo(anche se probabilmente solo il primo è davvero utile).
Eric Renouf,

@EricRenouf, okay, l'ho fatto.
gwg,

2
Probabilmente 'nodo' è un collegamento simbolico da / usr / bin / node -> / usr / local / bin / node e quest'ultimo non è disponibile, quindi l'errore, che suggerirebbe / usr / local / bin / node è stato eliminato dopo la creazione del collegamento simbolico.
likewhoa,

Risposte:


59

Questo perché bashricordato la posizione del comando, archiviarlo in una tabella hash .

Dopo aver disinstallato node, la tabella hash non viene cancellata, bashpensa ancora di nodeessere /usr/local/bin/node, saltando la PATHricerca e chiamando /usr/local/bin/nodedirettamente, usando execve(). Dato che quando nodenon c'è più, execve()restituisce un ENOENTerrore, significa che non esiste un file o una directory di questo tipo, bashche ti è stato segnalato.

In bash, è possibile rimuovere una voce dalla tabella hash:

hash -d node

o rimuovi l'intera tabella hash ( funziona in tutta la shell POSIX ):

hash -r

2
Nota che non deve essere /usr/local/bin/nodequello che manca; se quel file è un eseguibile collegato dinamicamente e manca una delle dipendenze, otterrai lo stesso messaggio "Nessun file o directory simile". Questo può farti impazzire fino a quando non provi lddquel file.
Guntram Blohm sostiene Monica il

@GuntramBlohm ma su alcune distro Linux bash è patchato per stampare messaggi di errore più comprensibili, come progname: error while loading shared libraries: badLib.so.1: cannot open shared object file: No such file or directory(o potrebbe non essere bash in questo caso particolare, ma ld-linux.so).
Ruslan,

@Ruslan Nella mia esperienza si ottiene "l'errore durante il caricamento delle librerie condivise" se manca una libreria condivisa "ordinaria" e l'inspiegabile "Nessun file o directory" se manca il linker dinamico stesso . Questo ha senso quando ti rendi conto che il primo caso viene rilevato dal linker dinamico, mentre il secondo caso viene rilevato dal kernel ed è molto più facile per il linker dinamico stampare un messaggio utile ( execvescrivere su stderr come effetto collaterale in caso di errore probabilmente violerebbe POSIX o qualcosa del genere)
zwol

@zwol ah, giusto, questo è ciò per cui alcune patch di distro (ad es. CentOS) bash. Tale versione patchata quindi stampa errori come /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory.
Ruslan,

-6

Ho trovato su Ubuntu Linux 16.04 che "Nessun file o directory" significa che devi cambiare la tua directory di lavoro corrente mentre "comando non trovato" significa che devi usare apt-get install xxxyyy_zzz per risolvere il problema.


10
Se il tuo CWD ha qualche influenza su ciò che verrà trovato o meno (a meno che tu non lo prefichi con ./), il tuo PERCORSO è impostato in modo piuttosto non sicuro. E un comando non trovato non è sempre un problema che vuoi risolvere :)
rackandboneman
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.