【问题标题】:How does linux find an exe without the full search path [closed]linux如何找到没有完整搜索路径的exe [关闭]
【发布时间】:2016-01-11 21:32:05
【问题描述】:

当我没有给出完整的搜索路径时,linux 在后台做什么来定位可执行文件。或者更多人可以描述它找到可执行文件的过程。

【问题讨论】:

  • "Linux" 到底是什么意思? execlp 标准 C 库调用(当不是 shell 的东西尝试执行外部命令时使用)?贝壳?还有什么?
  • ...我的意思是,如果您询问的是 Linux 内核本身,它不允许允许在没有完全限定路径的情况下调用可执行文件;它的execve 系统调用没有搜索功能。

标签: linux shell command-line executable


【解决方案1】:

它使用 PATH 环境变量。见:http://www.linfo.org/path_env_var.html

【讨论】:

  • 什么“它”?如果问题是关于外壳的,那么这个答案是不完整的——还有对别名、内置函数、函数的评估;缓存 PATH 位置的哈希查找;等等。如果是关于execl* 系列C 库调用,那么是的,这是正确的。由于 OP 只询问“Linux”,因此很难确定合适的范围。
【解决方案2】:

有点像这样:

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
}

【讨论】:

    【解决方案3】:

    来自Bash manual,“命令搜索与执行”:

    在命令被拆分成单词后,如果它产生一个简单的命令和一个可选的参数列表,则执行以下操作。

    1. 如果命令名不包含斜杠,shell 会尝试定位它。如果存在同名的 shell 函数,则会按照Shell Functions 中的说明调用该函数。

    2. 如果名称与函数不匹配,shell 会在 shell 内置函数列表中搜索它。如果找到匹配项,则调用该内置函数。

    3. 如果名称既不是 shell 函数也不是内置函数,并且不包含斜杠,Bash 会在 $PATH 的每个元素中搜索包含该名称的可执行文件的目录。 Bash 使用哈希表来记住可执行文件的完整路径名,以避免多次PATH 搜索(参见Bourne Shell Builtinshash 的描述)。只有在哈希表中找不到该命令时,才会对$PATH 中的目录进行完整搜索。如果搜索不成功,shell 将搜索一个已定义的名为 command_not_found_handle 的 shell 函数。如果该函数存在,则使用原始命令和原始命令的参数作为其参数调用它,并且该函数的退出状态变为 shell 的退出状态。如果未定义该函数,shell 将打印一条错误消息并返回退出状态 127。

    4. 如果搜索成功,或者命令名称包含一个或多个斜杠,shell 将在单独的执行环境中执行指定的程序。参数 0 设置为给定的名称,命令的其余参数设置为提供的参数(如果有)。

    5. 如果由于文件不是可执行格式而导致执行失败,并且文件不是目录,则假定它是 shell 脚本,shell 会按照Shell Scripts.

    6. 如果命令不是异步开始的,shell 会等待命令完成并收集其退出状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-07
      • 2022-01-04
      • 1970-01-01
      • 2015-01-27
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多