4.Shell内部命令
4.Shell内部命令
内部命令是由shell自身提供的。如果某个内部命令的名称是一个简单命令的第一个单词,shell会直接执行这个命令,而不会启动其它程序。
对于一些不可能或者不方便通过外部程序实现的功能,内部命令是非常必要的。
本章简要介绍了Bash从波恩shell继承的内部命令,以及Bash扩展过的独特内部命令。
还有几个内部命令在其它章节中介绍:Bash对作业控制功能提供的界面,目录栈 ,history 命令 ,以及可编程补全功能。
很多内部命令在POSIX或者Bash中都得到了扩展。
下面介绍的内部命令,除非特别说明,如果说它接受"-"开头的选项,则“--”就表示选项的结束。
例如, 内部命令 :、true、false 和 test 不接受选项
4.1 波恩Shell的内部命令
下面的内部命令是从波恩shell继承来的;它们是根据POSIX规范现实的。
4.1.1 :逗号
语法: : [参数]
功能:除了扩展参数和执行重定向外不做任何操作。
返回值:返回状态是零。
4.1.2 .点号
语法:. 文件名 [参数]
功能:在当前的 shell环境中,从文件名中读取并执行命令。该命令和 source 是等价的。
如果文件名不包括斜杠,则使用PATH变量去搜索文件。
如果Bash不是在POSIX模式下运行,则在 $PATH 中找不到后就会在当前目录中搜索。
如果提供了参数,它们就成为执行文件名时的位置参数;否则,位置参数不会被改变。
返回值:返回状态是最后一个被执行命令的退出状态;如果没有命令被执行,则返回零。
如果文件名没有找到,或者不能读取,返回状态就是非零值。
4.1.3 break
语法:break [n]
功能:从 for,while,until 或 select 循环中退出。
如果给定n,则退出外围的第n层循环。n必须大于或等于1。
返回值:返回状态是零,除非n不是大于或等于1。
4.1.4 cd
语法:cd [-L|-P] [目录]
功能:把当前工作目录改为指定目录;如果目录没有指定,则使用shell变量$HOME的值。
如果shell变量CDPATH存在,则用它作为搜索路径。如果目录以斜杠彠头就不再使用CDPATH。
“-P”选项助记词: Physical, 物理路径的意思是不跟踪符号链接;而默认情况下,或使用了“-L”助记词: symLink, 符号链接会跟踪符号链接。
如果目录是“-”, 就相当于$OLDPWD。
如果使用CDPATH中一个非空的目录,或者“-”上第一个参数,并且改变目录成功,则在标准输出中打印新的工作目录的绝对路径。
返回值:如果改变目录成功,返回状态就是零;否则就是非零。
例子:改进 cd 实现目录导航
#!/bin/bash
# 改进 Bash 中的 cd 命令。
# 另请参见 dirs,popd 和 pushd 命令。
# 作者 Jerry Fleming <jerryfleming2006@gmail.com>,2009 年 8 月
cd()
{
if [[ $1 =~ ^([+-])([0-9]*)$ ]]
then
CDR=$( expr $CDR ${BASH_REMATCH[1]} ${BASH_REMATCH[2]:-1} )
[[ $CDR -lt 1 ]] && CDR=1
[[ $CDR -gt ${#CDP[@]} ]] && CDR=${#CDP[@]}
I=$(($CDR-1))
builtin cd ${CDP[$I]}
elif [[ $1 =~ ^[+][+]([0-9]*)$ ]]
then
CDR=${BASH_REMATCH[1]:-1}
[[ $CDR -lt 1 ]] && CDR=1
[[ $CDR -gt ${#CDP[@]} ]] && CDR=${#CDP[@]}
I=$(($CDR-1))
builtin cd ${CDP[$I]}
elif [[ $1 == -i ]]
then
unset CDP
CDP[0]=$PWD
CDR=1
elif [[ $1 == -l ]]
then
I=0
for item in ${CDP[@]}
do
I=$(($I+1))
echo -n [$I]
if [[ $I -eq $CDR ]]
then
echo -n '*'
else
echo -n ' '
fi
echo -n ' '
echo $item
done
else
builtin cd $@
CDP[$CDR]=$PWD
CDR=$(($CDR + 1))
fi
}
4.1.5 continue
语法:continue [n]
功能:继续执行外围的 for,while,until 或 select 的下一次循环。
如果指定n,则继续执行外围第n层的循环。n必须大于或等于1。
返回值:返回状态是零,除非n不是大于等于1。
4.1.6 eval
语法:eval [参数表]
功能:把参数表中的参数连在一起形成一个命令,然后读取并执行这个命令。
返回值:它的退出状态就是 eval 的退出状态。如果没有参数表,或者参数表为空,则退出状态为零。
4.1.7 exec
语法:exec [-cl] [-a 名称] [命令 [参数表]]
功能:如果指定了命令,它就会取代 (当前的)shell而不是创建新的进程。
如果给定了"-l"选项助记词: Login, 登录,shell就会在传给命令的第零个参数前加上一个短横。这就是登录程序所做的。
如果指定"-c"选项助记词: Clear, 清除,使得命令在空的环境中执行。
如果指定"-a"助记词: Alter, 改变,shell会把名称作为第零个参数传给命令。
如果没有指定命令,可以用重定向来影响当前的 shell环境。
如果没有重定向错误,返回状态就是零,否则就是非零。
4.1.8 exit
语法:exit [n]
功能:退出 shell,并在 shell的父进程中返回状态n。如果省略了n,则退出状态是最后被执行的命令的退出状态。
EXIT陷阱是在shell结束前执行的。
4.1.9 export
语法:export [-fn] [-p] [名称[=值]]
功能:把每个名称都传到子进程的环境中。
如果给定了"-f"选项助记词: Function, 函数,则名称就是shell函数;否则,它是 shell变量。
"-n"选项助记词: No, 不,表示不再把名称导出到子进程。
如果没有给定名称,或者给定 了"-p"选项助记词: Pretty-Print, 格式化打印,则显示已经导出的名称列表。"-p"选项能够把输出格式化成可以重新作为输入的形式。
如果名称后面是"=值"的形式,那么这个值就会赋给名称。
返回值:这个命令的返回状态是零,除非指定了无效的选项,或者其中一个名称不是有效的shell变量名,或者"-f"指定的不是一个 shell函数的名称。
4.1.10 getopts
语法:getopts 选项字符串 名称 [参数表]
功能:Shell脚本用 getopts 来分析位置参数。
选项字符串包含待识别的选项字符;如果一个字符后面有个冒号, 这个选项就要接受一个参数,这个参数和选项之间用空格分开。
选项字符不可以是冒号 (":")或问号 ("?")。
每次使用时,getopts 都会把下一个选项放在 shell变量名称中 (如果名称不存在就初始化它),并把下一个要处理的参数的下标放在变量 OPTIND 中。
每次启动当前的shell或shell脚本时,都把OPTIND初始化为1。
如果某个选项需要参数,getopts 就把该参数放在变量OPTARG中。
Shell不会自动把OPTIND重置;如果在同一个shell中多次调用getopts时要使用新的参数,则必须手动重置它。
处理完选项结尾时,getopts会退出并返回一个大于零的状态;OPTIND会指向第一个非选项参数的下 标;而名称被设为"?"。
getopts参演会分析位置参数,但如果参数表中的参数更多,getopts 就会转而分析参数表。
getopts可以通过两种方式报错。如果选项字符串的第一个字符是冒号,则忽略报错。
正常情况下,如果遇到无效选项,或者忽略了选项的参数,就会打印诊断信息。
如果把变量OPTERR设为 0,则不会打印错误信息,即使选项字符串的第一个字符不是冒号。
如果遇到了无效的选项,getopts就会在名称里面放入"?"。
这时如果不忽略报错,就打印一条错误信息并重置OPTARG;如果忽略报错,就把该选项放在OPTARG中而不打印错误信息。
如果某个必要参数没有找到,并且getopts没有忽略报错,则在名称中放入问号 ("?") 并重置OPTARG且打印错误信息。
如果getopts忽略错误,则在名称中放入冒号 (":"),并把OPTARG设为找到的选项字符。
4.1.11 hash
语法:hash [-r] [-p 文件名] [-dtl] [名称]
功能:记住参数名称所指定的命令的完整路径,使得以后再启动这个命令时不需要再搜索它。
命令是通过搜索$PATH中列出的目录而找到的。
"-p"选项助记词: Path, 指定路径,可以禁止路径搜索,并用文件名指定命令的位置。
"-r"选项助记词: Redo, 重做,使得shell忘记所有已经记住的位置。
"-d"选项助记词: Destination, 目标,使得 shell忘记它已经记住的名称的每个位置。
"-t"选项助记词: prinT, 打印,则打印每个名称对应的完整路径;如果"-t"指定了多个名称参数,则打印完整路径时还在前面打印记住的命令名称。
"-l"选项助记词: List,列出,把输出格式化成可以重新作为输入的形式。如果没有给定参数,或者只给定了"-l",则打印与每个所记住命令的有关信息。
返回值:返回状态是零,除非没有找到名称,或者遇到了无效的选项。
4.1.12 pwd
语法:pwd [-LP]
功能:打印出当前工作目录的绝对路径。
如果给定了"-P"选项助记词: Physical, 物理路径,则打印的路径中不会包含符号链接。
如果给定了"-L"选项助记词: symLink, 符号链接,则打印的路径中可能包含符号链接。
返回值:返回状态是零,除非在计算当前工作目录时遇到了错误,或者指定了无效的选项。
4.1.13 readonly
语法:readonly [-aApf] [名称[=值]] ...
功能:把每个名称标志为只读,后续语句就不可以更改这些名称的值。
"-f"选项助记词: Function, 函数,则每个名称都是指shell函数。
"-a"选项助记词: Array, 数组,则每个名称都是下标数组变量;
"-A"选项助记词:AArray, 名称数组,则每个名称都是键值数组变量。
如果没有给定参数名称,或者给定了"-p"选项助记词:Print, 打印,则打印所有只读的名称。
"-p"选项能够把输出格式化成可以重新作为输入的形式。
如果变量名称后面是"=值"的形式,变量名称的值就会被设为指定的值。
返回值:返回状态是零,除非遇到了无效的选项,某个参数名称是无效的shell变量或函数名,或者"-f"选项指定了一个不是 shell函数的名称。
4.1.14 return
语法:return [n]
功能:使得 shell函数退出并返回状态n。如果没有指定n,则返回状态是函数中最后一个被执行的命令的退出状态。
这个命令也可以用来结束执行一个用内部命令 . 或 source 执行的脚本,并把n或者这个脚本中最后一个被执行的命令的退出状态作为脚本的退出状态。
如果关联了RETURN陷阱,它就会参函数或脚本退出以后执行。
如果在函数以外,或者在不是用 . 或 source 执行的脚本中使用,它的退出状态就是非零。
4.1.15 shift
语法:shift [n]
功能:把位置参数向左移动n个位置,位置参数n+1...$# 被重命名为 $1...$#-n,而从 $#到$#-n+1 的位置参数被重置了。
n 必须是个小于或等于$#的非负数。如果n是零,或者比$#大,则不会改变位置参数。如果没有指定n,则默认为1。
返回值:返回状态是零;除非n比$#大或者小于零,这时返回非零。
4.1.16 test和[
功能:计算表达式的值。运算符和运算数都是独立的参数。
表达式是由原子表达式组成的。
test不接受任何选项,也不能用参数"--"来表示选项的结束。
如果使用 [ 的形式,则这个命令的构后一个参数必须是 ]。
可以用下面的运算符把表达式连起来,这些运算符是按照优先级的降序排列的。
求值结果依赖于参数的个数,如下所示:
! 表达式 如果表达式为假,则真。
( 表达式 ) 返回表达式的值。这可以用来改变运算符的正常优先级。
表达式一 -a 表达式二 如果表达式一和表达式二都为真,则返回真。
表达式一 -o 表达式二 如果表达式一或者表达式二有一个为真,则返回真。
内部命令 test 和 [ 按照基于参数个数的规则,对表达式进行求值。
0个参数 (没有参数) 表达式是假的。
1个参数 当且仅当这个参数非空时,表达式的值为真
2个参数 如果第一个参数是"!",则当且仅当第二个参数为空时表达式的值才为真。
如果第一个参数是一个单目条件运算符,则如果单目测试为真,表达式就为真。如果第一个参数不是个有效的单目运算符,则表达式为假。
3 个参数 如果第二个参数是双目运算符,则表达式的值是把第一和第三个参数作为运算数的双目测试的结果。
如果有三个参数,则"-a"和"-o"就是双目运算符。如果第一个参数是"!",则结果是把第二和第三个参数作为运算数的双目测试的结果。
如果第一个参数 是"("且第三个参数是")",则结果是第二个参数的单目运算的结果。否则,表达式是假的。
4个参数 如果第一个参数是"!",则结果就和其余三个参数构成的表达式的值相反。否则根据上面列出 的优先级和规则分析和计算表达式的值。
5个参数 根据上面列出的优先级和规则分析和计算表达式的值
4.1.17 times
语法:times
功能:打印出shell及其子进程所使用的用户时间和系统时间。
返回值:返回状态是零。
4.1.18 trap
语法:trap [-lp] [参数] [信号指示...]
功能:当shell接收到信号指示中的信号时,就会读取和执行参数中指定的命令。
如果省略了参数 (这时只有一个信号指示) 或者参数是"-",则每个指定信号的处理都重置为shell启动时的值。
如果参数是空字符串,则shell及它所启动的命令会忽略每个信号指示指定的信号。
如果省略了参数并给定了"-p"选项助记词: Print, 打印,则 shell会显示每个信号指示所关联的trap命令。
如果没有给定参数或者只给定了"-p"选项,trap会把每个信号数字所关联的命令输出格式化成可以重新作为shell输入的形式。
"-l"选项助记词: List, 列出,会使shell打印信号名称和它们所对应数字的列表。
每个信号指示都是一个信号名称或者信号数字。信号名称对大小写不敏感,其前面的SIG可以省略。
如果信号指示是0或者EXIT,则当shell退出时就会执行参数。
如果参数是DEBUG,则每次执行简单命令、for命令、case命令、select命令、算术for命令的每个算术表达式,以及shell函数的第一个命令之前,都会执行命令参数。
关于内部命令shopt的extglob选项如何影响DEBUG陷阱的细节,请参见内部命令shopt。
如果信号指示是ERR,则当一个简单命令因为下列原因返回非零的值时就执行命令参数。
如果失败的命令是紧跟在关键词 until 或 while 后的命令队列的一部分,或者是在关键词if或elif后的测试命令的一部分,
或者是&&或||命令队列中所执行命令的一部分,或者该命令的返回状态经由 ! 反转,则不会执行ERR陷阱。errexit 选项也服从同样的条件。
如果信号指示是RETURN,则每当由内部命令 . 或 source 执行的shell函数或脚本执行结束时,都会执行命令参数。
进入shell时就被忽略的信号不可以再用于陷阱或者被重置。
当创建了子进程时,已经设了陷阱没有被忽略的信号将在子进程中被设为原来的值。
返回值:返回状态是零,除非信号指示指定的不是有效信号。
4.1.19 umask
语法:umask [-p] [-S] [模式]
功能:把shell进程的文件创建掩码设为模式。
如果模式以数字彗头,它就当八进制数解释;否则,它就被当作类似于 chmod 命令所接受的掩码模式符号。
如果忽略了模式,则打印当前的掩码值。
如果给定了"-S"选项助记词: Symbolic, 模式符号,却没有给定参数模式,则以符号形式打印掩码。
如果给定"-p"选项助记词: Pretty-Print, 格式化打印,并省略了模式,则把输出格式化成可以重新作为输入的形式。
如果模式更改成功或者没有给定模式,则返回零;否则返回非零。
注意,如果模式当八进制数解释,则掩码中的每个数都要用7去减。所以,掩码为022就会得到755的权限。
4.1.20 unset
语法:unset [-fv] [名称]
功能:删除各个指定的变量或函数名称。
如果没有指定选项,或者指定了"-v"选项助记词: Variable, 变量,则每个名称都是指shell变量。
如果指定了"-f"选项助记词: Function, 函数,则每个名称都是指shell函数,这些函数的定义将被删除。
只读变量和函数不可以删除。
返回值:返回状态是零,除非名称是只读的。
4.2 Bash的内部命令
本节介绍在Bash中独特或者经过扩展的内部命令。这些命令中有些在POSIX标准中已经作了规范。
4.2.1 alias
语法:alias [-p] [名称[=值] ...]
功能:如果没有参数或者给定了"-p"选项助记词: Print, 打印,alias 就会在屏幕上把别名列表以便于重新输入的形式打印出来。
如果给定参数,则对于每个给定的名称,都用对应的值作为别名;如果没有给出值,则打印名称指定的别名。
别名在6.6[别名]中介绍。
4.2.2 bind
语法:
bind [-m 键映射] [-lpsvPSV]
bind [-m 键映射] [-q 函数] [-u 函数] [-r 键序列]
bind [-m 键映射] -f 文件名
bind [-m 键映射] -x 键序列:shell命令
bind [-m 键映射] 键序列:函数名
bind Readline 命令
功能:显示当前Readline (参见 8[编辑命令行])中键和功能函数的绑定,或者把键序列绑定到Readline函数或宏,或者设置Readline变量。
每个非选项的参数都是可以用于Readline初始化文件 (参见奸 8.3[Readline的启动脚本]夬)中的命令,但是每个绑定和命令都必须单独作为参数。
如果给定了选项,就会有下面的含义:
-m 键映射 用键映射作为后续绑定所使用的键映射。
可用的键映射名称包括 emacs、emacs-standard、emacs-meta、emacs-ctlx、vi、vi-move、vi-command、和 vi-insert;
其中,vi 和 vi-command 是 等价的,emacs 和 emacs-startdard 也是等价的 。助记词: Map, 映射
-l 列出所有的 Readline函数名称。助记词: List, 列出
-p 以便于重新作为输入或者可以用于Readline初始化文件中的格式显示Readline函数名。助记词:Pretty-Print, 格式化输出
-P 列出当前的Readline函数名和绑定。助记词: PPrint, 打印
-v 以便于重新作为输入或者可以用于Readline初始化文件中的格式显示Readline变量名及其值。助记 词: Variable, 变量
-V 列出当前的Readline变量名和值。助记词: VVariable, 变量
-s 以便于重新作为输入或者可以用于Readline初始化文件中的格式显示Readline中绑定到宏的键序列及其输出的字符串。助记词: Sequence, 序列
-S 列出绑定到宏的键序列及其输出的字符串。助记词: SSequence, 序列
-f 文件名 从文件名中读取键绑定。助记词: File, 文件
-q 函数 查询绑定到指定函数的键。助记词: Query, 查询
-u 函数 取消所有对函数的绑定。助记词: Unbind, 取消绑定
-r 键序列 删除键序列的当前绑定。助记词: Remove, 删除
-x 键序列:shell 命令 使得每次输入键序列都执行shell命令。
当执行shell命令时,shell会把变量READLINE_LINE设为Readline中的行缓存,把变量 READLINE_POINT 设为当前标志点的位置。
如果执行的shell命令改变了READLINE_LINE或READLINE_POINT,则其新的值将在编辑状态中反映出来。助记词: eXecute, 执行。
返回值:返回状态是零,除非给定了无效的选项或者发生了错误
4.2.3 builtin
语法:builtin [shell 内部命令 [参数表]]
功能:运行一个shell内部命令,把参数表传给它,并返回它的還出状态。
这可以用来定义一个与shell内部命令同名的函数,并在函数内部保留这个内部命令的功能。
如果shell内部命令不是有效的shell内部命令,则返回状态是非零。
4.2.4 caller
语法:caller [表达式]
功能:返回当前活动的子程序 (即shell函数,或通过内部命令 . 或 source 执行的 shell脚本)调用。
如果没有表达式,caller 显示当前子程序调用的行号和源文件名。
如果用非负整数作为表达式,caller 就会显示行号、子程序名称、以及与当前调用堆栈位置相对应的源文件。
这些额外信息可以用来打印堆栈跟踪信息。当前的帧是第 0 帧。
返回值:返回值是 0,除非 shell并没有在执行子程序调用,或者表达式不对应调用堆栈中的有效位置。
4.2.5 command
语法:command [-pVv] 命令 [参数表 . . .]
功能:把参数传给命令并执行这个命令,而忽略与之同名的shell函数。只执行shell内部命令或者通过搜索PATH而找到的命令。
如果有一个shell函数叫ls,则在该函数中执行"command ls"会运行外部命令ls而不是递归调用该函数。
"-p"选项助记词: Path, 默认路径,含义是使用默认的PATH以确保能够找到所有的标准命令。
这时,如果没有找到命令或者发生错误,返回状态就是 127,否则就返回命令的返回状态。
如果指定"-V"选项或者"-v",则打印关于命令的描述。
"-v"选项助记词: Verbose, 详细显示启动该命令的命令或文件名,它是一个单词;而"-V"选项助记词: VVerbose, 更详细,输入更详细。
这时,如果找到命令则返回 零,否则返回非零。
4.2.6 declare
语法:declare [-aAfFilrtux] [-p] [名称[=值] . . .]
功能:声明变量并设置其属性。如果没有给定名称,则显示变量的值。
"-p"选项助记词: Print, 打印,会显示每个名称的属性和值。
如果使用了"-p"和参数名称,则忽略其余参数。
如果给定"-p"却没有给定参数名称,则显示所有通过其它选项选定了属性的变量的属性和值。
如果给定"-p"而没有给定其它选项,declare将会显示所有shell变量的属性和值。
"-f"选项助记词: Function, 函数,限制输出只显示shell函数。
"-F"选项助记词: no-Function-def, 无定义,禁止显示函数的定义,只显示函数的名称和属性。
如果用 shopt打开了shell的extdebug 选项,则还会显示函数定义所在的源文件名和行号。"-F"选项隐含了"-f"。
下列选项限制含有指定属性的变量输出或者给变量设置属性:
-a 每个名称都是下标数组变量 。助记词: Array, 数组
-A 每个名称都是键值数组变量 。助记词: AArray, 键值数组
-f 只使用函数名称。助记词: Function, 函数
-i 把变量当成整数;对它赋值时会进行算最求值。助记词: Integer,整数
-l 对变量名称赋值,把大写字母转化为小写。清除 upper-case 属性。助记词: Lowercase, 小写
-r 把名称设为只读。以后不可以用赋值语句对这些名称赋值或者把它们重置。助记词: Readonly, 只读
-t 给每个名称都设置trace属性。设置了trace属性函数继承调用它的shell的DEBUG和RETURN陷 阱。trace属性对变量来说没有特殊意义。助记词: Trace, 跟踪
-u 对变量名称赋值,把小写字母转化为大写。清除 lower-case 属性。助记词: Uppercase, 大写
-x 通过环境把每个名称导出给后续命令。助记词: eXport, 导出
(在选项前) 使用"+"而不是"-"会关闭属性;例外的是,"+a"不会清除数组变量,"+r"也不会去掉只读 属性。
在函数中使用时,declare会让每个q名称都是局部可见的,就和 local 命令一样。
如果变量名称后 面有=值,这个值就会赋给名称。
返回值:返回状态是零,除了遇到无效的选项、或者试图用"-f foo=bar"的形式定义函数、或者试图给只读变量赋值、或者没有使用复合赋值的语法给数组变量赋值、
或者某个名称不是有效的shell变量名、或者试图去掉只读变量的只读属性,或者试图去掉数组变量的数组状态、或者试图用"-f"去 显示一个不存在的函数。
4.2.7 echo
语法:echo [-neE] [参数 . . .]
功能:输出每个参数,中间用空格分隔,结束时输出换行符。返回状态永远是 0。
如果给定了"-n"选项助记词: noNewline,不换行,则结束时不会输出换行符。
如果指定了"-e"选项助记词: Evaluate, 求值,则会解释下列用斜杠转义的字符;
而"-E"选项助记词: noEvaluate, 不求值会禁止解释它们,即使系统默认会去解释。
可以使用shell的 xpg_echo选项来动态决定echo是否解释这些转义字符。
echo 不会将"--"当成选项的结束。
echo 会解释下列转义序列 :
\a 警告 (响铃)
\b 退格删除
\c 禁止继续输出
\e 转义字符
\f 走纸换页
\n 新行
\r 换行
\t (水平)制表符
\v 垂直制表符
\n 反斜杠
\nn 由八进制数 nnn (一个到三个数字) 代表的一个八位字符。
\xHH 由十六进制数 HH (一个到两个数字) 代表的一个八位字符。
4.2.8 enable
语法:enable [-a] [-dnps] [-f 文件名 ] [名称 . . .]
功能:启用或禁止shell内部命令。
禁止了内部命令,就可以执行与之同名的外部命令而不必指定它的完整路径, 即使正常情况下shell会行搜索内部命令再搜索外部命令。
如果指定了"-n"助记词: Not-enabled, 禁止,则禁止名称的使用;否则就启用它们。
例如,要使用在$PATH中找到的test命令而不是shell内部的那个,就要输入"enable -n test"。
如果给定了"-p"选项助记词: Print, 打印,或者没有参数名称,则列出shell内部命令。如果没有其它参数,则列出所有已经启用的shell内部命令。
"-a"选项会在列出每个内部命令的时候显示它是否已经启用。
在支持动态加载的系统上,"-f"选项助记词: Filename, 文件名,会从共享库文件名中加载新的内部命令名称。
而"-d"选项助记词: Delete, 删除,会删除通过"-f"加载的选项。
如果没有选项,则列出 (一些)shell内部命令。
"-s"选项助记词: Special, 特殊的,限制enable只列出POSIX的特殊内部命令。
如果"-s"和"-f"丢起使用,则新的内部命令就成为特殊命令。
返回值:返回状态是零,除非名称不是shell内部命令,或者在从共享库中加载新的内部命令时发生错误。
4.2.9 help
语法:help [-dms] [模式]
功能:显示内部命令的帮助信息。
如果给定了模式,则help会显示所有与模式匹配的命令帮助,否则就列出内部命令。
如果给定了选项,就会有下列含义:
-d 对与模式匹配的每个命令,显示一条简短的描述。助记词: Description, 描述
-m 对与模式匹配的每个命令,显示像联机帮助 (manpage)那样的帮助信息。助记词: Manpage, 联机帮助
-s 对与模式匹配的每个命令,简短的显示使用概要。助记词: Synopsis, 使用概要
返回值:返回状态是零,除非没有命令与模式匹配。
4.2.10 let
语法:let 表达式 [表达式]
功能:内部命令let可以对shell变量进行算术运算。
每个表达式都根据[Shell的算术运算]求值。
返回值:如果最后一个表达式的值为0,则返回1;否则返回 0。
4.2.11 local
语法:local [选项] 名称[=值] . . .
功能:对于每个参数名称都创建一个局部变量并给它赋值。
选项可以是任何 declare 可以接受的选项。
local只能在函数里面使用,它使得变量名称只在函数或其子进程中可见。
返回值:返回状态是零,除非local在函数外部使用、或者指定了无效的名称、或者名称是只读变量
4.2.12 logout
语法:logout [n]
功能:退出当前的登录shell,向shell的父进程返回状态n。
4.2.13 mapfile
语法:mapfile [-n 行数] [-O 原下标] [-s 忽略行数] [-t] [-u 文件描述符] [-C 回调程序] [-c 数量] [数组]
功能:从标准输入读取文本行并存入数组变量数组中;如果给定了"-u"选项,则从文件描述符中读取。默认的数组是MAPFILE。
如果给定了选项,就会有下列含义:
-n 最多复制的行数。如果行数是0,则复制所有行。助记词: Number, 行数
-O 从原下标开始给数组赋值。默认的原下标是 0。助记词: Origin, 原下标
-s 从开始不要读取的忽略行数。助记词: diSgard, 忽略行数
-t 从每次读取的行中删除行结尾。助记词: Tail, 删除结尾
-u 从文件描述符而不是标准输入中读取文本行。助记词: soUrce, 来源
-C 每当读取的行达到数量时就执行回调函数一次。"-c"选项指定数量。助记词: Callback, 回调函数
-c 指定每次调用回调函数之间所要读取文本行的数量。助记词: Count, 行数
如果指定"-C"而没有"-c",则默认的数量是 5000。
每次调用回调函数时,都把数组中下一个元素的下标作为额外参数传给它。
回调函数的求值是在的文本行读取以后,数组元素赋值之前。
如果没有明确指定原下标,mapfile会给数组赋值之前把它清空。
返回值:mapfile会返回真,除非指定了无效的选项或参数,或者数组是无效的或没有赋值。
4.2.14 printf
语法:printf [-v 变量] 格式 [参数表]
功能:在标准输出中打印格式化后的参数表。
格式化是由格式来控制的,它是包含三种数据的字符串:普通字符 (它们会直接复制到标准输出中)、转义序列 (转化以后再复制到标准输出中)、以及格式指示 (每个字符都会按次序打印下一个参数)。
除了标准的 printf(1) 中的格式,还能识别的格式有:"%b"让 printf 解释对应参数中的转义序列 (除了"\c"结束输出、保留"\'"、"\""和"\?"中的斜杠、以及以"\0"开头的八进制转义序列中可以包含末多四个数字)。
"%q"把对应参数用一种能够重新作为shell输入的格式输出。
"-v"选项助记词: Variabe, 赋给变量,把输出赋给变量,而不是打印到标准输出中。
格式会被重复使用以处理所有参数。
如果格式要求比实际更多的参数,多余的格式就会恰当选用零值或空字符串作为参数,就好像它们实际指定了一样。
返回值:如果操作成功则返回值是零,失败时返回非零。
4.2.15 read
语法:read [-ers] [-a 数组名称] [-d 分隔符] [-i 文本] [-n 字符数] [-p 提示符] [-t 超时时间] [-u 文件描述符] [名称 . . .]
功能:从标准输入或者"-u"选项指定的文件描述符参数中读取一行文本,并把第一个单词赋值给第一个名称,
把第二个单词赋值给第二个名称,依此类推;剩余的单词连同分隔符一起赋值给最后一个名称。
如果从输入流中读取的单词数比名称少,就把空值赋值给剩余的名称。
IFS变量中的字符用来把文本行分隔成单词。 "\"字符可以用来去掉下一个字符的特殊含义,或者用来续行。
如果没有指定名称,就把读取到的变量赋值给REPLY变量。
返回状态是零,除非遇到文件结束标志、或者超时 (这时返回值大于 128)、或者"-u"选项 指定了无效的文件描述符。
如果给定了选项,就会有下列含义:
-a 数组名称 把文本赋值给数组变量,数组名称中从0开始的连续下标。赋值之前把数组名称中的所有元 素都删除。忽略其它参数名称。助记词: 数组
-d 分隔符 用分隔符的第一个字符来结束输入行,而不是用换行符。助记词: Delimiter, 分隔符
-e 用Readline来读取文本。Readline会使用当前的编辑设置;如果之前没有启用行编辑功能,则使用默认设置。助记词: Edit, 编辑
-i 文本 如果使用Readline来读取文本,则在开始编辑之前先把它放在编辑缓存中。助记词: Initial, 初始 文本
-n 字符数 读取达到字符数时就返回,而不是读入一整行时才返回。助记词: Number, 字符数
-p 提示符 在试图读取输入之前显示提示符,不换行。只有从终端读取输入时才会显示提示符。助记词:Prompt, 提示符
-r 如果指定该选项,则反斜杠就不是转义字符,而是文本的一部分。特别的,一对反斜杠和换行符不是续行符。助记词: Raw, 原始字符串
-s 安静模式。如果从终端读取输入,则不回显字符。助记词: Silent, 安静
-t 超时时间 如果在超时时间指定的秒数内还没有读入完整的一行,则读取超时并返回失败。超时时间可以是个带有小数的十进制数。
这个选项只有在 read 从终端,管道,或者其它特殊文件中读取输入时才有效;从普通文件中读取时没有作用。
如果超时时间是0,则当指定的文件描述符可用时返回成功,不可用则返回失败。
如果超时则返回状态大于 128。助记词: Timeout, 超时
-u 文件描述符 从文件描述符中读取输入。助记词: soUrce, 文本源
4.2.16 readarray
语法:readarray [-n 行数] [-O 原下标] [-s 忽略行数] [-t] [-u 文件描述符] [-C 回调程序] [-c 数量] [数组]
功能:从标准输入读取文本行并存入数组变量数组中;如果给定了"-u"选项,则从文件描述符中读取。 它和mapfile 是同义词。
4.2.17 source
语法:source 文件名
功能:. 的同义词
4.2.18 type
语法:type [-afptP] [名称 . . .]
功能:对于每个名称,如果把它用作命令名,指示如何解释。
如果使用了"-t"选项助记词: Type, 类型,并且名称分别是别名、shell函数、shell内部命令、磁盘文件、或者shell保留字,则分别打印alias、function、builtin、file、keyword。
如果没有找到名称,则不输出任何信息,这时type返回错误。
如果使用了"-p"选项助记词: Print, 打印,则type要么返回将要执行的磁盘文件名称,要么什么也不返回 (如果这时"-t"不是返回 file)。
"-P"选项助记词: Path, 路径,强制查找每个名称的路径,即使"-t"不会返回 file。
如果命令在散列表中,则"-p"和"-P"打印散列表中的值,而不一定是$PATH中第一个找到的文件。
如果使用了"-a"选项助记词: All, 所有,则 type 返回可执行文件的所有路径。
当且仅当没有同时使用"-p"选项时,这些路径中才会包括别名和函数。
如果使用了"-f"选项助记词: Function, 函数,则type不会试图去搜索shell函数,以及内部命令。
返回值:如果能找到所有的名称就返回零,否则返回非零。
4.2.19 typeset
语法:typeset [-afFrxi] [-p] [名称[=值] . . .]
功能:typeset 命令是为了与科恩 shell相兼容而设的。但是它已经被内部命令 declare 取代而不推荐使用。
4.2.20 ulimit
语法:ulimit [-abcdefilmnpqrstuvxHST] [限制数]
功能:如果系统支持,ulimit 能够控制由shell启动并提供给进程的资源。
如果给定选项,就按下面解释:
-S 更改并报告与资源相关联的软限制。助记词: Soft-limit, 软限制
-H 更改并报告与资源相关联的硬限制。助记词: Hard-limit, 硬限制
-a 报告当前的所有限制。助记词: All, 所有
-b 套接字缓存的最大长度。助记词: Buffer, 缓存
-c 可以创建的core文件的最大长度。助记词: Core, 内在映像
-d 进程数据段的最大长度。助记词: Data-segment, 数据段
-e 最大的调度优先级 ("nice")。助记词: nicE, 优先级调度
-f Shell及其子进程写文件时的最大长度。助记词: File, 文件
-i 最多可以延迟的信号。助记词: sIgnal, 信号
-l 可以锁定在内存中的最大长度。助记词: Lock, 锁定
-m 常驻内存集合的最大大小 (许多系统并没有实现这个限制)。助记词: Memory, 内存
-n 最多可以打当的文件描述符数目 (许多系统都不允许设置这个值)。助记词: Number, 文件数目
-p 管道的缓存大小。助记词: Pipe, 管道
-q POSIX 消息队列的最大字节数。助记词: Queue, 队列
-r 实时调度的最大优先级。助记词: Real-time, 实时
-s 堆栈的最大长度。助记词: Stack, 堆栈
-t CPU时间的最大秒数。助记词: Time, CPU 时间
-u 一个用户所能拥有的最多进程数。助记词: User, 用户里程
-v 进程所拥有的最大虚拟内存。助记词: Virtual-memory, 虚拟内存
-x 文件锁的最多个数。助记词: X, 锁定
-T 线程的最多个数。助记词: Thread, 线程
如果给定了限制数,它就是指定资源的新值。hard,soft 和 unlimited 等特殊的值分别代表当前的硬限制、软限制和无限制。
硬限制一旦设定了以后除了root用户就不能修改;而软限制则可以增加到硬限制的值。
如果没有给定限制数,则打印指定资源的软限制的值,除非指定了"-H"选项。
设置新的限制时,如果既没有"-H"也没有"-S",则默认为"-f"。
限制值一般都是按1024字节增加,但是"-t"是以秒增加的, "-p"是以 512 字节的块增加,而"-n"和"-u"不是按比例增加的。
返回值:返回值是零,除非指定了无效的选项或参数,或者设置新限制时发生了错误。
4.2.21 unalias
语法:unalias [-a] [名称 . . .]
功能:从别名列表中删除每个名称。
如果给定了"-a"助记词: All, 所有的,则删除所有别名。
4.3 改变Shell的行为
4.3.1 内部命令set
这个内部命令非常复杂,必须在单独的章节中介绍。它可以用来改变shell选项或者设置位置参数,也可以显示shell变量的名称和值。
语法:
set [--abefhkmnptuvxBCEHPT] [-o 选项] [参数 . . .]
set [+abefhkmnptuvxBCEHPT] [+o 选项] [参数 . . .]
功能:如果没有指定选项或参数,set就会显示所有shell变量与函数的名称和值,显示时按照当前的语区域排序,其格式可以用来重新设置这些已经设置的变量。
只读变量不可以重设。在POSIX模式下,只列出 shell变量。
如果指定了选项,它们就会打开或关闭shell的属性。它们具有下列含义:
-a 对已经更改或新创建的变量和函数,把它们标志为可以导出到后续命令的环境中。助记词: Alter, 改变的
-b 后台作业结束时立即报告,而不是在下次打印第一个提示符时报告。助记词: Background, 后台
-e 助记词: Exit, 退出。如果管道返回非零的状态则立即退出;管道可以包含简单命,在圆括号中间的子shell命令,大括号之间的命令队列中的命令。
如果失败的命令是紧接着 while 或 until 关键词后面的命令队列的一部分、或者属于 if 语句中测试部分、
或者 && 或 || 队列中除了最后一个 && 或 || 后面的任何命令、或者管道中除了最后一个以外的任何命令、
或者命令的返回状态经由 ! 反转, 则不会退出。
如果设置了 ERR 陷阱,则会在shell 退出之间执行。
这个选项分别作用于 shell 环境和每个子 shell 环境,并会导致子shell在尚未执行其中所有命令之前退出。
-f 禁止生成文件名(文件通配)。助记词: Filename, 文件名
-h 搜索执行命令时把它们记录在散列表中 hash 中。这个选项默认就打当了。助记词: Hash, 散列表
-k 把所有以赋值形式出现的变量都放入命令的环境中,而不仅仅是命令名称前面的那些。助记词: Keep, 保留
-m 启用作业控制。助记词: Monitor, 监控作业
-n 读取命令但不执行。这可以用来检查脚本的语法。在交互式的 shell 中,这个选项会被忽略掉。助记词: No-execution, 不执行
-o 选项名称 设置与选项名称对应的选项:助记词: Option, 选项
allexport 与-a 相同。
braceexpand 与 -B 相同。
emacs 使用emacs风格的行编辑界面。这个选项会还会影响 read -e所使用的编辑界面。
errexit 与 -e 相同。
errtrace 与 -E 相同。
functrace 与 -T 相同。
hashall 与 -h 相同。
histexpand 与 -H 相同。
history 启用命令历史 。在交互式的 shell 中,这个选项默认是打当的。
ignoreeof 交互式的 shell 在读取到 EOF 时不退出。
keyword 与 -k 相同。
monitor 与 -m 相同。
noclobber 与 -C 相同。
noexec 与 -n 相同。
noglob 与 -f 相同。
nolog 目前忽略这个选项。
notify 与 -b 相同。
nounset 与 -u 相同。
onecmd 与 -t 相同。
physical 与 -P 相同。
pipefail 如果打开,则管道的退出状态与其中札后一个(最右边的)退出状态为非零的命令相同;
如果管道中的所有命令都成功执行,则返回零。这个选项默认是关闭的。
posix 更改Bash的行为以遵循POSIX 标准;默认不是POSIX 模式的。这个选项的目的是让Bash成为严格遵循 POSIX 的超集。
privileged 与 -p 相同。
verbose 与 -v 相同。
vi 使用vi风格的行编辑界面。这个选项会还会影响 read -e 所使用的编辑界面。
xtrace 与 -x 相同。
-p 助记词: Privileged, 特权的,打开特权模式。
在这种模式下,不处理$BASH_ENV和$ENV文件,不从环境中继承shell函数,如果环境中有SHELLOPTS,CDPATH 和GLOBIGNORE变量也会忽略。
如果启动shell时的有效用户(组)和实际用户(组)不一样,并且没有指定"-p"选项,则除了这些,还把有效用户设为实际用户。
如果指定了"-p"选项,则不改变有效用户。关闭这个选项会把有效用户和有效用户组设为实际用户和实际用户组。
-t 读取并执行乌条命令后就週出。助记词: exiT, 退出
-u 在进行参数扩展时,如果变量没有设置就报错。把错误信息写入到标准错误输出中,并退出非交互运行的 shell。助记词: Unset, 未定义的
-v 在 shell 读取输入行时把它打印出来。助记词: Verbose, 详细
-x 对于简单命令,for 命令,case 命令,select 命令,命令与其参数或者关联的单词列表里面的算术运算,则在扩展以后、执行之前,打印跟踪信息。
在打印命令及其扩展过的参数之前,先打印扩展后的PS4变量。助记词: X, 跟踪
-B 进行大括号扩展。这个选项默认是打开的。助记词: Brace, 大括号
-C 防止使用">",">&"和"<>"的重定向覆盖已经存在的文件。助记词: Collision, 文件冲突
-E 如果打开,则shell函数、命令替换、以及子shell环境中执行的命令会继承ERR陷阱。通常,这些情况下不会继承 ERR 陷阱。助记词: ERR, 错误陷阱
-H 打开"!"风格的历史替换。在交互式的shell中,这个选项默认是打开的。助记词: History, 历史
-P 助记词: Physical, 物理路径。如果打开,执行诸如cd等改变当前目录的命令时不跟踪符号链接,而使用物理路径。
默认情况下,Bash执行能够改变当前目录的命令时会使用逻辑路径。
例如,如果"/usr/sys"是 指向"/usr/local/sys"的符号链接,则
$ cd /usr/sys; echo $PWD
/usr/sys
$ cd ..; pwd
/usr
如果打当 -P,则
$ cd /usr/sys; echo $PWD
/usr/local/sys
$ cd ..; pwd
/usr/local
-T 如果打开,则shell函数、命令替换、以及子shell环境中执行的命令,会继承DEBUG和RETURN陷阱。通常,这些情况下不会继承DEBUG和RETURN陷阱。
-- 如果后面没有其它参数,则重置位置参数;否则,把它们赋值给位置参数,即使它们忬头是"-"。
- 表示选项结束,后续参数都会赋值给位置参数。这会关闭"-x"和"-v"选项。如果没有后续参数,则不 改变位置参数。
如果在选项中使用"+"而不是"-",这些选项就会关闭。这些选项还可以在 shell 启动时使用。当前的选项保存在变量 $-中。
剩余的N个参数是位置参数,它们会按顺序分别赋给 $1,$2, . . . $N。特殊变量$#设为N。 返回状态总是零,除非指定了无效的选项。
4.3.2 内部命令shopt
本内部命令可以改变 shell 额外选项的行为。
语法:shopt [-pqsu] [-o] [选项名称 . . .]
功能:打当或关闭shell选项以控制 shell 的行为。
如果没有选项,或者有"-p"选项助记词: Pretty-Print, 格式输出,则显示所有可以设置的选项,并指示每个选项是否打当。
其它选项有下列含义:
-p 选项使输出的形式可以重新用于输入。
-s 设置(打开)选项名称。助记词: Set, 设置
-u 重置(关闭)选项名称。助记词: Unset, 重置
-q 禁止正常输出。它的返回状态可以提示选项名称是否打当。如果"-q"带有多个选项名称,则当所有的选项名称都打开时返回零,否则返回非零。助记词: Quiet, 安静模式
-o 限制选项名称为内部命令set所定义的那些。助记词: Option, SET的选项
如果指定了"-s"或者"-u"选项而没有选项名称,则只(分别)显示已经打开或关闭的选项。
除非特别说明,shopt 选项默认都是关闭的。
列出选项时,如果所有选项都打开了,则返回零,否则返回非零。
设置或重置选项时返回零,除非遇到无效的shell选项。
shopt 有下列选项:
autocd 如果打开,则使用目录名称作为命令就和把这个目录作为cd 命令的参数一样。这个选项只在交互式的shell中使用。
cdable_vars 如果打开,并且内部命令 cd 的参数不是个目录,就把这个参数当成值为目录的变量,并进入该目录。
cdspell 如果打开,则自动改正 cd 命令中对目录名轻微的拼写错误。这些错误包括颠倒的字符,缺少一个字符,或者多一个字符。
如果改正了错误,则打印改正后的路径,并继续处理命令。这个选项只在交互式的 shell 中使用。
checkhash 如果打开,Bash会在执行命令前检查散列表中的命令是否存在。如果已经不存在,则进行正常搜索。
checkjobs 如果打开,Bash会在退出交互式的 shell 前列出所有正在运行或已经停止的作业状态。如果有作业正在运行,则延迟退出,直到使用干涉命令再次尝试退出。如果有已经停止的作业,shell 总会延迟退出。
checkwinsize 如果打当,Bash会在执行每个命令以后都检查(终端)窗口大小;如果必要,就更新 LINES 和 COLUMNS 的值。
cmdhist 如果打开,Bash会试图把多行的命令的所有行都保存在同样的历史文件中。这使得再次编辑多行命令变得容易。
compat31 如果打开,Bash会在处理条件命令的 =~ 时,以第 3.1 版的方式处理引用。
dirspell 如果打开,Bash会在单词补全时遇到原本不存在的目录后试图改正目录名的拼写。
dotglob 如果打开,Bash会在文件名扩展的结果中包含以"."开头的文件名。
execfail 如果打开,则非交互式运行的 shell 在用内部命令 exec 不能执行指定的文件时不会退出。exec 失败时,交互式的 shell 都不会退出。
expand_aliases 如果打开,则对别名进行扩展。这个选项在交互式的 shell 中默认就是打开的。
extdebug 如果打开,则启动用于调试的行为:
内部命令 declare 的"-F"选项会显示与每个参数所指定的函数名对应的源文件名和行号。
如果 DEBUG 陷阱运行的命令返回的值为非零,则忽略下一条命令的执行。
如果 DEBUG 陷阱运行的命令返回的值为 2,并且 shell 正在执行子程序(即 shell 函数,或者用内部命令 . 或 source 执行的 shell 脚本),则模拟 return 的调用。
更新 BASH_ARGC 和 BASH_ARGV 变量。
启用函数跟踪:通过"(命令)"而执行的命令替换,shell 函数和子 shell 都会继承 DEBUG 和 RETURN陷阱。
启用错误跟踪:通过"(命令)"而执行的命令替换,shell 函数和子 shell 都会继承 ERROR 陷阱。
extglob 如果打开,则使用扩展的模式匹配。
extquote 如果打开,则对于双引号之间的"${参数}",还会处理参数里面的"$"字符串""和"$'字符 串'"引用。这个选项默认就是打当的。
failglob 如果打开,则在文件名扩展中如果模式与文件名不匹配就会导致扩展错误。
force_fignore 如果打开,则在单词补全时会忽略 shell 变量 FIGNORE 指定的后缎,即使被忽略的单词 是唯一可以补全的。这个选项默认就是打当的。
globstar 如果打开,则在文件名扩展中"*"字符会匹配文件以及零个或多个文件夹和子文件夹。如果这个模式后面有个"/",则只匹配文件夹和子文件夹。
gnu_errfmt 如果打开,则用标准的GNU错误信息格式输出 shell 错误信息。
histappend 如果打开,则当 shell 退出时,把历史记录添加到 HISTFILE 变量指定的文件中,而不是覆盖这个文件。
histreedit 如果打开,并且使用了Readline,则当历史替换失败时给用户提供重新编辑的机会。
histverify 如果打开,并且使用了Readline,则历史替换的结果不会立即传给 shell 来解释,而是把结果的文本加载到Readline的编辑缓存中以便进一步修改。
hostcomplete 如果打当,并且使用了Readline,则当补全一个含有"@"的单词时,Bash会试图进行主机名补全 。这个选项默认就是打开的。
huponexit 如果打开,则在交互式的登录 shell 退出时,Bash会向每个作业发送 SIGHUP。
interactive_comments 允许忽略以"#"开头的单词以及其所在行中所有剩余的单词。这个选项默认就是打开的。
lithist 如果打开,并且打开了 cmdhist 选项,则保存在历史中的多行命令就带有内部换行符,而不是在必要时使用分号分隔。
login_shell 如果作为登录 shell 启动就打开它。这个选项不可以更改。
mailwarn 如果打开,并且Bash用来检查新邮件的文件在它上次检查过后已经被访问,则打印"邮箱文件已经被读取过"。
no_empty_cmd_completion 如果打开,并且使用了Readline,则Bash不会为补全空行而试图搜索PATH。
nocaseglob 如果打开,则Bash在进行文件名扩展时对文件名的大小写不敏感。
nocasematch 如果打开,则Bash在执行 case 命令或 [[ 条件命令并进行模式匹配时对模式的大小写不敏感。
nullglob 如果打开,则Bash允许不匹配任何文件的模式扩展为空字符串,而不是扩展成自身。
progcomp 如果打开,则启用可编程的补全功能。这个选项默认就是打开的。
promptvars 如果打当,则对提示符按下述方法扩展以后还要进行参数扩展,命令替换,算术扩展和引用去除。这个选项默认就是打当的。
restricted_shell 如果 shell 以受限制的模式启动就打开它。这个选项不可以更改。在执行初始化文件时也不会重置它,这使得初始化文件可以检测一个 shell 是不是受限制的。
shift_verbose 如果打开,则当移动的数目超过位置参数的数目时,内部命令 shift 会打印一条错误信息。
sourcepath 如果打开,则内部命令 source 会用 PATH 会搜索参数中指定文件所在的目录。这个选项默认就是打开的。
xpg_echo 如果打开,则内部命令 echo 默认会扩展转义字符序列。
列出选项时,如果所有选项都打开了,则返回零,否则返回非零。设置或重置选项时返回零,除非遇到无效的 shell 选项。
4.4 特殊内部命令
由于历史的原因,POSIX 标准把几个内部命令归入到特殊的类别。
当Bash在 POSIX 模式下运行时, 这些特殊的内部命令和其它内部命令有三个不同的方面:
在搜索命令时,特殊命令的搜索先于 shell 函数。
如果特殊命令返回错误状态,则非交互运行的 shell 就会退出。
命令前面的赋值语句在命令结束以后仍然对 shell 环境有影响。
当Bash不是在 POSIX 模式下运行时,这些内部命令和其它内部命令的行为没有什么不同。
下面是 POSIX 规定的特殊内部命令:
break
:
.
continue
eval
exec
exit
export
readonly
return
set
shift
trap
unset
4.Shell内部命令的更多相关文章
- Linux shell 内部命令与外部命令有什么区别以及怎么辨别
内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留 ...
- bash内部命令-2
http://www.gnu.org/software/bash/ http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/ [root@250-shiyan ~]# ...
- enable&&builtin---shell内部命令
用enable命令显示所有激活的内部命令: [root@localhost ~]# enable -a builtin命令用于执行指定的shell内部命令,并返回内部命令的返回值 [root@xiao ...
- vb6.0的各种SHELL,CMD内部命令、外部命令、SHELL任意文件
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (B ...
- Bash 中同名的内部命令和外部命令
昨天有个人在 bug-bash 上问:为什么 [ --help 没有输出帮助信息.有人回答他了,原因是 coreutils 提供的 [ 命令才接受 --help 选项,Bash 自己的 [ 命令不接受 ...
- shell常用命令归类整理
shell 命令整理 bash shell 含有许多功能,因此有许多可用的命令:本文档仅罗列了一些常用命令及其使用频率较高的参数.#本文档仅罗列了一些常用命令及其使用频率较高的参数.#vers ...
- Shell和命令基础
什么是Shell Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口(命令解析器),Shell接收用户输入的命令并把它送入到内核去执行,结构如下图 Shell的功能 Shell最重要的 ...
- Linux编程 10 (shell外部命令与内建命令,alias ,type命令)
一. 内部命令 Linux命令有内部命令(内建命令)和外部命令之分,内部命令和外部命令功能基本相同,但也有些细微差别.内部命令不需要使用子进程来执行,它们已经和shell编译成一体,作为shell工 ...
- centos 特殊权限 各种搜索命令 lsattr ,chattr,suid,sgid,sbit,file,type是否是内置命令,stat文件属性 ,whereis,locate,find,ln 内部命令和外部命令 第五节课
centos 特殊权限 各种搜索命令 lsattr ,chattr,suid,sgid,sbit,file,type是否是内置命令,stat文件属性 ,whereis,locate,find,ln ...
随机推荐
- Linux设备驱动程序 之 Makefile
典型的模块Makefile如下所示: ifneq ($(KERNELRELEASE),) obj-m := hello.o else KERNELDIR ?=/lib/modules/$(shell ...
- Java中AWT、Swing与SWT三大GUI技术的原理与效率差异
Java中AWT.Swing与SWT三大GUI技术的原理与效率差异 转 https://blog.csdn.net/weixin_37703598/article/details/81843810 ...
- 【Taro全实践】Taro在微信小程序中的生命周期
一.Taro的本身生命周期 生命周期componentWillMount在微信小程序中这一生命周期方法对应页面的onLoad或入口文件app中的onLaunch componentDidMount在微 ...
- RabbitMQ学习之:(四)回头看刚才写的程序 (转贴+我的评论)
转自:http://lostechies.com/derekgreer/2012/03/18/rabbitmq-for-windows-hello-world-review/ 我的心得: 1. 在创建 ...
- [spring]@Resource和@Autowired区别对比
@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Sprin ...
- Shell脚本中判断字符串是否被包含在内
1.字段 grep:案例: str1="abcdefgh"str2="def"result=$(echo $str1 | grep "${str2}& ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_5-02 Netflix开源组件断路器
笔记 2.Netflix开源组件断路器Hystrix介绍 简介:介绍Hystrix基础知识和使用场景 文档地址: https://github.com/Net ...
- 部署Hadoop-3.0-高性能集群
一.Hadoop概述: Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储.Hadoop的框 ...
- vue中自定义指令的使用
原文地址 vue中除了内置的指令(v-show,v-model)还允许我们自定义指令 想要创建自定义指令,就要注册指令(以输入框获取焦点为例) 一.注册全局指令: // 注册一个全局自定义指令 `v- ...
- 【VS开发】VS2010中导入ActiveX控件
方法1: 1.首先在在项目上面右击添加类,如下图所示: 2.点击添加ActiveX控件中的MFC类 3.找到需要添加的ActiveX类. 4.点击完成即可. 5.此时转到资源视图,打开如下视图.可能工 ...