为什么“which”在我可以运行的某些命令上不返回任何内容?

为什么“which”在我可以运行的某些命令上不返回任何内容?

我曾经which告诉过可运行文件的位置。例如,which pwd返回/bin/pwd。但是,我发现which aliaswhich compgen等没有返回任何内容。

命令是什么样的alias?它们不是我的 Linux 上的可执行文件吗?我在 Ubuntu 上使用 bash 4.3。

答案1

我发现which aliaswhich compgen等什么都没有返回。

这两者都是 shell 内置命令。 which对 shell 内置命令一无所知:它只是在路径中搜索可执行文件。

为了获得更可靠的结果,请使用type

$ type compgen
compgen is a shell builtin
$ type alias
alias is a shell builtin

type由于它是 shell 内置命令,因此能够更好地了解执行的内容。

为什么which不可靠

which经常会给出错误答案。观察:

$ type pwd
pwd is a shell builtin
$ which pwd
/bin/pwd

当您运行 时pwd,如果不指定明确的路径,shell 将执行其内置命令,而不是which找到的可执行文件。

以下是更多which给出错误答案的例子:

$ type echo
echo is a shell builtin
$ which echo
/bin/echo
$ type [
[ is a shell builtin
$ which [
/usr/bin/[

观察:

$ type /bin/echo
/bin/echo is /bin/echo

当您为 提供明确的路径时echo,例如/bin/echo,那么 shell 将运行该可执行文件,而不是其内置命令。 type正如您在上面看到的,它也知道这一点。

which内部如何运作

在类似 Debian 的系统上,which有一个简单的 shell 脚本,其中的相关部分是:

   for ELEMENT in $PATH; do
    if [ -z "$ELEMENT" ]; then
     ELEMENT=.
    fi
    if [ -f "$ELEMENT/$PROGRAM" ] && [ -x "$ELEMENT/$PROGRAM" ]; then
     puts "$ELEMENT/$PROGRAM"
     RET=0
     [ "$ALLMATCHES" -eq 1 ] || break
    fi
   done

如您所见,它沿着 PATH 进行简单搜索,查找给定名称的可执行文件。

答案2

我认为这是因为没有名为aliascompgen等的程序/文件。它们可能只是keywordsBASH 作为语言解释器所知道的。

您可以认为 BASH 是一个程序,并且alias只是该程序中方法的名称。

相关内容