Різниця між "командою не знайдено" та "відсутнім таким файлом чи каталогом"?


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

Чи можете ви оновити своє запитання з результатами обох 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

2
Зауважте, що це не повинно бути /usr/local/bin/nodeвідсутнім; якщо цей файл є динамічно пов'язаним виконуваним файлом, і одна із залежностей відсутня, ви отримаєте те саме повідомлення "Немає такого файлу чи каталогу". Це може звести вас з розуму, поки ви не спробуєте lddцей файл.
Guntram Blohm підтримує Моніку

@GuntramBlohm, але в деяких дистрибутивах Linux баш виправляють для друку більш зрозумілих повідомлень про помилки, як-от progname: error while loading shared libraries: badLib.so.1: cannot open shared object file: No such file or directory(або, можливо, це не баш в цьому конкретному випадку, але 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.