コマンドラインからコマンド foo を実行しようとしたときに、
% foo
foo: Command not found
あるいは
% foo
-bash: foo: コマンドが見つかりません
というエラーになった場合の対処方法をまとめる。
●1. タイプミス
まずはタイプミスを疑うこと。人間はコンピュータよりミスをするものである。
●2. パスが通っていない
例えば、FreeBSD のデフォルトでは /sbin・/usr/sbin などにパスが通っていない。そのため、mount コマンドや ping コマンドはフルパスで指定するか、/sbin・/usr/sbin/ にパスを通しておかなくてはならない。
として、現在のパス設定を確認してほしい。パスの設定方法は下記を参照。
●3. ハッシュテーブルを再構築していない
csh か tcsh を使っている場合、コマンドをインストールした直後や、スクリプトを作成した直後に、そのコマンドを実行しようとすると実行できないことがある。これは、シェルのハッシュテーブルの内容が古いままになっており、今インストールした or 作成したばかりのコマンドを見付けられないからである。rehash コマンドを実行してから、再度コマンドを入力すべし。
sh・bash でもハッシュテーブルの仕組みはあるものの、csh・tcsh とは考え方が異なるので、Command not found の原因とはならない。興味がある方は hash コマンドを参照のこと。
●5. スクリプトのパスが違っている
これは知らないと結構はまるだろう。スクリプトの1行目には
などと書いてあるが、この /dir/foo が存在しなかったら Command not found となるのである。
/dir/foo: Command not found.
と表示されるならわかりやすいのだが、実際は
スクリプト名: Command not found.
となるので、なかなか気づきにくい。
また、改行コードが CR LF、つまり
となっていると、
というコマンドを実行しようとして Command not found となる。DOS や Windows で作成したスクリプトを実行するときは注意。
改行コードの確認をするには、hd コマンドや od コマンドでスクリプトをダンプしてみるとよい。
改行コードの変更は、tr・perl・qkc などを使うとよい、
●6. 外部パッケージからインストールする必要がある
外部パッケージとして提供されている可能性がある。例えば telnet コマンドや perl コマンドなど、 以前は標準コマンドであったものが外部パッケージとして切り出されたものは数多くある。下記を参照に、外部パッケージとして提供されていないか探してみてほしい。
●7. コマンドが存在しない
以上の 1〜7 のいずれでもないなら、そもそもそういうコマンドはないということかもしれない。その前に locate コマンドや find コマンドで、どこかにインストールされていないか調べてみるとよい。