“cat”是内置 shell 还是外部程序?

“cat”是内置 shell 还是外部程序?

当我使用该type命令来查明cat是 shell 内置程序还是外部程序时,我得到以下输出:

-$ type cat
cat is hashed (/bin/cat)
-$

这是否意味着这cat是一个外部程序/bin/cat

我很困惑,因为当我检查下面的输出时,echo我发现它是一个built-in程序,但也是一个程序/bin/echo

-$ type echo
echo is a shell builtin
-$ which echo
/bin/echo
-$ 

/bin/cat所以我不能使用必然意味着外部程序的逻辑,因为 echo/bin/echo仍然是内置的。

那么我怎么知道cat是什么?内置还是外置?

答案1

type告诉您 shell 将使用什么。例如:

$ type echo
echo is a shell builtin
$ type /bin/echo
/bin/echo is /bin/echo

这意味着如果在 bash 提示符下输入echo,您将获得内置的。如果您指定路径,如 中/bin/echo,您将获得外部命令。

which相比之下,外部程序对 shell 将执行的操作没有特殊了解。在类似 debian 的系统上,which有一个 shell 脚本,用于在 PATH 中搜索可执行文件。因此,即使 shell 使用内置可执行文件,它也会为您提供外部可执行文件的名称。

如果命令仅作为内置命令可用,which则不会返回任何内容:

$ type help
help is a shell builtin
$ which help
$ 

现在,让我们看看cat

$ type cat
cat is hashed (/bin/cat)
$ which cat
/bin/cat

cat是外部可执行文件,而不是内置的 shell。

答案2

cat is hashed (/bin/cat)就像cat is /bin/cat(也就是说,这是一个外部程序)。

不同之处在于,您已经cat在此会话中运行,因此 bash 已经在哈希表中查找$PATH并将结果位置存储在哈希表中,因此不必在此会话中再次查找。

要查看会话中已散列的所有命令,请运行hash

$ hash
hits    command
   2    /usr/bin/sleep
   3    /usr/bin/man

$ type sleep
sleep is hashed (/usr/bin/sleep)

$ type man
man is hashed (/usr/bin/man)

$ type ls
ls is /usr/bin/ls

$ type cat
cat is /usr/bin/cat

$ type echo
echo is a shell builtin

答案3

检查 shell 内置列表的另一种方法:使用compgen这是 shell 内置的!

以下命令列出了所有 shell 内置命令:

compgen -b

您可以通过 grep 来检查cat,echo如下:-

$ compgen -b | grep echo
echo
$ compgen -b | grep cat
$ 

你可以看到compgen -b | grep cat没有输出的返回,意味着cat不是 shell 内置的

访问提供的有用选项列表compgen


您还可以使用另一个内置命令:help显示 shell 内置的。

$ help help
help: help [-dms] [pattern ...]
    Display information about builtin commands.

答案4

其他人已经回答了一下cat,我只是简单地解释一下这个问题echo。如果您使用 type 的-a选项(列出所有匹配项),您将echo看到两个都一个内置的 shell外部程序:

$ type -a echo
echo is a shell builtin
echo is /bin/echo

两者是完全独立的。type不带选项将仅返回找到的第一个匹配命令。因此, typefoo将显示如果运行 则将执行什么foo。可能还有其他选项,但除非您使用 ,否则这些选项不会显示-a

相关内容