「command not found」と「no such file or directory」の違いは?


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
おそらく「node」は/ usr / bin / node-> / usr / local / bin / nodeからのシンボリックリンクであり、後者は利用できないため、/ usr / local / bin / nodeが削除されたことを示唆するエラーです。シンボリックリンクが作成された後。
likewhoa

回答:


59

これbashは、コマンドの場所を記憶しており、ハッシュテーブルに保存するためです。

アンインストールした後node、ハッシュテーブルはクリアされず、bashまだであると考えnodeられ/usr/local/bin/nodePATHルックアップをスキップ/usr/local/bin/nodeし、を使用して直接呼び出しexecve()ます。when nodeがもう存在しない場合、エラーをexecve()返しENOENT、そのようなファイルまたはディレクトリがないことを意味するため、bashそのエラーを報告しました。

ではbash、ハッシュテーブルからエントリを削除できます。

hash -d node

または、ハッシュテーブル全体を削除します(すべてのPOSIXシェルで動作します)。

hash -r

2
/usr/local/bin/node欠落している必要はないことに注意してください。そのファイルが動的にリンクされた実行可能ファイルであり、依存関係の1つが欠落している場合、同じ「No such file or directory」メッセージが表示されます。これはldd、そのファイルを試すまで夢中にさせることができます。
Guntram Blohmがモニカをサポートする

@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私の経験では、「共有ライブラリのロード中にエラーが発生します」が欠落しているのが「通常の」共有ライブラリであり、動的リンカー自体が欠落していると不可解な「No such file or directory」です。これは、前者の場合は動的リンカーによって検出さ、後者の場合はカーネルによって検出され、動的リンカーが有用なメッセージ(execve失敗時の副作用としてstderrに書き込むこと)をはるかに簡単に認識することに気付いたときに意味がありますおそらくPOSIXか何かに違反するでしょう)
-zwol

@zwolああ、そう、それはいくつかのディストリビューション(CentOSなど)のパッチbashの目的です。そのようなパッチを適用したバージョンは、次のようなエラーを出力し/lib/ld-linux.so.2: bad ELF interpreter: No such file or directoryます。
ルスラン

-6

Ubuntu Linux 16.04では、「No such file or directory」は現在の作業ディレクトリを切り替える必要があることを意味し、「command not found」はapt-get install xxxyyy_zzzを使用して問題を解決する必要があることを意味します。


10
cwdが(./を前に付けない限り)検出されるかどうかに影響を与える場合、PATHはかなり安全でない方法で設定されます。そして、コマンドが見つからないということは、必ずしもあなたが修正したい問題ではありません:)
rackandboneman
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.