在终端中使用不同字符串时出现不同的错误消息

在终端中使用不同字符串时出现不同的错误消息

例如,当我插入,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

也如尤瓦克指出,错误消息有所不同,因为后一个命令行包含正斜杠 ( /),这会导致您的 shell 将其解释为文件路径。

这两个错误都源自您的 shell,在本例中是bash(从第二条错误消息可以明显看出)。

更具体地说,第一个错误源于中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

第二个错误源自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) 并在出现错误时立即退出 shell。

答案2

/字符是路径名分隔符。因此,shell 假定您正在指定unix.stackexchange.com名为 的目录下的命令的相对路径http:。 shell 找不到该目录或文件,并这样说。如果您尝试运行名为(例如)的命令,您将收到相同的错误消息:foo/bar/grill/snorklewacker

另一方面,如果输入不带路径名分隔符的裸命令名,则 shell 会PATH按照目录出现的顺序检查环境变量中的目录列表,以查看它们是否包含该程序。因此,如果您在我的系统上按提示输入unix.stackexchange.com,shell 将进行搜索以查找:

  • /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

相关内容