例如,当我插入,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.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
第二个错误源自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
) 并在出现错误时立即退出 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
。