当我没有给出整个搜索路径时,linux在后台做什么来查找可执行文件。或者更多人可以描述它找到可执行文件的过程。
答案 0 :(得分:2)
它使用PATH环境变量。请参阅:http://www.linfo.org/path_env_var.html
答案 1 :(得分:0)
有点像这样:
which(){
local program="$1"
case "$program" in
/*) #If it's an absolute path, we're done
echo "$program"; return 0;;
*/*) #If it has a slash but it's not an absolute path, absolutize
echo "$PWD/$program"; return 0;;
*)
#Otherwise split $PATH on ':'
(
IFS=:; for dir in $PATH; do
#And search for a so-named executable in each component
! test -x "$dir/$program" || { echo "$dir/$program"; exit 0; }
done
)
;;
esac
return 1
}
答案 2 :(得分:0)
从Bash manual,“命令搜索和执行”:
将命令拆分为单词后,如果它导致简单命令和可选的参数列表,则执行以下操作。
如果命令名称不包含斜杠,则shell会尝试找到它。如果该名称存在shell函数,则按Shell Functions中所述调用该函数。
如果名称与函数不匹配,shell将在shell builtins列表中搜索它。如果找到匹配项,则调用该内置项。
如果名称既不是shell函数也不是内置函数,并且不包含斜杠,Bash会在
$PATH
的每个元素中搜索包含该名称的可执行文件的目录。 Bash使用哈希表来记住可执行文件的完整路径名,以避免多次PATH
次搜索(请参阅Bourne Shell Builtins中hash
的说明)。仅当在哈希表中找不到该命令时,才会执行$PATH
中目录的完整搜索。如果搜索不成功,shell将搜索名为command_not_found_handle
的已定义shell函数。如果该函数存在,则使用原始命令和原始命令的参数作为其参数调用它,函数的退出状态将成为shell的退出状态。如果未定义该函数,则shell将输出错误消息并返回退出状态127。如果搜索成功,或者命令名称包含一个或多个斜杠,则shell在单独的执行环境中执行指定的程序。参数0设置为给定的名称,命令的其余参数设置为提供的参数(如果有)。
如果由于文件不是可执行格式而导致此执行失败,并且该文件不是目录,则假定它是 shell脚本,并且shell按照Shell Scripts
- 醇>
如果命令未异步启动,则shell会等待命令完成并收集其退出状态。