Linux内建命令


内建命令

内建命令指的就是包含在 Bash 工具集中的命令。这主要是考虑到执行效率的问题——内建命令将比外部命令的执行得更快,外部命令通常需要 fork 出一个单独的进程来执行。另外一部分原因是特定的内建命令需要直接存取 shell 内核部分。

一个内建命令通常与一个系统命令同名,但是 Bash 在内部重新实现了这些命令。比如,Bash 的 echo 命令与 /bin/echo 就不尽相同,虽然它们的行为绝大多数情况下是一样的。
关键字的意思就是保留字。对于 shell 来说关键字有特殊的含义,并且用来构建 shell 的语法结构。
比如,”for”,”while”,”do”和”!”都是关键字。与内建命令相同的是,关键字也是 Bash 的骨干部分,但是与内建命令不同的是,关键字自身并不是命令,而是一个比较大的命令结构的一部分。

I/O 类
echo
重要程度:高
打印(到stdout)一个表达式或变量。
echo 需要使用 -e 参数来打印转义字符。
一般的每个 echo 命令都会在终端上新起一行,但是 -n 选项将会阻止新起一行。
注意:echo command 将会删除任何有命令产生的换行符。
$IFS(内部域分隔符)一般都会将\n(换行符)包含在它的空白字符集合中。Bash 因此会根据参数中的换行来分离命令的输出。然后echo 将以空格代替换行来输出这些参数。
注意:这个命令是 shell 的一个内建命令,与 /bin/echo 不同,虽然行为相似。

printf
重要程度:中
printf 命令,格式化输出,是 echo 命令的增强。它是 C 语言 printf() 库函数的一个有限的变形,并且在语法上有些不同。
使用 printf 的最主要的应用就是格式化错误消息。

read
重要程度:高
从 stdin 中读取一个变量的值,也就是与键盘交互取得变量的值。使用 -a 参数可以取得数组。
对 read 命令来说,-n 选项将不会检测ENTER(新行)键。
read 命令的 -t 选项允许设置read的超时值。
read 命令也可以从重定向的文件中读入变量的值。如果文件中的内容超过一行,那么只有第一行被分配到这个变量中。如果 read 命令有超过一个参数,那么每个变量都会从文件中取得以定义的空白分隔的字符串作为变量的值。

文件系统类
cd
重要程度:高
cd 修改目录命令

pwd
重要程度:高
打印当前的工作目录。这将给用户(或脚本)当前的工作目录。使用这个命令的结果和从内建变量 $PWD 中读取的值是相同的。

pushd、popd、dirs
重要程度:低
这几个命令可以使得工作目录书签化,就是可以按顺序向前或向后移动工作目录。
压栈的动作可以保存工作目录列表。选项可以允许对目录栈作不同的操作。
pushd dir-name 把路径 dir-name 压入目录栈,同时修改当前目录到 dir-name。
popd 将目录栈中最上边的目录弹出,同时修改当前目录到弹出来的那个目录。
dirs 列出所有目录栈的内容(与 $DIRSTACK 便两相比较)。一个成功的 pushd 或者 popd 将会自动的调用 dirs 命令。

变量类
let
重要程度:中
let 命令将执行变量的算术操作。在许多情况下,它被看作是复杂的 expr 版本的一个简化版。

unset
重要程度:中
unset 命令用来删除一个 shell 变量,效果就是把这个变量设为 null。

export
重要程度:中
export 命令将会使得被 export 的变量在运行的脚本(或shell)的所有的子进程中都可用。
不幸的是,没有办法将变量 export 到父进程(就是调用这个脚本或 shell 的进程)中。
关于 export 命令的一个重要的使用就是用在启动文件中,启动文件是用来初始化并且设置环境变量,让用户进程可以存取环境变量。

getopts
重要程度:中
可以说这是分析传递到脚本的命令行参数的最强力工具。这个命令与 getopt 外部命令,和C语言中的库函数 getopt 的作用是相同的。它允许传递和连接多个选项到脚本中,并能分
配多个参数到脚本中。
getopts 结构通常都组成一组放在一个 while 循环中,循环过程中每次处理一个选项和参数,然后增加隐含变量 $OPTIND 的值,再进行下一次的处理。
注意: 1.通过命令行传递到脚本中的参数前边必须加上一个减号(-)。这是一个前缀,这样getopts 命令将会认为这个参数是一个选项。事实上,getopts 不会处理不带”-“前缀的参数,如果第一个参数就没有”-“,那么将结束选项的处理。
2.使用 getopts 的 while 循环模版还是与标准的while 循环模版有些不同。没有标准 while循环中的[]判断条件。
3.getopts 结构将会取代 getopt 外部命令。

脚本行为
source, . (点命令)
重要程度:高
这个命令在命令行上执行的时候,将会执行一个脚本。在一个文件内一个 source file-name将会加载 file-name 文件。source 一个文件(或点命令)将会在脚本中引入代码,并附加到脚本中(与 C 语言中的 #include 指令的效果相同)。最终的结果就像是在使用 “sourced”行上插入了相应文件的内容,这在多个脚本需要引用相同的数据,或函数库时非常有用。

exit
重要程度:高
绝对的停止一个脚本的运行。exit 命令有可以随便找一个整数变量作为退出脚本返回 shell时的退出码。使用 exit 0 对于退出一个简单脚本来说是种好习惯,表明成功运行。
注意:如果不带参数的使用 exit 来退出,那么退出码将是脚本中最后一个命令的退出码。等价于exit $?。

exec
重要程度:中
这个 shell 内建命令将使用一个特定的命令来取代当前进程。一般的当 shell 遇到一个命令,它会 fork off 一个子进程来真正的运行命令。使用 exec 内建命令,shell 就不会 fork 了,并且命令的执行将会替换掉当前 shell。因此,当我们在脚本中使用它时,当命令实行完毕,
它就会强制退出脚本。

ture
重要程度:高
一个返回成功(就是返回0)退出码的命令,但是除此之外什么事也不做。

type[cmd]
重要程度:中
与 which 扩展命令很相像,type cmd 将给出”cmd”的完整路径。与 which 命令不同的是,type 命令是 Bash 内建命令。一个很有用的选项是 -a 选项,使用这个选项可以鉴别所识别的参数是关键字还是内建命令,也可以定位同名的系统命令。

bind
重要程度:低
bind 内建命令用来显示或修改readline[5]的键绑定。

help
重要程度:中
获得 shell 内建命令的一个小的使用总结。这与 whatis 命令比较象,但是 help 是内建命令。

作业控制命令
jobs
重要程度:中
在后台列出所有正在运行的作业,给出作业号。

disown
重要程度:中
从 shell 的当前作业表中,删除作业。

fg、bg
重要程度:中
fg 命令可以把一个在后台运行的作业放到前台来运行。而 bg 命令将会重新启动一个挂起的作业,并且在后台运行它。如果使用 fg 或者 bg 命令的时候没指定作业号,那么默认将对当前正在运行的作业做操作。

wait
重要程度:中
停止脚本的运行,直到后台运行的所有作业都结束为止,或者直到指定作业号或进程号为选项的作业结束为止。
你可以使用 wait 命令来防止在后台作业没完成(这会产生一个孤儿进程)之前退出脚本。

logout
重要程度:中
退出一个登陆的 shell,也可以指定一个退出码。

times
重要程度:中
给出执行命令所占的时间,使用如下形式输出:
0m0.020s 0m0.020s
这是一种很有限的能力,因此这不常出现于 shell 脚本中。

kill
重要程度:高
通过发送一个适当的结束信号,来强制结束一个进程。

command
重要程度:中
command 命令会禁用别名和函数的查找。它只查找内部命令以及搜索路径中找到的脚本或可执行程序。

注意一下bash 执行命令的优先级:
1.别名
2.关键字
3.函数
4.内置命令
5.脚本或可执行程序($PATH)

builtin
重要程度:低
在”builtin”后边的命令将只调用内建命令。暂时的禁用同名的函数或者是同名的扩展命令。

enable
重要程度:低
这个命令或者禁用内建命令或者恢复内建命令。如:enable -n kill 将禁用 kill 内建命令,所以当我们调用 kill 时,使用的将是 /bin/kill 外部命令。
-a 选项将会恢复相应的内建命令,如果不带参数的话,将会恢复所有的内建命令。
选项 -f filename 将会从适当的编译过的目标文件[6]中以共享库(DLL)的形式来加载一个内建命令。

autoload
重要程度:低
这是从 ksh 的 autoloader 命令移植过来的。一个带有”autoload”声明的函数,在它第一次被调用的时候才会被加载。这样做会节省系统资源。
注意:autoload 命令并不是 Bash 安装时候的核心命令的一部分。这个命令需要使用命令enable -f(见上边enable 命令)来加载。

相关内容