当输入命令时,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 shell | 18 |
Korn shell | 47 |
C-shell | 55 |
Bash | 69 |
Tcsh | 87 |
FreeBSD shell | 97 |
Zsh | 129 |
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
提示:3. Linux shell外部命令
当编写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,从而防止输出滚动出屏幕的范围。
如果命令不是shell中内置的——大多数命令都不是内置的,那么shell必须查找出合适的程序来执行。例如,当输入date命令时,shell必须查找date程序,然后运行它。因为,date就是一条外部命令。
沒有留言:
張貼留言