当我使用该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
。