たとえば、端末を接続してunix.stackexchange.com
再Enter接続すると、次のエラーが発生します。
unix.stackexchange.com: command not found
予想通り大丈夫です。しかし、を挿入すると、http://unix.stackexchange.com
別のエラーメッセージが表示されます。
bash: http://unix.stackexchange.com: No such file or directory
なぜエラーが発生するのか尋ねません。なぜ違うのか、そして最終的にどのプロセス/機能がこれを処理するのか知りたいです。
答え1
また良いです乳泊が指摘した。、後者のコマンドラインにスラッシュ(/
)が含まれており、シェルがそれをファイルパスとして解釈するため、エラーメッセージが異なります。
この場合、両方のエラーがシェルで発生しますbash
(2番目のエラーメッセージでわかるように)。
より具体的には、最初のエラーは次にexecute_disk_command()
定義された関数から来ます。execute_command.c
bash-4.2
ソースコードで定義された関数呼び出しは、execute_disk_command()
スラッシュが含まれていない場合に検索されます。スラッシュが含まれている場合、この検索は実行されません。コマンドが返されない場合は、内部エラーにより失敗します。search_for_command()
findcmd.c
pathname
$PATH
pathname
pathname
search_for_command()
search_for_command()
execute_disk_command()
command not found
2番目のエラーは、shell_execve()
定義された関数でも発生しますexecute_command.c
。この時点で、シナリオではルックアップは必要なく呼び出され、システムコールを実行するため、search_for_command()
成功が返されます。実行したいファイルが存在せず、それを示す適切な設定があるため失敗します。失敗した場合は、対応するファイルエラーメッセージ()を報告し、エラーが発生したらすぐにシェルを終了するために使用されます。execute_disk_command()
shell_execve()
execve()
execve()
execve()
errno
execve()
shell_execve()
strerror()
No such file or directory
答え2
この/
文字はパス名の区切り文字です。したがって、シェルは、ユーザーがunix.stackexchange.com
ディレクトリという名前のコマンドへの相対パスを指定すると仮定しますhttp:
。シェルがディレクトリまたはファイルを見つけることができず、次のように言います。たとえば、名前付きコマンドを実行しようとすると、同じエラーメッセージが表示されますfoo/bar/grill/snorklewacker
。
一方、パス名の区切り文字なしで単純なコマンド名を入力すると、シェルはPATH
環境変数のディレクトリリストを表示する順序でチェックして、プログラムが含まれていることを確認します。したがって、私のシステムにプロンプトされたとおりに入力すると、unix.stackexchange.com
シェルは次を検索します。
- /usr/local/bin/unix.stackexchange.com
- /usr/bin/unix.stackexchange.com
- /bin/unix.stackexchange.com
- /usr/local/games/unix.stackexchange.com
- /usr/games/unix.stackexchange.com
これらの検索がすべて失敗すると、エラーが発生しますcommand not found
。