端末で別の文字列を使用するときの異なるエラーメッセージ

端末で別の文字列を使用するときの異なるエラーメッセージ

たとえば、端末を接続してunix.stackexchange.comEnter接続すると、次のエラーが発生します。

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.cbash-4.2ソースコードで定義された関数呼び出しは、execute_disk_command()スラッシュが含まれていない場合に検索されます。スラッシュが含まれている場合、この検索は実行されません。コマンドが返されない場合は、内部エラーにより失敗します。search_for_command()findcmd.cpathname$PATHpathnamepathnamesearch_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()errnoexecve()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

関連情報