4.1 Bourne Shell内置程序
下面的shell内置命令是从Bourne Shell继承来的。 这些命令是按照POSIX标准的规定来实现的。
: (a colon)
: [arguments]
除了扩展arguments和执行重定向外,什么都不做。 返回状态为零。
. (a period)
. filename [arguments]
读取并执行当前shell上下文中filename参数的命令。如果filename不包含斜线,则使用
PATH
变量来查找filename,但filename不需要是可执行的。 当Bash不是在POSIX模式下,如果filename在$PATH
中没有找到,则会搜索当前目录。 如果提供了任何arguments,当filename被执行时它们会成为位置参数。如果-T选项被激活,.
将继承DEBUG
上的任何陷阱;如果没有,任何DEBUG
陷阱字符串将被保存并在调用.
时恢复,并且.
在执行时取消设置DEBUG
的陷阱。如果-T没有被设置,而源文件改变了DEBUG
陷阱,新的值在.
完成时被保留。 返回状态是最后执行的命令的退出状态,如果没有命令被执行,则为0。如果filename没有被找到,或者不能被读取,则返回状态为非零。 这个内置程序等同于source
。break
break [n]
从
for
、while
、until
或select
的循环中退出。 如果提供了n,则退出n的包围循环。n必须大于或等于1。 n必须大于或等于1。cd
cd [-L|[-P [-e]] [-@] [directory]
将当前工作目录改为directory。 如果没有提供directory,则使用
HOME
shell变量的值。如果shell变量CDPATH
存在,它将被用作搜索路径:CDPATH
中的每个目录名都会被搜索到directory,CDPATH
中的备选目录名用冒号隔开(‘:’)。 如果directory以斜线开头,CDPATH
将不被使用。-P选项意味着不遵循符号链接:符号链接在
cd
遍历directory时和处理directory中的‘..’实例之前被解析。默认情况下,或者当-L选项被提供时,directory中的符号链接会在
cd
处理directory中的‘..’实例后被解析。如果‘..’出现在directory中,则通过删除紧接在前的路径名部分,回到斜线或directory的开头来处理它。
如果-e选项与-P一起提供,并且在成功改变目录后不能成功确定当前工作目录,
cd
将返回一个不成功的状态。在支持它的系统上,-@选项将与文件相关的扩展属性呈现为一个目录。
如果directory是‘-’,那么在尝试改变目录之前,它将被转换为
$OLDPWD
。如果使用了来自
CDPATH
的非空目录名,或者如果‘-’是第一个参数,并且目录更改成功,新工作目录的绝对路径名将被写入标准输出端。如果目录变更成功,
cd
将PWD
环境变量的值设置为新的目录名称,并将OLDPWD
环境变量设置为变更前的当前工作目录的值。如果目录被成功改变,则返回状态为零,否则为非零。
continue
continue [n]
恢复一个封闭的
for
、while
、until
或select
循环的下一次迭代。 如果提供了n,则恢复第n个封闭循环的执行。n必须大于或等于1。除非n不大于或等于1,否则返回状态为0。eval
eval [arguments]
参数被串联成一条命令,然后被读取和执行,其退出状态被返回为
eval
的退出状态。 如果没有参数或只有空参数,则返回状态为0。exec
exec [-cl] [-a name] [command [arguments]]
如果提供了command,它将取代shell而不创建一个新的进程。 如果提供了-l选项,shell将在传递给command的第0个参数的开头放置一个破折号。 这就是
login
程序的作用。-c选项使command在一个空的环境中被执行。 如果-a被提供,shell将name作为第0个参数传递给command。 如果由于某种原因无法执行command,由于某种原因不能被执行,除非启用了execfail
shell选项,否则将退出非交互式 shell。如果文件不能执行,交互式的shell会返回失败。 如果exec
失败,子shell会无条件地退出。 如果没有指定command,可以使用重定向来影响当前的shell环境。如果没有重定向错误,返回状态为零;否则返回状态为非零。exit
exit [n]
退出shell,将n的状态返回给shell的父级。 如果n被省略,退出状态是最后执行的命令的状态。 在shell终止之前,任何关于
EXIT
的陷阱都会被执行。export
export [-fn] [-p] [name[=value]]
标记每一个name来传递给环境中的子进程。如果提供了-f选项,name指的是shell函数;否则这些名字指的是shell变量。 -n选项意味着不再标记每个name的输出。如果没有提供name,或者给出了-p选项,就会显示所有导出变量的名称列表。 -p选项显示输出的形式可以作为输入重复使用。 如果一个变量名称后面是=value,那么该变量的值就被设置为value。
返回状态为0,除非提供了一个无效的选项,其中一个名字不是有效的shell变量名,或者-f提供了一个不是shell函数的名字。
getopts
getopts optstring name [arg …]
getopts
被shell脚本用来解析位置参数。 optstring包含要识别的选项字符;如果一个字符后面是冒号,则该选项被期望有一个参数,应以空格与之分开。 冒号(‘:’)和问号(‘?’)不得作为选项字符。每次调用时,getopts
将下一个选项放入shell变量name,如果不存在则初始化name,并将下一个要处理的参数的索引放入变量OPTIND
。每次调用shell或shell脚本时,OPTIND
被初始化为1。当一个选项需要一个参数时,getopts
将该参数放入变量OPTARG
中。 shell不会自动重置OPTIND
;如果要使用一组新的参数,必须在同一个shell调用中多次调用getopts
时手动重置。当遇到选项结束时,
getopts
以大于0的返回值退出。OPTIND
被设置为第一个非选项参数的索引,而name被设置为‘?’。getopts
通常会解析位置参数,但是如果有更多的参数以arg值的形式提供,getopts
就会解析这些参数。getopts
可以用两种方式报告错误。如果optstring的第一个字符是冒号,就会使用silent错误报告。在正常操作中,当遇到无效的选项或缺失的选项参数时,会打印出诊断信息。 如果变量OPTERR
被设置为0,即使optstring
的第一个字符不是冒号,也不会显示错误信息。如果看到一个无效的选项,
getopts
将‘?’放入name中,如果不是沉默,则打印出错误信息并取消OPTARG
。 如果getopts
是沉默的,找到的选项字符将放入OPTARG
中,并且不打印诊断信息。如果没有找到所需的参数,并且
getopts
不是沉默的,则在name中放置一个问号(‘?’),OPTARG
不设置,并打印一条诊断信息。 如果getopts
是沉默的,则在name中放置一个冒号(‘:’),并且OPTARG
被设置为找到的选项字符。hash
hash [-r] [-p filename] [-dt] [name]
每次调用
hash
,它都会记住指定为name参数的命令的完整路径名,因此在以后的调用中不需要再搜索它们。 这些命令是通过搜索$PATH
中列出的目录找到的。 任何以前记住的路径名都会被丢弃。-p选项抑制了路径搜索,filename被用作name的位置。 -r选项使shell忘记所有记住的位置。 -d选项使shell忘记每个name的记住的位置。 如果-t选项被提供,每个name所对应的完整路径名被打印。如果多个name参数与-t一起提供,则name会在散列的全路径名之前被打印出来,-l选项使输出以一种可以重复使用的格式显示。 如果没有给出参数,或者只提供了-l,则会打印有关记忆的命令信息。 除非没有找到name或者提供了无效的选项,否则返回状态为0。pwd
pwd [-LP]
打印当前工作目录的绝对路径名。 如果提供了-P选项,打印的路径名将不包含符号链接。 如果提供了-L选项,打印的路径名可能包含符号链接。 除非在确定当前目录名称时遇到错误或提供了无效的选项,否则返回状态为零。
readonly
readonly [-aAf] [-p] [name[=value]] …
将每个name标记为只读,这些名字的值不能通过后续的赋值改变。 如果提供了-f选项,每个name指的是一个shell函数。-a选项意味着每个name指的是一个索引数组变量;-A选项意味着每个name指的是一个关联数组变量。 如果两个选项都提供了,-A优先。 如果没有给出name参数,或者提供了-p选项,所有只读名称的列表将被打印。其他选项可以用来将输出限制在只读名字的子集上。 -p选项使输出以一种可以作为输入重复使用的格式显示。 如果一个变量名后面是=value,那么该变量的值将被设置为value。除非提供了一个无效的选项,name参数之一不是有效的shell变量或函数名,或者-f选项提供了一个不是shell函数的名称,否则返回状态为0。
return
return [n]
使一个shell函数停止执行,并向调用者返回n的值。 如果没有提供n,返回值是函数中最后执行的命令的退出状态。 如果
return
是由一个陷阱处理程序执行的,用于确定状态的最后一条命令是陷阱处理程序之前执行的最后一条命令。 如果return
是在DEBUG
陷阱中执行的,用于确定状态的最后一条命令是陷阱处理程序在return
被调用之前执行的最后一条命令。return
也可以用来终止正在用.
(source
)内置程序执行的脚本的执行,返回n或在脚本中执行的最后一条命令的退出状态作为脚本的退出状态。 如果提供了n,返回值是其最不重要的8位。任何与RETURN
陷阱相关的命令都会在函数或脚本之后恢复执行之前被执行。 如果return
提供了一个非数字参数,或者在函数之外使用,而不是在脚本执行过程中被.
或source
使用,则返回状态为非零。shift
shift [n]
将位置参数向左移动n。 从n+1 …
$#
的位置参数被重新命名为$1
…$#
-n。 由数字$#
到$#
-n+1代表的参数不被设置。 n必须是一个小于或等于$#
的非负数。如果n为零或大于$#
,则位置参数不改变。 如果n没有提供,则假定为1。返回状态为零,除非n大于$#
或小于零,否则为非零。test
[
-
test expr
评估一个条件表达式expr,并返回0(真)或1(假)的状态。 每个操作符和操作数必须是一个单独的参数。 表达式由下面6.4 Bash的条件表达式中描述的主语组成。
test
不接受任何选项,也不接受和忽略--的参数,因为它标志着选项的结束。当使用
[
形式时,命令的最后一个参数必须是一个]
。表达式可以使用以下运算符进行组合,按优先级递减排列。 评估取决于参数的数量;见下文。 当有五个或更多的参数时,运算符的优先级被使用。
! expr
如果expr是假的,则为 "真"。
( expr )
返回expr的值。 这可以用来覆盖运算符的正常优先级。
expr1 -a expr2
如果expr1和expr2都为真,则为真。
expr1 -o expr2
如果expr1或expr2为真,则为真。
test
和[
内置程序使用一套基于参数数量的规则来评估条件表达式。- 0 arguments
该表达式是假的。
- 1 argument
当且仅当参数不为空时,该表达式为真。
- 2 arguments
如果第一个参数是‘!’,当且仅当第二个参数为空时,该表达式为真。 如果第一个参数是单数条件运算符之一(参见6.4 Bash的条件表达式),如果单数测试为真,该表达式为真。 如果第一个参数不是一个有效的单数运算符,该表达式为假。
- 3 arguments
以下条件按照所列顺序适用。
- 如果第二个参数是二进制条件运算符之一(见6.4 Bash的条件表达式),那么表达式的结果就是用第一个和第三个参数作为操作数的二进制测试结果。 当有三个参数时,‘-a’和‘-o’运算符被认为是二进制运算符。
- 如果第一个参数是‘!’,那么该值是使用第二和第三个参数进行的双参数测试的否定值。
- 如果第一个参数正好是‘(’,而第三个参数正好是‘)’,那么结果就是第二个参数的单参数测试。
- 否则,该表达式是假的。
- 4 arguments
以下条件按照所列顺序适用。
- 如果第一个参数是‘!’,那么结果就是由其余参数组成的三参数表达式的否定。
- 如果第一个参数正好是‘(’,而第四个参数正好是‘)’,那么结果就是第二个和第三个参数的双参数测试。
- 否则,表达式会被解析,并根据优先级使用上面列出的规则进行评估。
- 5 or more arguments
表达式被解析并根据优先级使用上面列出的规则进行评估。
当与
test
或‘[’一起使用时,‘<’和‘>’操作符使用ASCII排序进行按字母顺序排序。 times
times
打印出shell及其子系统所使用的用户和系统时间。 返回状态为0。
trap
trap [-lp] [arg] [sigspec …]
当shell收到信号sigspec时,arg中的命令将被读取并执行。如果arg不存在(并且有一个sigspec)或等于‘-’,每个指定的信号的处置被重置为 shell 启动时的值。如果arg是空字符串,那么每个sigspec所指定的信号将被shell和它所调用的命令所忽略。 如果arg不存在并且-p已经被提供,shell将显示与每个sigspec相关的陷阱命令。如果没有提供参数,或者只提供了-p,
trap
会以一种可以作为shell输入的形式打印与每个信号号码相关的命令列表。 -l选项使shell打印一个信号名称及其相应的号码列表。 每个sigspec都是一个信号名称或一个信号号码。 信号名称是不分大小写的,SIG
前缀是可选项。如果sigspec是
0
或EXIT
,arg在shell退出时被执行。 如果sigspec是DEBUG
,arg命令在每个简单命令、for
命令、case
命令、select
命令、每个算术for
命令和shell函数中第一个命令执行之前被执行。关于它对DEBUG
陷阱的影响,请参考shopt
内建程序的extdebug
选项的描述(见2 Shopt 内置程序)。 如果sigspec是RETURN
,那么每次当shell函数或用.
或source
内建程序执行的脚本执行完毕后,就会执行arg命令。如果sigspec是
ERR
,只要一个管道(可能由一个简单的命令组成)、一个列表或一个复合命令返回一个非零的退出状态,就会执行arg命令,但要符合以下条件。如果失败的命令是紧随until
或while
关键字之后的命令列表的一部分、if
或elif
保留字之后的测试的一部分、&&
或||
列表中执行的命令的一部分(最后的&&
或||
之后的命令除外)、管道中除最后一条之外的任何命令、或者命令的返回状态被!
反转,则不会执行ERR
陷阱。这些条件与errexit
(-e)选项所遵守的条件相同。在进入shell时被忽略的信号不能被捕获或重置。 在创建子shell或子shell环境时,没有被忽略的被捕获的信号会被重置为它们的原始值。
除非sigspec没有指定一个有效的信号,否则返回状态为0。
umask
umask [-p] [-S] [mode]
将shell进程的文件创建掩码设置为mode。如果mode以数字开头,则被解释为八进制数字;如果不是,则被解释为类似于
chmod
命令所接受的符号模式屏蔽。如果mode被省略,则打印该掩码的当前值。如果提供了-S选项而没有mode参数,掩码将以符号格式打印。 如果提供了-p选项,并且省略了mode,输出的形式可以作为输入重复使用。 如果成功改变了模式或者没有提供mode参数,返回状态为零,否则为非零。注意,当模式被解释为八进制数字时,掩码的每个数字都要从
7
中减去。因此,一个022
的掩码会导致755
的权限。unset
unset [-fnv] [name]
删除每个变量或函数name。 如果给了-v选项,每个name指的是一个shell变量,该变量被删除。 如果给了-f选项,name指的是shell函数,该函数定义被删除。 如果给了-n选项,并且name是一个具有
nameref
属性的变量,name将被取消设置而不是它引用的变量。如果提供了-f选项,则-n没有作用。 如果没有提供选项,则每个name指的是一个变量;如果没有这个名字的变量,则有这个名字的函数(如果有的话)会被取消设置。 只读变量和函数不能被取消设置。 一些shell变量如果被取消设置就会失去其特殊行为;这种行为会在各个变量的描述中指出。 除非name是只读变量或者不能被取消设置,则返回状态为0。