コマンドラインからコマンド foo を実行しようとしたときに、
% foo
foo: Command not found
とエラーになった場合、以下の原因が考えられる。
1. タイプミス
まずはタイプミスを疑うこと。人間はコンピュータよりミスをするものである。
2. パスが通っていない
例えば、FreeBSD のデフォルトでは /sbin・/usr/sbin などにパスが通っていない。そのため、mount コマンドや ping コマンドはフルパスで指定するか、/sbin・/usr/sbin/ にパスを通しておかなくてはならない。
として、現在のパス設定を確認。
>> 環境変数
PATH *
3. ハッシュテーブルを再構築していない
csh か tcsh を使っている場合、コマンドをインストールした直後や、スクリプトを作成した直後に、そのコマンドを実行しようとすると実行できないことがある。これは、シェルのハッシュテーブルの内容が古いままになっており、今インストールした or 作成したばかりのコマンドを見付けられないからである。rehash コマンドを実行してから、再度コマンドを入力すべし。
>> コマンド
rehash *
4. 実行権限がない
自分でスクリプトを作ったときは、chmod +x を忘れないこと。
>> コマンド
chmod *
5. スクリプトのパスが違っている
これは知らないと結構はまるだろう。スクリプトの1行目には
などと書いてあるが、この /dir/foo が存在しなかったら Command not found となるのである。
/dir/foo: Command not found.
と表示されるならわかりやすいのだが、実際は
スクリプト名: Command not found.
となるので、なかなか気づきにくい。
また、改行コードが CR LF、つまり
となっていると、
というコマンドを実行しようとして Command not found となる。DOS や Windows で作成したスクリプトを実行するときは注意。
改行コードの確認をするには、hd コマンドや od コマンドでスクリプトをダンプしてみるとよい。
>> コマンド
hd * od *
改行コードの変更は、tr・perl・qkc などを使うとよい、
>> コマンド
tr * perl * qkc *
>> 用語集
シェバング *
6. コマンドが存在しない
以上の 1〜5 のいずれでもないなら、そもそもそういうコマンドはないということ。どこかから探してきてインストールしましょう。ただし、その前に locate コマンドや find コマンドで、どこかにインストールされていないか調べてみるとよい。
>> コマンド
locate * find *