4.2 Bash的内置命令
这一节描述了Bash特有的或者已经被扩展的内置命令。 其中一些命令在POSIX标准中被指定。
alias
alias [-p] [name[=value] …]
如果没有参数或者有-p选项,
alias
将别名列表打印在标准输出上,允许它们作为输入被重复使用。 如果提供了参数,每个name的value将被定义一个别名。如果没有给出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 bind readline-command-line
显示当前Readline(见8 命令行的编辑)的键和函数绑定,将一个键序列与Readline函数或宏绑定,或设置Readline变量。 每个非选项参数是一个命令,因为它将出现在Readline初始化文件中(见8.3 Readline 初始化文件),但每个绑定或命令必须作为一个单独参数传递;例如:‘"\C-x\C-r":re-read-init-file’ 。
选项,如果提供的话,有以下含义。
-m keymap
使用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
列出所有的Readline函数的名称。
-p
以可用作输入或在Readline初始化文件中使用的方式显示 Readline 函数名称和绑定。
-P
列出当前的Readline函数名称和绑定情况。
-v
以可用作输入或在 Readline 初始化文件中使用的方式显示 Readline 变量名称和值。
-V
列出当前的Readline变量名称和值。
-s
显示与宏绑定的Readline按键序列和它们输出的字符串,以便它们可以作为输入或在Readline初始化文件中使用。
-S
显示与宏绑定的Readline键序列和它们输出的字符串。
-f filename
从filename中读取键的绑定。
-q function
查询哪些键调用命名函数。
-u function
解除绑定到指定函数的所有键。
-r keyseq
移除当前对keyseq的任何绑定。
-x keyseq:shell-command
使shell-command在输入keyseq时被执行。 当shell-command被执行时,shell将
READLINE_LINE
变量设置为Readline行缓冲区的内容,将READLINE_POINT
和READLINE_MARK
变量分别设置为插入点的当前位置和保存的插入点(mark)。shell将用户提供的任何数字参数分配给READLINE_ARGUMENT
变量。 如果没有参数,该变量就不会被设置。 如果执行的命令改变了READLINE_LINE
、READLINE_POINT
或READLINE_MARK
中的任何一个值,这些新值将反映在编辑状态中。-X
列出所有与shell命令绑定的按键序列,以及相关的命令,其格式可以作为输入重复使用。
除非提供了一个无效的选项或发生了错误,否则返回状态为零。
builtin
builtin [shell-builtin [args]]
运行一个shell buildin,将args传给它,并返回其退出状态。 这在定义一个与shell builtin同名的shell函数时很有用,可以在函数中保留buildin的功能。 如果shell-builtin不是一个shell builtin命令,则返回状态为非零值。
caller
caller [expr]
返回任何活动的子程序调用的上下文(一个shell函数或用
.
或source
内置程序执行的脚本)。如果没有expr,
caller
显示当前子程序调用的行号和源文件名。 如果提供一个非负整数作为expr,caller
显示当前执行调用栈中该位置对应的行号、子程序名和源文件。这个额外的信息可以被用来,例如,打印一个堆栈跟踪。当前帧是第0帧。返回值为0,除非shell没有执行子程序调用,或者expr没有对应于调用堆栈中的有效位置。
command
command [-pVv] command [arguments …]
运行带有arguments的command,忽略任何名为command的shell函数。 只执行shell内置命令或通过搜索
PATH
找到的命令。 如果有名为ls
的shell函数,在该函数内运行‘command ls’将执行外部命令ls
而不是递归调用该函数。-p选项意味着使用PATH
的默认值,保证能找到所有的标准实用程序。 如果command找不到或发生错误,这种情况下的返回状态为127,否则为command退出状态。如果提供了-V或-v选项,就会打印command的描述。-v选项使一个表示用于调用command的命令或文件名的单字被显示出来;-V选项产生一个更粗略的描述。在这种情况下,如果找到了command,则返回状态为零,如果没有则为非零。
declare
declare [-aAfFgiIlnrtux] [-p] [name[=value] …]
声明变量并赋予其属性。如果没有给出name,那么就显示变量的值来代替。
-p选项将显示每个name的属性和值。 -p与name参数一起使用时,除了-f和-F之外,其他选项都会被忽略。
当-p没有提供name参数时,
declare
将显示所有具有附加选项所指定属性的变量的属性和值。 如果没有提供其他选项与-p,declare
将显示所有shell变量的属性和值。-f选项将把显示范围限制在shell函数上。-F选项抑制了函数定义的显示;只有函数名称和属性被打印出来。 如果使用
shopt
启用了extdebug
shell选项(见2 Shopt 内置程序),每个name被定义的源文件名和行号也被显示出来。-F意味着-f。-g选项强制在全局范围内创建或修改变量,即使
declare
是在shell函数中执行的。 在所有其他情况下,它被忽略了。-I选项使局部变量继承周围作用域中任何具有相同name的现有变量的属性(除了
nameref
属性)和值。 如果没有现有的变量,局部变量最初是未设置的。下面的选项可以用来限制输出到具有指定属性的变量,或者给变量赋予属性。
-a
每个name都是一个有索引的数组变量(见6.7 数组)。
-A
每个name都是一个关联数组变量(见6.7 数组)。
-f
只使用函数名称。
-i
变量将被视为一个整数;当变量被赋值时,将进行算术运算(见6.5 shell算术)。
-l
当变量被赋值时,所有大写字母都被转换为小写字母。 大写字母的属性被禁用。
-n
给每个name赋予
nameref
属性,使其成为另一个变量的名称引用。 该另一个变量由name的值定义。 所有对name的引用、赋值和属性修改,除了那些使用或改变-n属性本身,都是在name的值引用的变量上执行的。 nameref属性不能应用于数组变量。-r
使names成为只读的。然后这些名字不能被后续的赋值语句赋值或取消设置。
-t
给每个name赋予
trace
属性。 被追踪的函数从调用的shell中继承DEBUG
和RETURN
陷阱。 追踪属性对变量没有特殊意义。-u
当变量被赋值时,所有的小写字母都被转换为大写字母。 小写字母的属性被禁用。
-x
标记每个名,以便通过环境导出到后续的命令中。
使用‘+’代替‘-’可以关闭该属性,但‘+a’和‘+A’不能用于销毁数组变量,而且‘+r’不会删除只读属性。当在一个函数中使用时,
declare
使每个name成为局部,就像local
命令一样,除非使用了-g选项。 如果一个变量名后面是=value,那么该变量的值将被设置为value。当使用-a或-A和复合赋值语法创建数组变量时,附加属性在后续的赋值中才会发生作用。
返回状态为0,除非遇到一个无效的选项,试图使用‘-f foo=bar’ 来定义一个函数。试图为一个只读变量赋值,试图为一个数组变量赋值而不使用复合赋值语法(见6.7 数组),name之一不是有效的shell变量名,试图为一个只读变量关闭只读状态,试图为一个数组变量关闭数组状态,或者试图用-f显示一个不存在的函数。
echo
echo [-neE] [arg …]
输出args,用空格隔开,以换行结束。 返回状态为0,除非发生写入错误。 如果指定了-n,则抑制尾部的换行。 如果给出-e选项,则启用对以下反斜线转义字符的解释。-E选项禁用这些转义字符的解释,即使是在默认解释这些字符的系统上。
xpg_echo
shell选项可以用来动态地确定echo
是否默认解释这些转义字符。echo
不解释--意味着选项的结束。echo
解释以下转义序列。\a
警报(铃)
\b
退格键
\c
遏止进一步的输出
\e
\E
转义
\f
换页
\n
换行
\r
回车
\t
水平制表符
\v
垂直制表符
\\
反斜杠
\0nnn
八位字符,其值为八进制值nnn(0到3个八进制数字)。
\xHH
八位字符,其值为十六进制值HH(一个或两个十六进制数字)。
\uHHHH
统一码(ISO/IEC 10646)字符,其值为十六进制值HHH(一至四位十六进制数字)。
\UHHHHHHHH
统一码(ISO/IEC 10646)字符,其值为十六进制值HHHHH(一至八位十六进制数字)。
enable
enable [-a] [-dnps] [-f filename] [name …]
启用和禁用内置的shell命令。 禁用内置命令允许执行与shell内置命令同名的磁盘命令,而不需要指定完整的路径名,尽管shell通常会在磁盘命令之前搜索内置命令。 如果使用-n,name将被禁用。否则name就会被启用。例如,要使用通过
$PATH
找到的test
二进制文件,而不是shell的内置版本,请输入‘enable -n test’。如果提供了-p选项,或者没有出现name参数,就会打印一份shell内置程序的列表。在没有其他参数的情况下,该列表由所有启用的shell内置程序组成,-a选项意味着列出每个内置程序,并标明它是否被启用。
-f选项意味着在支持动态加载的系统中,从共享对象filename中加载新的内置命令name。 Bash将使用
BASH_LOADABLES_PATH
变量的值作为搜索filename的目录的冒号分隔列表。 默认值取决于系统。 -d选项将删除用-f加载的内置命令。如果没有选项,将显示一个shell内置程序的列表。 -s选项将
enable
限制在POSIX特殊内置程序。如果-s与-f一起使用,新的内置程序就会成为一个特殊的内置程序(见4.4 特殊的内建程序)。如果没有提供任何选项,并且name不是shell内置的,
enable
将尝试从名为name的共享对象中加载name,就像命令是‘enable -f name name’一样。返回状态为0,除非name不是shell的内建程序,或者从共享对象加载新的内建程序时出现错误。
help
help [-dms] [pattern]
显示有关内置命令的有用信息。 如果pattern被指定,
help
会给出与pattern相匹配的所有命令的详细帮助,否则会打印出内置命令的列表。选项,如果提供的话,有以下含义。
-d
显示每个pattern的简短描述。
-m
以类似手册的格式显示每个pattern的描述。
-s
只显示每个pattern的简短使用概要。
除非没有命令与pattern相匹配,否则返回状态为零。
let
let expression [expression …]
let
内置程序允许对shell变量进行算术。每个表达式都是根据下面6.5 shell算术中给出的规则来计算的。如果最后一个表达式的值为0,let
返回1;否则返回0。local
local [option] name[=value] …
对于每个参数,都会创建一个名为 name 的局部变量,并分配了value。option 可以是
declare
接受的任何选项。local
只能在函数内使用;它使变量name 的可见范围仅限于该函数及其子函数。如果 name 是‘-’,则 shell 选项集对于调用local
的函数是局部的:在函数返回时,使用函数内部的set
内置命令更改的 shell 选项将恢复为原始值。恢复的效果就像执行了一系列设置命令以恢复函数之前的值。返回状态为零,除非local
在函数外部使用,提供的名称无效,或者名称是只读变量。logout
logout [n]
退出一个登录的shell,将n的状态返回给shell的父级。
mapfile
mapfile [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]
从标准输入读行到索引数组变量array,或者从文件描述符fd(如果提供了-u选项)。 变量
MAPFILE
是默认的array。 选项,如果提供的话,有以下含义。-d
delim的第一个字符被用来终止每个输入行,而不是换行。 如果delim是空字符串,
mapfile
将在读到NUL字符时终止一个行。-n
最多复制count行。如果count为0,则复制所有行。
-O
从索引origin开始向array赋值。 默认的索引是0。
-s
丢弃所读到的第一个count行。
-t
从读取的每一行中移除尾部的delim(默认为换行)。
-u
从文件描述符fd而不是标准输入中读取行数。
-C
在每次读取quantum行时,评估callback。 -c选项指定了quantum。
-c
指定每次调用callback之间所读的行数。
如果指定了-C而没有-c,默认的量子是5000。 当callback被评估时,它被提供下一个要分配的数组元素的索引和要分配给该元素的行作为附加参数。 callback是在行被读取后但在数组元素被分配前被评估。
如果没有提供明确的原点,
mapfile
将在赋值给它之前清除array。除非提供了无效的选项或选项参数,array无效或不可指定,或者array不是一个索引数组,否则
mapfile
成功返回。printf
printf [-v var] format [arguments]
在format的控制下,将格式化的arguments写入标准输出,-v选项使输出被分配到变量var中,而不是被打印到标准输出。
format是一个字符串,它包含三种类型的对象:简单复制到标准输出的普通字符,转换并复制到标准输出的字符转义序列,以及格式规范,每一种都会导致打印下一个连续的参数。 除了标准的
printf(1)
格式外,printf
还能解释以下扩展。%b
导致
printf
在相应的 argument 中以与echo -e
相同的方式扩展反斜杠转义序列(见4.2 Bash的内置命令)。%q
导致
printf
输出相应的argument,其格式可以作为shell的输入而被重复使用。%Q
像
%q
一样,但在引用之前将任何提供的精确性应用于argument。%(datefmt)T
导致
printf
输出使用datefmt作为strftime
(3)的格式字符串所产生的日期时间字符串。 相应的argument是一个整数,代表自纪元以来的秒数。 两个特殊的参数值可以被使用。-如果没有指定参数,转换的行为就像给了-1一样。 这是通常printf
行为的一个例外。
%b、%q和%T指令都使用格式规范中的字段宽度和精度参数,并从扩展的参数中写入那么多字节(或使用那么宽的字段),而扩展的参数通常比原始的参数包含更多的字符。
非字符串格式指定器的参数被视为C语言常量,除了允许前面的加号或减号,如果前面的字符是一个单引号或双引号,其值是下面字符的ASCII值。
如果format在必要时被重复使用,以消耗所有的arguments。 如果format需要的arguments比提供的多,额外的格式规范的行为就像提供了一个零值或空字符串,视情况而定。成功时返回值为零,失败时为非零。
read
read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name …]
从标准输入或作为-u选项参数提供的文件描述符fd中读出一行,按照上面7 分词中的描述分词,第一个词分配给第一个名字,第二个词分配给第二个名字,以此类推。 如果词比名字多,剩下的词和它们中间的分隔符分配给最后的名字。如果从输入流中读到的字比名字少,剩下的名字就被分配为空值。
IFS
变量值中的字符被用来将行分割成字,使用与shell用于扩展的规则(在上面的7 分词中描述)。 反斜线字符‘\’可以用来删除任何对下一个读到的字符和行延续的特殊含义。选项,如果提供的话,有以下含义。
-a aname
这些词被分配到数组变量aname的顺序索引中,从0开始。 在分配之前,所有的元素都从aname中移除。 其他的name参数被忽略。
-d delim
delim的第一个字符用于终止输入行,而不是换行。 如果delim是空字符串,
read
将在读到一个NUL字符时终止一行。-e
Readline(见8 命令行的编辑)被用来获取行。 Readline使用当前(或默认,如果行编辑之前没有激活)的编辑设置,但使用Readline默认的文件名完成度。
-i text
如果使用Readline来读行,text会在编辑开始前被放入编辑缓冲区。
-n nchars
read
在读取nchars个字符后返回,而不是等待完整的输入行,但如果在定界符之前读取的字符少于nchars,则会尊重定界符。-N nchars
除非遇到EOF或
read
超时,否则read
会在读完nchars个字符后返回,输入中遇到的分隔符不会被特别处理,在读完nchars个字符前不会导致read
返回。 结果不会根据IFS
中的字符进行分割;其目的是变量被准确地分配到所读的字符(反斜杠除外;见下面的-r选项)。-p prompt
在试图读取任何输入之前,显示prompt,没有尾部的换行。 只有当输入来自终端时,才会显示提示。
-r
如果给出这个选项,反斜线不作为转义字符。 反斜线被认为是行的一部分。 特别是,反斜线-新行对不能被用作行的延续。
-s
静音模式。如果输入来自终端,则不会回显字符。
-t timeout
如果在timeout秒内没有读到完整的输入行(或指定的字符数),则导致
read
超时并返回失败。timeout可以是一个小数,小数点后有一个小数部分。 这个选项只在read
从终端、管道或其他特殊文件读取输入时有效;从普通文件读取时没有效果。如果read
超时,read
会将读到的部分输入保存到指定的变量name中。 如果timeout为0,read
会立即返回,不尝试读取任何数据。 如果指定的文件描述符上有输入,退出状态为0,否则读取将返回EOF,否则退出状态为非零。 如果超过了超时,退出状态大于128。-u fd
从文件描述符fd中读取输入信息。
如果没有提供name,所读的行将被分配到变量
REPLY
,没有结尾的分隔符,但其他方面没有修改。 退出状态为0,除非遇到文件结束,read
超时(在这种情况下,状态大于128),发生变量分配错误(如分配到只读变量),或提供了无效的文件描述符作为-u的参数。readarray
readarray [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]
从标准输入读行到索引数组变量array,如果提供了-u选项,则从文件描述符fd读行。
是
mapfile
的同义词。source
source filename
.
的同义词(见4.1 Bourne Shell内置程序)。type
type [-afptP] [name …]
对于每一个name,指出它如果被用作命令名会被如何解释。
如果使用了-t选项,
type
将打印一个单字,该单字是‘alias’、‘function’、‘builtin’、‘file’或‘keyword’,如果name分别是别名、shell函数、shell内置文件、磁盘文件或shell保留字。如果没有找到name,那么就不打印任何东西,而type
返回失败状态。如果使用了-p选项,
type
要么返回将被执行的磁盘文件的名称,如果-t不会返回‘file’,则什么也不返回。-P选项强制对每个name进行路径搜索,即使-t不会返回‘file’。
如果一个命令是散列的,-p和-P打印散列值,这不一定是
$PATH
中首先出现的那个文件。如果使用了-a选项,
type
会返回所有包含名为file的可执行文件的地方。 这包括别名和函数,如果且仅当-p选项没有被使用的话。如果使用了-f选项,
type
就不会像command
内建程序那样,试图寻找shell函数。如果所有的name都被找到,则返回状态为0,如果没有找到,则为非0。
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")。
-f
shell和它的子代所写的文件的最大尺寸。
-i
挂起的信号的最大数量。
-k
可能被分配的最大kqueues数量。
-l
可能被锁定在内存中的最大尺寸。
-m
最大的驻留集大小(许多系统不遵守这个限制)。
-n
打开的文件描述符的最大数量(大多数系统不允许设置这个值)。
-p
管道缓冲区的大小。
-q
在POSIX消息队列中的最大字节数。
-r
最大的实时调度优先级。
-s
最大的堆栈大小。
-t
cpu时间的最大值,以秒为单位。
-u
单个用户可使用的最大进程数。
-v
shell可用的最大虚拟内存量,在某些系统上,它的子系统也可用。
-x
文件锁的最大数量。
-P
伪基站的最大数量。
-R
一个实时进程在阻塞前可以运行的最大时间,以微秒为单位。
-T
线程的最大数量。
如果给出了limit,并且没有使用-a选项,那么limit就是指定资源的新值。 特殊的limit值
hard
、soft
和unlimited
分别代表当前的硬限制、当前的软限制和无限制。 硬限制一旦被设定,非root用户就不能增加;软限制可以增加到硬限制的值。否则,除非提供-H选项,否则指定资源的软限制的当前值将被打印出来。 当指定一个以上的资源时,限制名称和单位(如果合适)将被打印在值之前。 当设置新的限制时,如果既没有提供-H也没有提供-S,则硬限制和软限制都被设置。 如果没有给出选项,则假设-f。除了-t,以秒为单位;-R,以微秒为单位;-p,以512字节的块为单位,其他数值均以1024字节为单位。-P、-T、-b、-k、-n和-u,这些都是未缩放的值;当处于POSIX模式时(见6.11 Bash的POSIX模式),-c和-f,是以512字节为增量的。除非提供了一个无效的选项或参数,或者在设置新的限制时发生错误,否则返回状态为0。
unalias
unalias [-a] [name … ]
从别名列表中删除每个名。如果提供了-a,所有的别名都会被删除。 别名在6.6 别名中描述。