2019年8月16日 星期五

Linux Shell内部命令和外部命令

1. Shell内置命令:type
当输入命令时,shell将命令分成不同部分,以进行分析。这种情况,我们称shell在解析命令。每条命令的第一部分都是命令的名称,其他部分是选项或参数。
在解析命令之后,shell决定如何处理命令,其可能性有两种。一些命令在shell的内部,这意味着shell可以直接解析它们。这些命令是内部命令,通常称为内置命令(builtin command, 或者简称为builtin)。其他所有命令是外部命令,即必须独自运行的独立程序。
当输入内置命令时,shell在自己的进程内运行该命令。当输入外部命令时,shell将搜索合适的程序,然后以一个单独的进程运行该命令。这一原则类似于,假如您打电话给一家大型公司请求客户服务。如果接电话的人可以回答您的问题,那么他就自己回答问题(内部命令)。否则,他将电话转给合适的人(外部命令)。

查看一条命令是不是shell内置命令的方法有两种。第一种,可以显示该命令的说明书页。外部命令都拥有自己的说明书页,而内置命令没有。内置命令或者记录在shell的说明书页,或者记录在所有内置命令的一个特殊说明书页上。
一种查看某条命令是不是内置命令的一个特殊说明书页上。
一种查看某条命令是不是内置命令的更快捷的方式就是使用type命令。该命令的语法为:

type command…

例如:

type date time set

该命令的准确输入依赖于所使用的shell。例如,下面是在Bash中使用该命令所获得的结果:

date is /bin/date
time is a shell keyword
set in a shell builtin


下民是在Korn shell、Tcsh和C-Shell中使用该美丽所获得的结果:

date is a tracked alias for /bin/date
time is a reserved shell keyword
set is a special builtin


尽管输出有点不同,但是结果是相同的:date是外部命令;其他命令是内置命令。
此时,理解“路径别名(tracked alias)”的含义并不重要。它只是一个技术上的不同,您可以忽略。同理,我们也不需要区分内置命令和关键词(key word):它们都在shell中内置(关键词是特殊的内部命令,用于编写shell脚本)。重要的事情是意识到date命令是一条外部命令,拥有自己的文件(一种系统上是/usr/bin,其他系统是/usr/bin/date
Unix和Linux系统差不多提供有数百条外部命令,但是有多少条内部命令呢?这取决于所使用的shell。作为一个有趣的参考。下表列出了shell的内置命令数量:
shell内置命令数
Bourne shell18
Korn shell47
C-shell55
Bash69
Tcsh87
FreeBSD shell97
Zsh129
Unix shell命令有数百种。其中大多数命令都是外部命令,也就是说,它们作为独立的程序存在。但是。每种shell都有特定的数量的内部命令。内部命令是可以直接运行的命令。上表中列出了每种shell中的内置命令,包括关键词。

2. 学习内部命令
Unix传统的一部分就是当有人创建了新工具时,他应该为其他用户提供该工具的文件资料。具体而言,就是期望程序员编写新命令时,他能为这条命令提供一个说明书页。因为联机手册的格式已经定义好,所以程序员在编程结束后不难创建说明书页。实际上,几乎所有的Unix程序在发行时都提供有说明书页,以作为官方文档资料。
对于外部命令来说这一系统特别适合。因为每条外部命令都是一个单独的程序,所以可以提供自己的说明书页。但是内部命令呢?正如前面讨论的,内置命令不是单独的程序,它们是shell的一部分。因为内置命令有许多条,所以期望开发shell的程序员为每条内置命令开发一个单独的说明书页是不现实的。
实际上,所有的内置命令都记录在shell的说明书页中。例如,Korn shell的内置命令就记录在Korn shell的说明书页中。因此,有关特定shell的内置命令的信息,需要查看合适的说明书页。下述几条命令可供使用:

man bash
man ksh
man tcsh
man csh

但是,一定要记住,shell的说明书页非常长,可能需要搜索才能查到所需要的内容。
一些Unix/Linux系统对于内置命令拥有独立的说明书页。使用,apropos命令可以查看系统是不是术语这种情况:

apropos builtin

如果系统上有这样的说明书页,那么它就是快速查看所有内置命令列表的地方。对于Linux和FreeBSD来说,可以使用:

man builtin

对于Solairs来说,可以使用:

man shell_builtin

Linx还有一个help命令,可以以若干方式显示builtin说明书页中的信息。该命令的语法为:

help [-s] [command…]

其中command是命令的名称。

开始时,可以通过输入help命令本身显示一个所有内置命令的摘要列表。如果输出太长,则可以将输出发送给less每次一屏的显示信息:

help
help | less

这是显示所有内置命令的一个紧凑列表的命令,例如,当需要查找一条特定命令时。
另外还可以使用help命令显示一条或多条具体命令的信息,例如:

help set
help pwd history kill
help help

可以看出,help本身就是一条内置命令。
最后,如果只希望查看某条命令的语法,可以使用-s(synax,语法)选项:

help -s help
help -s pwd history kill
提示:
当编写shell脚本时,可以使用特殊的内置命令for、if 、while等来控制脚本流程。这些命令有时候成为关键字。
在使用Bash脚本时,查看关键字语法的最快捷方式是使用help命令。例如,查看所有Bash关键字的语法,可以使用:

help -s case for function if select time while until

如果需要查看更多的信息,则需要将-s选项忽略到:

help case for function if select time while until | less

注意该命令中使用了less,从而防止输出滚动出屏幕的范围。
3. Linux shell外部命令
如果命令不是shell中内置的——大多数命令都不是内置的,那么shell必须查找出合适的程序来执行。例如,当输入date命令时,shell必须查找date程序,然后运行它。因为,date就是一条外部命令。

沒有留言:

張貼留言