4.2 Bash 内建命令(Bash Builtin Commands)

这一节所描述的是 Bash 中独有的,或经过扩展的内建命令。其中有一些命令是定义在 POSIX 标准中的。

alias

alias [-p] [name[=value] ...]

如果“alias”命令不带有任何参数或使用了“-p”选项,则将别名列表表示为可用于再次输入的格式输出到标准输出中。如果提供了参数,则为每个给出“value”值的“name”进行别名定义。如果没有给出“value”,则打印出该别名的名称和值。关于别名的描述,请参考 6.6 节《别名》。

bind

bind [-m keymap] [-lpsvPSVX] bind [-m keymap] [-q function] [-u function] [-r keyseq] bind [-m keymap] -f filename bind [-m keymap] -x keyseq:shell-command bind [-m keymap] keyseq:function-name bind [-m keymap] keyseq:readline-command

显示当前读取行(Readline)的键和函数的绑定,或将读取行函数或宏与一个键序列绑定,或设置一个读取行变量。每一个非选项参数是一个命令,其可以出现在读取行初始化文件(参见 8.3《Readline 初始化文件》)中。但每一个绑定或命令必须作为一个分开的参数进行传递;例如,““\C-x\C-r”:re-read-init-file”。

如果下列选项出现,则具有如下含义:

选项含义
-m keymap使用“keymap”在后继绑定中作为映射键产生作用。可接受的“keymap”名称有:“emacs”、“emacs-standard”、“emacs-meta”、“emacs-ctlx”、“vi”、“vi-move”、“vi-command”和“vi-insert”。“vi”等同于“vi-command”(“vi-move”也是一个意思);“emacs”等同于“emacs-standard”。
-l列出所有读取行函数的名称。
-p显示为可用于输入或在读取行初始化文件中使用的读取行函数名称和绑定。
-P列出当前读取行函数名称和绑定。
-v显示为可用于输入或在读取行初始化文件中使用的读取行变量名称和绑定。
-V列出当前读取行变量名称和值。
-s显示输出为可用于输入或在读取行初始化文件中使用的,绑定到宏的读取行键序列和字符串。
-S显示输出绑定到宏的读取行键序列和字符串。
-f filename从“filename”中读取绑定键。
-q function查询哪个键调用了这个函数。
-u function解除这个函数的所有绑定的键。
-r keyseq移除“keyseq”的任何当前绑定。
-x keyseq:shell-command在任何时候输入“keyseq”都会执行“shell-command”。当“shell-command”执行时,shell 会将读取行的行缓冲内容设置到变量“READLINE_LINE”中,并且变量“READLIN_POINT”和“READLINE_MARK”会分别设置为插入点的当前位置和保存的插入点(标记位)。如果执行的命令改变了“READLINE_LINE”、“READLINE_POINT”或“READLINE_MARK”的任何一个值,则新值会反应到编辑状态中。
-X以可以作为重新输入的格式列出所有绑定到 shell 命令的键序列和这些关联的命令。

返回状态是零,除非提供了一个无效的选项或出现了一个错误。

builtin

builtin [shell-builtin [args]]

运行一个 shell 内建命令,并将参数“args”传入,最后返回该命令的退出状态。在定义一个与 shell 内建命令重名的函数时,在该函数中保留内建命令的功能时,该命令非常有用。如果“shell-builtin”不是一个内建命令时,会返回非零状态。

caller

caller [expr]

返回任意活动的子程序调用(一个 shell 函数或一个使用“.”或“source”内建命令执行的脚本)的上下文。

不加参数“expr”时,“caller”显示当前子程序调用的行号和源文件名。如果提供的“expr”是一个非负整数,则 caller 显示的是当前执行调用堆栈中相对位置的行号、子程序名称和源文件。这个额外的信息是有用的,例如打印堆栈追踪。当前 frame 是“frame 0”。

返回状态值为零,除非 shell 没有执行一个子程序调用或“expr”没有对应到调用堆栈中的一个有效位置。

command

command [-pVv] command [arguments ...]

运行带有“arguments”参数的“command”命令,忽略任何和参数“command”相同名称的函数。只执行 shell 内建命令或在 PATH 变量中搜索到的命令。如果有一个 shell 函数,其名称是 ls,在函数中运行“command ls”就会执行外部命令 ls,而不是递归调用该函数。“-p”选项的含义是使用变量 PATH 为默认值,用于确保可找到所有的标准命令工具。如果找不到要运行的命令或出现了一个错误,则返回状态值为 127,否则返回命令“command”的退出状态。

如果提供了“-V”或“-v”选项,则打印命令“command”的描述。“-v”选项使用单一单词来表示调用“command”的命令名或文件名;“-V”选项则产生更多的说明。在这种情况下,如果找到命令则返回状态零,否则返回非零。

declare

declare [-aAfFgiIlnrtux] [-p] [name[=value] ...]

声明变量并给其设置属性。如果没有给出变量名,则显示所有变量的值。

“-p”选项用于显示每个“name”所代表的变量的值和属性。当使用“-p”选项时还带有“name”参数,其它附加选项除了“-f”和“-F”之外,都会被忽略。

当出现“-p”选项并且未给出“name”参数时,“declare”将会显示带有由其它选项指定的属性的所有变量的属性和变量值。如果在使用“-p”时没有其它选项出现,则“declare”显示所有变量的属性和值。“-f”选项用于只显示 shell 函数。

“-F”选项不会显示函数定义,仅显示函数名和属性。如果使用“shopt”命令开启了 shell 选项“extdebug”,将显示每个“name”的定义所在的源文件名和所在行数。

即使当“declare”执行在 shell 函数内部,“-g”选项也会在全局作用域强制创建或修改变量。但在其它情况下,该选项会被忽略。

“-I”选项会使本地变量继承自附近作用或中具有相同“name”名的现有变量的属性(“nameref”属性除外)和值。如果没有现有变量存在,本地变量在初始时重置。

下列选项常用于对带有指定属性的变量进行限制输出或给出变量属性:

选项说明
-a每一个“name”为一个索引数组变量。
-A每一个“name”为一个关联数组变量。
-f只用于函数名。
-i视变量为一个整数类型;当变量赋值时进行算术运算。
-l当变量进行赋值时,所有大写字母都改写为小写字母。禁用大写属性。
-n给予每一个“name”变量“nameref”属性,使其成为名称引用并参考到另外一个其它变量上。由“name”的值来定义那个其它变量。对于“name”的所有引用、赋值和属性修改,除了使用或改变“-n”属性其本身外,都将应用于“name”值所参考到的变量身上。“nameref”属性不能应用到数组变量上。
-r设置“name”变量为只读。这些只读变量在后继赋值语句中不能进行赋值操作或进行释放操作。
-t对每一个“name”变量设置“trace”属性。追踪函数从调用方 shell 继承 DEBUG 和 RETURN 捕获器。“trace”属性对于变量来说没有特殊意义。
-u当变量赋值时,将所有小写字母都改写为大写字母。禁用小写属性。
-x通过环境将每一个“name”导出给后继命令。

使用加号“+”替换选项前面的减号“-”来关闭属性。但例外是“+a”和“+A”不能用于摧毁数组变量,“+r”不能用于移除只读属性。在函数中使用“declare”时,其会将每个“name”变量本地化,就像使用了“local”命令一样,但使用“-g”选项时除外。如果一个变量名后跟随着“=value”,则该变量的值将设置为“value”。

当使用“-a”或“-A”和复合赋值语法来创建数组变量时,直到后继赋值发生时附加属性才会生效。

返回状态为零,除非下列情况发生:

echo

echo [-neE] [arg ...]

使用空格作为分隔符和使用换行作为终止符来输出参数“arg”。返回状态为零,除非出现一个写错误。如果指定了“-n”,则抑制尾部的换行。如果给出“-e”选项,则开启反斜线转义字符解释器。“-E”选项则是关闭反斜线转义字符解释器,即使系统默认对其转义。shell 选项“xpg_echo”默认可以用来动态确定 echo 是否对转义字符进行转义扩展。“echo”不会将“—”解释为选项结束。

下列是“echo”解释转义列表:

转义符含义
\a报警(铃声)
\b向前删除
\c抑制进一步的输出
\e
\E
取消
\f换页
\n换行
\r回车
\t水平制表符
\v垂直制表符
\反斜线
\0nnn八进制值nnn(0 到 3 位)表示一个 8 位字符
\xHH十六进制值HH(1 到 2 位)表示一个 8 位字符
\uHHHH十六进制值HHHH(1 到 4 位)表示一个 Unicode(ISO/IEC 10646)字符
\UHHHHHHHH十六进制值HHHHHHHH(1 到 8 位)表示一个 Unicode(ISO/IEC 10646)字符

enable

enable [-a] [-dnps] [-f filename] [name ...]

用于开启或禁用 shell 内建命令。禁用一个内建命令可以使一个与该内建命令同名的外部命令直接执行,而不用指定完整路径,即使 shell 通常情况下在搜索外部命令前先对内建命令进行搜索。如果使用了“-n”选项,则禁用“name”参数所代表的内建命令。否则,则是开启该内建命令。例如,要直接使用一个在“$PATH”中叫 test 的外部命令而不是 shell 的内建命令 test 时,先键入“enable -n test”来禁用内建命令。

如果“-p”选项出现,或没有给出 name 参数,则打印 shell 内建命令列表。不带有其它参数时,列表所包含的是所有开启的 shell 内建命令。“-a”选项意味着列出的内建命令列表具有指示该命令是处于开启还是关闭状态。

在支持动态加载的系统中,“-f”选项意味着从共享对象 filename 中加载新内建命令。“-d”选项会删除使用“-f”选项加载进来的内建命令。

如果没有选项出现,则显示一个 shell 内建命令列表。“-s”选项只显示 POSIX 特定的内建命令。如果在使用“-s”的同时加入“-f”,则新加载的内建命令就变为特定内建命令。

返回状态为零,除非“name”不是一个 shell 内建命令或从共享对象中加载新内建命令时出错。

help

help [-dms] [pattern]

显示关于内建命令的帮助信息。如果指定了“pattern”,“help”则给出所有匹配“pattern”的命令的详细帮助。否则将打印内建命令列表。

如果出现选项,则具有以下含义:

选项含义
-d显示每一个“pattern”的短描述。
-m使用类似 man page 格式显示每一个“pattern”的描述。
-s只显示每一个“pattern”的简短概要语法。

返回状态为零,除非“pattern”没有匹配到任何命令。

let

let expression [expression ...]

内建命令“let”允许在 shell 变量上执行算术运算。每一个表达式“expression”可以依据下面 6.5 节《Shell 算术运算》中的规则进行表达式运算。如果最后一个表达式运算结果为 0,则“let”返回 1;否则返回 0。

local

local [option] name[=value] ...

对于命令中的每一个参数,会创建以“name”命名的本地变量,并将“value”赋值给它。“declare”命令的所有选项是该命令可接受的选项。“local”只能用于函数内部;它将变量“name”的作用域设置为在该函数和其子函数中可见。如果“name”是“-”,则 shell 选项集合只作用于调用“local”命令的函数内部:在函数内部使用“set”内建命令所改变的 shell 选项,会在函数返回时将其还原到初始值。还原操作所产生的作用就像使用“set”命令将选项值设置为函数调用之前的状态一样。返回状态为零,除非在函数外部使用了“local”命令,或提供了一个无效的“name”,或“name”是一个只读变量。

logout

logout [n]

退出已登录的 shell,向 shell 的父进程返回状态“n”。

mapfile

mapfile [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]

从标准输入读取多行并存入索引数组变量“array”中。如果提供了“-u”选项,则从文件描述符“fd”中读取。变量 MAPFILE 是默认的数组“array”。如果提供了选项,则具有下列含义:

选项含义
-d使用“delim”的第一个字符代替换行来表示每一输入行的结束。如果“delim”是空字符串,“mapfile”在读到字符 NUL 时才结束行读取。
-n复制至多“count”行。如果“count”是 0,则复制所有行。
-O从数组“array”的索引位置“orgin”开始进行赋值。默认索引位置为 0。
-s丢弃前“count”行的读取。
-t从每一行读取中移除尾部的分隔符“delim”(默认是换行)。
-u从文件描述符“fd”中读取行,而不是从标准输入读取。
-C在每一次读取“quantum”行时执行“callback”。使用“-c”选项指定“quantum”。
-c用于指定在每一次调用“callback”时读取的行数。

如果在指定了“-C”时未指定“-c”,则默认的配额“quantum”为 5000。当执行“callback”时,其提供要分配的下一个数组元素的索引位置,并且将分配给那个元素的行作为附加参数。在行读取后,将其分配给数组元素之前运行“callback”。

如果没有明确给出“origin”位置,“mapfile”会在数组“array”赋值前将其清空。

“mapfile”返回成功状态,除非提供了一个无效的选项或选项参数,或数组是无效的或不可被赋值的,或数组不是索引数组。

printf

printf [-v var] format [arguments]

按照“format”的格式将格式化后的“arguments”写入到标准输出。“-v”选项会将要打印到标准输出的结果分配到变量“var”中。

format”的格式是包含了三种对象类型的字符串:明文字符,可直接复制到标准输出;字符转义序列,转换后复制到标准输出;格式规范,每个规范都会打印后面的连续参数“argument”。

除了 printf(1)中的标准格式,printf 还会解释下列扩展:

扩展说明
%b会使“printf”将相应“argument”里的反斜线转义序列使用与“echo -e”(参见 4.2《Bash 内建命令》)相同的方式对其进行转义扩展。
%q会使“printf”使用“format”设定的格式将“argument”输出并可重用于 shell 输入。
%(datefmt)T会使“printf”使用“strftime(3)”格式字符串“datefmt”格式化格式化输出日期时间字符串。相应的参数“argument”是一个代表从新纪元开始的秒数的整数。可用到两个特殊参数值:“-1”代表当前时间,“-2”代表调用 shell 时的时间。如果没有指定参数,则转换行为就像给出了“-1”一样。这是“printf”正常行为的一个例外。

“%b”、“%q”和“%T”可以在格式规范中指定字段的宽度和精度,并且扩展后的参数需要比原始值使用更多字节(或更宽的字段)来表示这一字段,通常所包含的字符要多于原始字符。

除了开头允许使用加号“+”或减号“-”,对于非字符串格式标识符的参数都被视为 C 语言常量。并且如果开头的字符是单引号或双引号,则后面跟随的字符值是 ASCII 值。

format”参数按需求对所有“arguments”参数进行格式化。如果“format”需要的参数个数比“arguments”提供的个数要多的话,格式化规范行为就会为所需的额外参数提供适当的 0 值或空字符串。命令成功的返回值是零,失败为非零值。

read

read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]

从标准输入或从“-u”选项提供的参数“fd”代表的文件描述符中读取一行。之后使用在 3.5.7《单词分割》中描述的规则进行单词分割,并且将第一个单词分配给第一个“name”参数,将第二个单词分配给第二个“name”参数,以此例推。如果单词个数多于“name”个数,则多余的单词和其之间的分隔符都分配给最后一个“name”参数。如果单词个数少于“name”个数,则剩余“name”参数将被分配为空(empty)值。使用变量“IFS”中的字符将读取行中的单词分割,其分割规则是与 shell 用于扩展分割的一样(参见 3.5.7《单词分割》)。可以使用反斜线“\”移除其后面一个字符的特殊含义和用于行的继续读取。

如果出现下列选项,则具有以下含义:

选项含义
-a aname分割出的单词分配给索引数组变量“aname”,起始下标为 0。在分配之前会将“aname”中的所有元素先删除。忽略其它“name”参数。
-d delimdelim”的第一个字符用于替换换行作为输入行的终结符。如果“delim”是一个空字符串,“read”将读取到 NUL 字符时才会终结一行。
-eReadline(参见第 8 章《命令行编辑》)用于获取行。Readline 使用当前编辑设置(或使用默认设置,如果之前没有激活过行编辑),但使用 Readline 的默认文件名补全机制。
-i text如果 Readline 正在读取行,在编辑开始之前将“text”放入编辑缓冲中。
-n nchars“read”在读取“nchars”个字符后直接返回退出,而不是等到一整行读取完成。但如果在分隔符出现之前的字符个数小于 nchars,则分隔符生效。
-N nchars除非遇到 EOF 或“read”运行超时,其会在精确读取“nchars”个字符后返回退出,而不会等待整行输入完成。在输入行中出现的分隔符不会被特殊对待,并且直到读取了“nchars”个字符后“read”才会返回退出。读取的结果不会依据变量 IFS 中的字符进行单词分割,其目的在于将读取的字符精确地分配给变量(关于反斜线的例外,可参见下面的“-r”选项)。
-p prompt在读取输入之前,显示一个末尾不带有换行的输入提示。只有在输入是来自于终端时才会显示这个提示。
-r如果给出了这个选项,反斜线将不会作为转义字符使用。反斜线会作为这一行的一部分进行读取。通常,一个反斜线加换行不会作为行继续读取符。
-s静默模式。如果行输入来自于终端,读取的字符不会在终端上回显出来。
-t timeout如果在“timeout”指定的秒数里没有完成整行的读取(或没有读取到指定的字符个数),则会引起“read”读取超时并且返回失败状态。“timeout”可以设置为一个带有小数点的小数。这个选项只在输入是从终端、管道或其它特殊文件中读取时生效;当其从一个常规文件中读取时则不会产生作用。如果读取超时,“read”会将部分已输入的字符存入指定的变量“name”中去。如果“timeout”设置为 0,“read”不会试图读取任何数据而立即返回退出。如果在指定的文件描述符上的输入是可用的,则出状态为零,否则返回非零值。如果“timeout”超时,则返回一个大于 128 的退出状态。
-u fd从文件描述符“fd”中读取输入。

如果没有给出“name”参数,不包含尾部分隔符的未做任何更改的读取行将分配给变量 REPLY。正常退出状态为零,除非遭遇“end-of-file”,或“read”超时(在这种情况下返回值大于 128),或变量赋值出错(例如对读取变量进行赋值),或在“-u”选项使用时给出了一个无效的文件描述符。

readarray

readarray [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]

从标准输入读取行,或如果使用了“-u”选项则从文件描述符读取,之后存入索引数组变量“array”中。与“mapfile”命令相同。

source

source filename

与 Bourne Shell 内建命令“.”相同。

type

type [-afptP] [name ...]

对于每一个给出的“name”参数,如果将其用做一个命令名,则对其进行解释说明。

如果使用了“-t”选项,“type”则打印“alias”、“function”、“builtin”、“file”或“keyword”其中的一个单词来表示该命令是一个别名、shell 函数、shell 内建命令、磁盘文件或是一个保留字。如果找不到“name”,则不会打印任何信息,并且返回失败状态。

如果使用了“-p”选项,“type”会返回“name”代表的可执行的磁盘文件名,或如果“name”在使用“-t”时返回的不是一个“file”类型,则什么都不返回。

“-P”选项对每一个“name”参数在 PATH 路径中进行强制搜索,即使该在使用“-t”时不会返回“file”类型。

如果一个命令已经被缓冲到哈希表中,“-p”和“-P”则打印这个哈希值,这并不需要该文件首先出现在“$PATH”中。

如果“-a”选项出现,“type”会将所有包含可执行的“name”文件位置返回。当且仅当同时没有“-p”选项出现,其还会列出别名和函数。

如果“-f”选项出现,“type”不会试图去寻找 shell 函数。

如果所有“name”参数都找到,则返回状态零。如果有一个没有找到,则返回非零。

typeset

typeset [-afFgrxilnrtux] [-p] [name[=value] ...]

“typeset”命令是用于兼容 Korn shell。它与内建命令“declare”用法类似。

ulimit

ulimit [-HS] -a ulimit [-HS] [-bcdefiklmnpqrstuvxPRT] [limit]

如果系统允许的话,“ulimit”可通过可用资源提供对 shell 启动的进程进行控制。如果给出下列选项,则具有下列含义:

选项含义
-S变更并报告关联到资源的软限制。
-H变更并执行关联到资源的硬限制。
-a报告所有当前限制;不进行限制设置。
-b最大套接字缓冲大小。
-c创建的核心文件最大大小。
-d一个进程的数据段最大大小。
-e最大计划优先级(“nice”)。
-fshell 及其子 shell 的文件写入最大大小。
-i挂起信号的最大数量。
-k可分配的 kqueues 的最大数量。
-l可被锁定的内存最大大小。
-m最大驻留集大小(大多数系统不遵守这一限制)。
-n打开文件描述符的最大个数(大多数系统不允许设置这个值)。
-p管道缓冲大小。
-qPOSIX 消息队列的最大字节数量。
-r最大实时计划优先级。
-s最大堆栈大小。
-t最大 CPU 时间占用秒数。
-u对于一个单用户的最大可用进程数量。
-vshell 的最大可用虚拟内存数量,有些系统中还包含其子 shell 的。
-x最大文件锁数量。
-P最大伪终端的数量。
-R在被阻止前实时进程可运行的最大时长,单位毫秒。
-T最大线程数。

如果给出“limit”参数,并且没有使用“-a”选项,则“limit”则是指定资源的新值。“limit”特殊值“hard”、“soft”和“unlimited”分别代表当前的硬限制、当前的软限制和没有限制。一旦设置了一个硬限制,其不能被非根用户进行增量设置;软限制最大可以增加到硬限制的值。否则,除非提供“-H”选项,则只打印所指定资源的软限制当前值。当指定了多于一个的资源,如果所提供的限制名称和单位正确,则打印在其值的前面。当在设置新限制时,如果“-H”和“-S”选项都没有出现,则对硬、软两种限制都进行设置。如果没有选项给出,则假定为使用了“-f”选项。所有的值是以 1024 字节为一个增量单位,除了“-t”是使用的秒为单位;“-R”是使用毫秒;“-p”是使用 512 字节块为单位;“-P”、“-T”、“-b”、“-k”、“-n”和“-u”则是没有设定增量单位;并且,当在 POSIX 模式中,“-c”和“-f”则是使用 512 字节作为增量单位。

正常返回状态为零,除非给出了一个无效选项或参数,或当设置新限制时出现了一个错误。

unalias

unalias [-a] [name ... ]

从别名列表中删除给出的每一个“name”参数所代表的别名。如果“-a”选项出现,则删除所有别名。在 6.6《别名》一节有对别名的详细说明。