Разница между «команда не найдена» и «нет такого файла или каталога»?

33

Например:

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

Какая разница? В обоих случаях nodeи fooявляются недопустимыми командами, но кажется, что Unix просто не может найти nodeдвоичный файл? При удалении программы, например node, есть ли способ очистить это, чтобы я получил

$ node
-bash: node: command not found

РЕДАКТИРОВАТЬ:

Результаты от typeкоманды:

$ type node
node is hashed (/usr/local/bin/node)
$ type foo
-bash: type: foo: not found
GWG
источник
Можете ли вы обновить свой вопрос с выводом обоих type nodeи type foo(хотя, вероятно, только первый действительно полезен).
Эрик Ренуф
@EricRenouf, хорошо, я сделал.
GWG
2
Вероятно, «узел» является символической ссылкой из / usr / bin / node -> / usr / local / bin / node, и последний недоступен, поэтому возникла ошибка, из-за которой / usr / local / bin / node была удалена после того, как символическая ссылка была создана.
likewhoa

Ответы:

59

Это потому, что bashзапомнили расположение вашей команды, сохраните ее в хеш- таблице.

После того, как вы удалили node, хеш-таблица не очищается, bashвсе еще думает о nodeтом /usr/local/bin/node, что, пропуская PATHпоиск и вызывая /usr/local/bin/nodeнапрямую, используя execve(). Поскольку, когда nodeего больше нет, execve()возвращает ENOENTошибку, значит, нет такого файла или каталога, bashсообщил об этой ошибке вам.

В bash, вы можете удалить запись из хеш-таблицы:

hash -d node

или удалите всю хеш-таблицу ( работает во всех оболочках POSIX ):

hash -r
cuonglm
источник
2
Обратите внимание, что это не должно быть, /usr/local/bin/nodeчто отсутствует; если этот файл представляет собой динамически связанный исполняемый файл и одна из зависимостей отсутствует, вы получите то же сообщение «Нет такого файла или каталога». Это может свести вас с ума, пока вы не попробуете lddэтот файл.
Гунтрам Блом поддерживает Монику
@GuntramBlohm, но в некоторых дистрибутивах Linux исправлена ​​ошибка, из-за которой bash печатает более понятные сообщения об ошибках, например progname: error while loading shared libraries: badLib.so.1: cannot open shared object file: No such file or directory(или это может быть не bash в данном конкретном случае, но ld-linux.so).
Руслан
@Ruslan По моему опыту, вы получаете «ошибку при загрузке разделяемых библиотек», если отсутствует «обычная» разделяемая библиотека, и необъяснимое «Нет такого файла или каталога», если отсутствует сам динамический компоновщик . Это имеет смысл , когда вы понимаете , что в первом случае обнаруживается с помощью динамического компоновщика, в то время как в последнем случае обнаруживается в ядре, и это намного проще для динамического компоновщика для печати полезное сообщение ( execveзапись в стандартный вывод , как побочный эффект при сбое вероятно, нарушит POSIX или что-то в этом роде)
zwol
@zwol Ах, да, вот для чего нужен патч для некоторых дистрибутивов (например, CentOS). Такая исправленная версия затем печатает ошибки как /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory.
Руслан
-6

Я обнаружил в Ubuntu Linux 16.04, что «Нет такого файла или каталога» означает, что вам нужно переключить текущий рабочий каталог, в то время как «команда не найдена» означает, что вы должны использовать apt-get install xxxyyy_zzz для решения проблемы.

Фрэнк
источник
10
Если ваш cwd имеет какое-либо влияние на то, что будет найдено или нет (если вы не префиксируете его с помощью ./), ваш PATH настроен довольно небезопасно. И не найденная команда не всегда является проблемой, которую вы хотите решить :)
rackandboneman