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


33

当我使用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
-command cat是构成系统一部分的外部程序,由于其原因,它可以执行的许多操作不是一个简单的内置程序。
Jok Sok。OK 2015年

12
type which可以给你答案,为什么which不给你答案。
Dubu 2015年

1
取决于您使用的shell
nsn 2015年

6
有趣的事实:catls都是由斯托曼本人写的。你会惊讶他写了多少东西。别忘了他写了第一个版本的编译器,它是当今世界上最好的编译器,可以编译所有内容和大多数核心实用程序。只是说一句话
亚历克·蒂尔

2
@AlecTeal您是否意识到大多数Unix系统使用的ls和cat版本早于Richard Stallman接触过的GNU版本?
Ross Ridge)

Answers:


59

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

$ 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中搜索可执行文件。因此,即使外壳程序将使用内置程序,它也会为您提供外部可执行文件的名称。

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

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

现在,让我们看一下cat

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

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


5
你可以type -all echo找出(按顺序),这是不同的“回声”已知壳(第一个是一个外壳会打电话,如果你不指定什么来改变顺序,如调用"echo"\echo,或command echo
Olivier Dulac 2015年

好答案。一个补充:echo由于历史原因,有两个版本。它从外部命令开始,然后作为内置命令添加。Bourne shell(/bin/sh)的早期版本没有它。/bin/echo保持兼容性是因为各种因素都取决于它。(同一件事也发生了test。)
Alexis

旁注:which本身可以是内置的cmd外壳,例如在tcsh中:which which which: shell built-in command.
Dan Cornilescu 2015年

我来晚了,但是为什么不检查一下它的手册页,却实际上可以看到括号之间的数字,它表明它是内置的shell还是其他东西
poz2k4444

46

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

9
其实,在我看来这是唯一的答案是地址你的问题:)
安德烈Chalella

恕我直言,这^^^是正确的。这个答案应该是公认的。
LinuxSecurityFreak

4

检查shell内置列表的另一种方法:使用compgenshell内置本身就可以了!

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

compgen -b

您可以检查catecho通过greping,如: -

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

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

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


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

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

我找不到这些选项的任何正式文档,您知道它的位置吗?
Random832 2015年

@ Random832您是否在谈论选项compgen
潘迪2015年

是的,我在Bash联机帮助页中找不到关于-b或其他选项一半含义的任何信息。后来在gnu.org/software/bash/manual/html_node/…上
Random832

@ Random832尝试man bash | grep -e '-A action$' -A 32,你可能得到的输出喜欢这样。(增加/减少数字后-A才能正确管理)。
潘迪2015年

4

您还可以使用whereis效率更高的命令,因为它可以显示命令在计算机上的位置,例如手册页库等。


-Excuse我为我的英语不好,因为我刚学还并没有那么好利用...!
笑话高级确定

2

其他人已经回答了cat,我只想用来解释这个问题echo。如果您使用类型的-a选项(列表中的所有比赛),你会看到,echo两个壳内置外部程序:

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

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


2

由于这里有一些关于使用类型来找出诸如cat内置命令或外部程序之类的命令的良好答案。我将采用更一般的方法。必须内置一些命令,因为它们会影响当前的shell。三个经典的例子是cdexecexit。有些命令不能内置,因为它们的功能取决于execve或系统调用的行为。这种方案的例子包括susudocalifesuper。所有其他命令可以构建为内置程序或外部程序。cat是此类的一个很好的示例程序,因为有一些外壳程序将其作为内置函数包含在内,而一些外壳程序则没有。值得注意的是,此类的许多内置命令也可以作为外部程序使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.