- Linux常用命令简明手册
- 邢国庆编著
- 4929字
- 2020-08-28 07:42:02
命令历史
当使用“set -o”内置命令启用了history选项时,bash提供命令历史访问机制,使用户能够获取和编辑先前输入的命令。HISTSIZE变量值设定了命令历史缓冲区中能够保存的最新命令行数量,默认值是500。在参数与变量替换之前,命令历史替换之后,Shell会保存每个满足HISTIGNORE与HISTCONTROL变量定义原则的命令行。
在启动过程中,bash会读取HISTFILE变量定义的命令历史文件(默认的文件是~/.bash_history),初始化命令历史缓冲区。在读取命令历史文件时,首字符为命令历史注释字符、紧随其后的数字数据行按前一命令行的时间解释。这些时间信息是否显示取决于HISTTIMEFORMAT变量的值。在退出交互Shell时,bash会把命令历史缓存区中的命令行写到命令历史文件中,必要时,bash会截短命令历史文件,使之存储最近的、不多于HISTFILESIZE变量指定数量的命令行。如果未设置HISTFILESIZE变量,保存全部的命令行。如果启用了Shell选项histappend(参见shopt内置命令),把命令行附加到命令历史文件后面,否则重写命令历史文件。如果未设置HISTFILE变量或无法写命令历史文件,则不会保存命令历史。如果设置了HISTTIMEFORMAT变量,时间信息也会写到命令历史文件中,在前面增加一个注释字符作为标记,以区别于命令,以便能够在不同的Shell会话之间予以维护。
利用fc内置命令,可以列出、编辑和重新执行命令历史缓冲区中的命令。利用history内置命令可以显示或修改命令历史文件或命令历史缓冲区的命令。当处于命令行编辑模式时,可以使用命令行编辑功能修改命令,利用检索命令访问命令历史记录。
利用HISTCONTROL与HISTIGNORE变量,可以控制哪些命令需要保存到命令历史缓冲区中。适当地设置这两个变量,可以把输入的部分命令子集保存到命令历史缓冲区中。如果使用shopt内置命令启用了Shell选项cmdhist,Shell将会尝试增加必要的分号,维持语法的正确性,把多行命令的每一行作为同一命令记录保存。如果启用了Shell选项lithist,Shell会使用内嵌的换行符而非分号保存命令行。
命令历史替换
bash支持类似于csh的命令历史扩展特性。通常,交互Shell自动启用这一特性,但可以使用set内置命令的“+H”选项禁用之。非交互Shell通常不会执行命令历史替换。
命令历史替换能够从命令历史缓冲区中引入命令行,使用户能够容易地重复执行命令,或快速地编辑先前的命令,插入参数,校正错误,然后再次执行等。
命令历史替换是在读取完整的命令行之后,Shell把命令行分解成一系列单字之前立即执行的。具体实现分为两个步骤:首先确定在替换时选用命令历史缓冲区中的哪一个命令行,其次是把选中的命令行部分作为当前的输入数据。从命令历史缓冲区中选择的命令行称作事件(event),同常规的输入一样,选中的命令行可以分解成一系列单字,引号引用的一组单字可以作为一个单字处理。利用若干限定符可以操作选择的单字。命令历史替换由命令历史替换字符(通常是“!”)触发。只有“\”和单引号能够取消命令历史替换字符的特殊意义。
此外,如果紧随命令历史替换字符的是空格、制表符、换行符、回车和“=”,即使未加引用,也会禁止命令历史替换。如果启用了Shell选项extglob,左圆括号“(”也禁止执行命令历史替换。
shopt内置命令的若干Shell选项也可用于定制命令历史替换的处理方式。如果启用了Shell选项histverify,且使用readline读取命令,命令历史替换也不会立即传递给Shell解释程序,相反,Shell只是把替换后的命令行重新加载到readline编辑缓冲区做进一步的修改。同样,如果启用了Shell选项histreedit,且使用readline读取命令,命令历史替换失败后就会被重新加载到readline编辑缓冲区做进一步的校正。history内置命令的“-p”选项用于查询命令历史替换的结果,利用“-s”选项可以把命令加到命令历史缓冲区后面,但不执行,之后可以按常规引用。
事件标识符
事件标识符用于引用命令历史中的命令行记录。bash支持的事件标识符如下:
! 开始命令历史替换,除非后面紧跟的是一个空格、换行符、回车、等号或左圆括 号(如果使用shopt内置命令启用了Shell选项extglob)。 !n 引用命令历史记录序号为n的命令。 !-n 引用从当前命令开始倒数第n个命令。 !! 引用前一个命令(相当于“!-1”)。 !str 引用最近一个以str为起始字符串的命令。 !?str[?] 引用最近一个包含字符串str的命令。如果紧随str之后是一个Enter键,第二个 问号可以省略。 ^str1^str2^ 快速替换。使用 str2 替换 str1,重新执行最近一个命令。这个命令等价于 “!!:s/str1/str2/”命令。 !# 引用迄今输入的整个命令行。
单字标识符
单字标识符用于从事件中选择期望的单字。如果同时存在,可以使用冒号分隔事件标识符和单字标识符。如果单字标识符以“^”、“$”、“*”、“-”或“%”开始,冒号可以省略。单字的编号从命令行的第一个单字开始,其编号是0。插入当前输入数据行的单字应加一个空格分隔符。
0 第0个单字。对于Shell而言,此即命令名本身。 n 第n个单字。 ^ 第一个参数,即第一个单字。 $ 最后一个参数。 % 最近的“?string?”检索匹配的单字。 x-y 单字的范围,其中“-y”表示“0-y”。 * 除第0个之外的所有单字。等同于“1-$”。如果命令行只有一个单字,则返回空串。 x* “x-$”的缩写。 x- 类似于“x*”,但忽略最后一个单字。 如果仅指定了单字标识符但未提供事件标识符,使用先前的命令作为事件标识符。
限定符
在选用的单字标识符之后,还可以附加下列一个或多个限定符,每个限定符前面加一个冒号“:”。
h 删除文件路径名的文件名部分,仅留下目录部分。 t 删除文件路径名的所有目录部分,仅留下文件名部分。 r 删除文件名“.xxx”形式的扩展名,仅留下基本的文件名部分。 e 除了扩展名,删除文件路径名的所有部分。 p 显示新的命令,但不执行。 q 引用需要替换的所有单字,以便做进一步的替换处理。 x 类似于q,但需要基于空格和换行符分解单字。 s/old/new[/] 针对匹配的命令行,使用new替换第一个出现的old。如果分界符“/”是最后一 个字符,可以省略。此外,可以使用任何分界符替代“/”。如果old与new本身 也含有分界符,可以加转义符号。如果“&”出现在new中,可以使用old替换 之。必要时也可以在“&”字符之前加转义符号,取消其特殊意义。如果 old 是 空串,意味着使用前一个old作为当前的old,如果之前没有执行任何替换,使用 最近一次“!?string[?]”检索的字符串作为old。 & 重复执行先前的替换。 g 表示相关的动作适用于整个命令行。通常与“:s”(如“:gs/old/new/”)或“:&” 一起使用。如果与“:s”一起使用,可以使用任何分界符替代“/”字符。如果是 最后一个字符,最后一个分界符可以省略。此外,也可以使用a替代g。 G 针对命令行中的每个单字,执行一次s限定符的处理动作。
Shell内置命令
:[args] 空命令。本身不做任何处理动作,总是返回结束状态 0。其功能一是用作无限循环语句的测试条 件;二是作为一种特殊命令形式,令bash处理同一命令行上紧随其后的变量替换或命令替换。 .script[args] source script[args] 从命令行中读取指定的Shell脚本文件,并在当前的环境中执行,其返回值是脚本中执行的最后一 个命令的结束状态。如果文件名参数不是绝对路径,使用PATH变量指定的目录检索脚本文件, 文件也不必是可执行文件。在非POSIX模式中,如果PATH变量指定的目录中不存在指定的文 件,可在当前目录中检索给定的脚本文件。如果shopt命令的sourcepath控制选项处于禁用状态, 则禁止从PATH变量指定的目录中检索文件。如果指定了任何参数args,这些参数将会成为指定 脚本文件的位置参数。“.”与source命令最重要的用途是利用脚本设置环境变量。在此情况下, 即使退出环境变量设置脚本,环境变量的设置仍然保持有效。如果直接运行环境变量设置脚本, 在脚本终止运行之后,脚本中设置的环境变量也将随之消失而不复存在。 alias[-p][name[=value]...] alias命令用于设置或显示系统或用户定义的命令别名。如果未指定参数,或指定了“-p”选项, 则以“name=value”的形式在标准输出上显示已定义的命令别名。如果指定了参数,则以给定的 value定义每个命令别名name。如果仅给定了name而没有提供value,显示指定的命令别名及其 定义。如果指定的value含有空格等空白字符,前后应加引号。 bg[jobs] 把指定的作业置入后台运行模式,就像在命令行上输入命令时加了&后缀一样。如果未给定作业 号,把当前作业置入后台运行模式。 bind[-m keymap][-lpsvPSV] bind[-m keymap][-q function][-r keyseq][-u function] bind[-m keymap]-f file bind[-m keymap]-x keyseq:shell-cmd bind[-m keymap]keyseq:function bind readline-cmd 用于显示、建立键序列与readline函数(命令)或宏的捆绑关系,以及设置readline变量。其中, “keyseq:function”是一个键序列与readline命令的捆绑定义,如“"\C-x\C-r": re-read-init-file”, 前后必须加引号,作为一个单独的参数。readline-cmd是一个readline命令。bind命令支持下列选 项: -f file 从指定的文件file中读取键序列与readline函数名的捆绑关系。 -l 列出所有readline函数(命令)的名字。 -m keymap 使用指定的keymap建立捆绑关系。有效的keymap名字是emac(s emacs-standard)、 emacs-meta、emacs-ctlx、vi(vi-command)、vi-move和vi-insert。 -p 以能够重用的方式显示键序列与readline函数名的捆绑关系。 -P 显示当前的键序列与readline函数名的捆绑关系。 -q function 查询哪一个键序列调用指定的readline函数function。 -r keyseq 删除捆绑到指定键序列keyseq的任何readline函数。 -s 以能够重用的方式显示绑定到宏的键序列。 -S 显示绑定到宏的键序列。 -u function 解除捆绑到指定函数function上的所有键序列。 -v 以能够重用的方式显示readline变量名及其值。 -V 显示readline变量名及其当前值。 -x keyseq:shell-cmd 定义键序列与Shell命令的捆绑关系。无论何时输入指定的键序列keyseq,执行 指定的Shell命令shell-cmd。当执行shell-cmd时,Shell将赋予READLINE_LINE变 量以行编辑缓冲区的内容,把变量READLINE_POINT设置成当前的插入点位置。 break[n] 用于退出for、while、until或select等循环语句。如果指定了n(必须大于等于1),意味着退出 n层循环。如果指定的n大于整个循环层次,退出所有的循环层次。 builtin shell-builtin[args] 执行指定的Shell内置命令,传递必要的参数,返回其结束状态。当定义的函数名与Shell内置命 令相同时,为在函数中保持内置命令的正常使用,这个内置命令是非常有用的。 cd[-L|-P][dir] 改变目录。cd命令用于进入指定的目录,把指定的目录dir改换成当前的工作目录。HOME变量 值是cd命令默认的目录。变量CDPATH定义了包含dir目录的检索路径。CDPATH中的备用目 录名由冒号分隔,其中的空目录名等同于当前目录“.”。如果dir的起始字符是“/”,意味着不 使用CDPATH。“-P”选项表示使用实际的目录而非符号链接文件指向的目录。“-L”选项表示 使用符号链接文件指向的目录。目录参数“-”等价于OLDPWD变量。如果使用了CDPATH变 量中定义的非空目录名,或“-”是第一个参数,且目录改换成功,则把新工作目录的绝对路径名 写到标准输出。 command[-pvV]cmd[args] 使用指定的参数args运行给定的命令cmd,禁止常规的Shell函数检索。仅执行内置命令或从PATH 变量定义的目录中发现的命令。如果指定了“-p”选项,使用PATH变量的默认值检索命令,确 保检索和执行的命令是标准的实用程序。如果指定了“-v”或“-V”选项,显示命令的出处,如 命令别名、内置命令或程序文件名等。 continue[n] 用于结束for、while、until或select等循环语句中的当前循环,并立即开始执行下一轮循环。如果 指定了n(必须大于等于1),意味着从第n层循环开始执行下一轮循环。如果指定的n大于整个 循环层次,从最外层循环开始执行下一轮循环。 declare[-aAfFilrtux][-p][name[=value]...] typeset[-aAfFilrtux][-p][name[=value]...] 用于声明或定义变量,以及获取变量的属性。如果未指定变量名,显示所有变量的值。“-p”选 项用于显示每个给定变量的值和属性。如果指定“-p”选项时也提供了参数name,则忽略其他选 项。如果指定“-p”选项时未提供参数name,则显示具有其他选项指定属性的所有变量的属性与 变量值。如果仅指定了“-p”选项而未指定其他选项,declare将会显示所有Shell变量的属性与变 量值。下列选项用于限定输出具有指定属性的变量,或显示变量的属性: -a 把指定的变量定义为数组变量。 -A 把指定的变量定义为关联数组变量。 -f 仅限于显示函数。 -F 仅显示函数的名字和属性,禁止显示函数的定义。“-F”选项蕴含着“-f”选项。 -i 把指定的变量定义为整数变量。当赋予变量值时,执行算术运算。 -l 当赋予变量值时,所有的大写字母均转换成小写字母。禁用大写字母属性。 -r 把指定的变量定义为只读变量。在随后的处理过程中,不能为只读变量赋值,也不能使用 unset命令撤销变量。 -t 设置给定name的跟踪属性。跟踪的函数将会继承调用者的DEBUG与RETURN跟踪设置。 对于变量而言,跟踪属性没有特殊的意义。 -u 当赋予变量值时,把所有的小写字母均转换成大写字母。禁用小写字母属性。 -x 公布指定的变量,以便其他命令或Shell脚本能够使用。 使用“+”替代“-”将会关闭变量的属性,但不能使用“+a”选项删除数组变量,也不能使用“+r” 选项删除只读属性。在函数中使用declare或typeset时,其效果如同local内置命令,意味着把每 个参数name定义为本地变量。如果变量名后面是“=value”,把给定的值value赋予变量。 disown[-ar][-h][jobs] 如果未指定任何选项,从活动的作业表中删除指定的每个作业。如果未提供jobs参数,也未指定 “-a”或“-r”选项,假定是当前作业。如果未提供jobs参数,“-h”选项意味着不删除任何作业, 但会标记每个作业,使得在收到SIGHUP信号时,Shell不会向作业发送SIGHUP信号。如果未提 供jobs 参数,“-a”选项意味着删除或标记所有的作业,“-r”选项表示仅限于当前正在运行的 作业。 echo[-neE][args] 用于输出指定的一个或多个参数(中间加空格分隔符),包括字符串、变量值或表达式的计算结 果等,在输出参数之后附加一个换行字符。如果指定了“-n”选项,禁止输出行尾的换行字符。 如果指定了“-e”选项,意味着解释参数中可能出现的下列转义字符(“-E”选项表示禁止解释 转义字符): \a 警示音。 \b 退格符。 \c 禁止继续输出。 \e ESC字符。 \f 换页符。 \n 换行符。 \r 回车符。 \t 制表符。 \v 纵向制表符。 \\ 反斜线。 \0nnn 八进制数值nnn(0~3位八进制数值)表示的8位编码的字符。 \xHH 十六进制数值HH(1或2位十六进制数值)表示的8位编码的字符。 enable[-a][-dnps][-f file][names] 启用和禁用Shell内置命令。禁用Shell内置命令之后,无须指定完整的路径名即可运行与Shell 内置命令同名的命令,即使Shell优先检索内置命令,然后再检索PATH变量指定目录中的命令 也是如此。如果指定了“-n”选项,表示禁用任何内置命令,否则启用任何内置命令。例如,若 想直接运行外部的test命令(/usr/bin/test),可以先用“enable -n test”命令禁用Shell内置命令 test。“-f”选项意味着在支持动态加载的系统上,从共享目标代码文件中加载新的内置命令。“-d” 选项表示删除先前使用“-f”选项加载的内置命令。如果未指定names参数,或指定了“-p”选项, 列出已启用的所有Shell内置命令。如果指定了“-n”选项,仅列出禁用的Shell内置命令。如果 指定了“-a”选项,列出所有的Shell内置命令,同时表示每个内置命令是否已经启用。“-s”选 项意味着仅限于列出POSIX特定的内置命令。 eval[args] 读取随后的参数,组合成一个简单的命令,然后提交Shell执行。 exec[-cl][-a name][cmd[args]] 如果指定了命令参数cmd,使用cmd替代当前的Shell进程,但不创建新进程,执行给定的命令 cmd。其中args是命令cmd选用的参数。如果在Shell脚本中使用exec命令,当exec命令引入的 命令终止运行时,将会强制Shell脚本也随之终止执行。因此,如果在脚本中使用exec命令,通 常应作为最后一条命令。如果未带参数,exec命令的作用只是按照I/O重定向的要求修改文件描 述符。例如,“exec<fname”命令意味着使用给定的文件fname代替标准输入。如果指定了“-l” 选项,Shell将会在传递给命令的第0个参数前放置一个连字符“-”。“-c”选项表示在一个空的 环境中运行指定的命令。如果指定了“-a”选项,Shell将会把name作为第0个参数传递给执行 的命令。如果命令cmd无法执行,除非启用了Shell选项execfail,非交互Shell将会终止运行, 而交互Shell将会返回运行故障。如果未指定命令,任何重定向仅影响当前的Shell,最后返回0。 如果重定向出现错误,返回1。 exit[n] 引起Shell终止运行,返回一个结束状态n。如果省略了整数参数n,返回的结束状态是在exit之 前执行的最后一条命令的结束状态。通常,exit命令用于无条件地终止Shell脚本的执行。此外, 文件结束标志也会引起Shell脚本终止执行。在终止Shell或Shell脚本之前,如果存在捕捉EXIT 信号的trap语句,执行其中定义的命令。 export[-fn][name[=word]]... export -p export命令用于自动公布设置的变量,使变量能够用于之后运行的命令、脚本或Shell子进程。如 果指定了“-f”选项,说明给定的名字参数name是一个函数。如果未给定名字参数,或指定了“-p” 选项,显示当前Shell中已公布的所有变量。“-n”选项意味着取消已公布的指定变量。如果变量 名name后面存在“=word”,把word赋予变量name。export命令的一个重要用途是在启动文件 中初始化环境变量,使随后的命令都能够访问。 fc[-e ename][-lnr][first][last] fc-s[pat=rep][cmd] 用于显示、编辑或重复执行命令历史缓冲区中的命令。在第一种语法格式中,从命令历史记录中 选择first与last指定范围的命令。指定的first与last可以是一个数字(在命令历史记录中的索引, 其中负数表示相对于当前命令序号的偏移值)或一个字符串(用于匹配和定位最近执行的命令)。 如果未指定last,默认为当前命令。如果也未指定first,表示显示前16个命令,或编辑前一个命 令。“-n”选项表示禁止显示命令的编号。“-r”选项表示逆序显示命令。如果指定了“-l”选项, 表示在标准输出上显示命令列表。否则,如果指定了编辑器ename,表示采用编辑文件的方式编 辑指定的命令或命令范围。如果未指定ename,使用FCEDIT的变量值作为编辑器。如果未设置 FCEDIT变量,使用EDITOR的变量值作为编辑器。如果两个变量均未设置,调用vi。在完成命 令编辑并退出编辑器之后,立即显示并执行修改后的命令。在第二种语法格式中,使用rep替换 pat后重新执行修改后的命令。一个比较有用的命令别名是“r="fc-s"”,直接输入“r”时将会重 新运行最近一个命令,输入“r cc”时将运行最近一个起始字符串为“cc”的命令。 fg[jobs] 把指定的作业置入前台运行模式,作为当前作业。如果未给定作业号,把Shell认定的当前作业置 入前台运行模式。 getopts optstring name[args] 用于Shell或Shell脚本解析传递的位置参数(命令行参数)。其中,optstring含有需要解析的选 项字符,如果字符后面有一个冒号,表示选项要求提供一个参数(选项与参数之间需加空白字符)。 冒号与问号不能用作选项字符。每次运行时,getopts都会把下一个选项赋予name变量,把需要 处理的下一个参数的索引赋予OPTIND变量。每次调用Shell或Shell脚本时,都会把OPTIND变 量初始化为1。当选项要求提供一个参数时,getopts将会把这个参数赋予OPTARG变量。一旦选 项处理结束,getopts退出时将返回一个大于0的值。把OPTIND变量设置成第一个非选项参数的 索引,把name设置成“?”。注意,Shell不会自动清除OPTIND变量,如果在同一个Shell过程 中需要多次运行getopts命令且需要使用一组新的参数,则必须手工重置OPTIND变量。getopts 命令通常主要用于while循环语句,采用循环方式处理所有的选项和参数。 hash[-dlr][-p file][-t names][names] 主要用于记录给定命令的完整路径文件名,以便之后再次调用命令时不必检索PATH变量指定的 目录。对于每一个命令名,通过检索PATH变量指定的目录,确定并记录命令的完整路径文件名。 如果指定了“-p”选项,禁止检索PATH目录,把给定的命令名视作完整的路径文件名。“-r” 意味着清除已记录的所有命令位置。“-d”选项表示清除每个命令名的记录位置。如果指定了“-t” 选项,列出每个指定命令名参数的完整路径文件名。如果在指定“-t”选项的同时给定了多个命 令名参数,在输出记录的完整路径文件名前面显示给定的命令名。“-l”选项表示以能够作为输 入重用的格式显示输出信息。如果未给定参数或仅指定了“-l”选项,则只显示当前散列表中已 记录的命令信息。 help[-dms][pattern] 显示内置命令的帮助信息。如果指定了模式参数,给出匹配指定模式的所有命令的详细帮助信息。 否则,显示所有内置命令及Shell控制结构语句的帮助信息。 -d 显示匹配指定模式的每个命令的简单说明。 -m 以手册页的格式显示匹配指定模式的每个命令的说明。 -s 仅显示匹配指定模式的每个命令的语法格式。 history[n] history-c history-d offset history-anrw[file] history-p args history-s args 利用history命令,可以列出命令历史记录。如果不加任何选项,显示命令历史列表及命令的行号。 如果命令行带有星号标记,表示已经修改过。选用的参数n表示仅列出最近n个命令行。如果已 经设置了Shell变量HISTTIMEFORMAT且不为空,可用作strftime(3)的格式字符串,显示每个命 令历史记录的时间信息。显示时,时间信息与命令历史记录之间没有空格。如果指定了file参数, 表示使用指定的命令历史文件。如果未指定文件名参数,使用HISTFILE变量的值作为命令历史 文件。history命令支持下列选项: -a 把新的命令历史记录(当前bash会话从头开始输入的命令行)追加到命令历史文件后 面。 -c 清除命令历史缓冲区,删除其中的所有命令历史记录。 -d offset 从指定的偏移位置删除命令历史记录。 -n 从命令历史文件中读取尚未读取的命令历史记录,加到当前的命令历史缓冲区中。这 些命令历史记录是当前bash会话从头开始输入的命令行追加到命令历史文件中的。 -p args 对指定的参数args执行命令历史替换,然后在标准输出上显示替换后的结果。替换结 果并不保存在命令历史缓冲区中。每个参数必须加引用保护,以禁止常规的命令历史 替换。 -r 读取命令历史文件中的内容,用作当前的命令历史记录。 -s args 作为单个记录,把参数args保存在命令历史缓冲区中。在加入args之前,删除命令历 史缓冲区中的最后一个命令。 -w 把当前的命令历史记录写到命令历史文件,覆盖命令历史文件中的内容。 如果设置了HISTTIMEFORMAT变量,与每个命令历史记录相关联的时间信息也会写到命令历史 文件中,在时间前面增加一个命令历史注释字符。在读取命令历史文件时,行首为命令历史注释 字符的时间数据行按前一个命令历史记录的时间信息解释。 jobs[-lnprs][jobs] jobs命令用于显示指定或全部活动的作业。其中参数jobs是以“%n”形式表示进程的作业号或进 程ID。如果未指定任何选项与参数,可以列出所有活动的后台作业。如果给定了作业参数jobs, 仅限于输出指定作业的信息。jobs命令支持下列部分选项: -l 除了常规的输出信息,还显示附加的进程ID信息。 -n 仅显示自上次通知用户之后状态再次发生变化(如暂停或终止执行)的作业信息。 -p 仅列出作业的进程组源头(process group leader)的进程ID。 -r 仅限于输出当前正在运行的作业。 -s 仅限于输出当前已停止运行的作业。 kill[-s sigspec|-n signum|-sigspec][pids|jobs] kill-l[sigspec|exit_status] 向指定的进程pids或作业jobs发送信号,从而终止相应的进程或作业。信号可以是一个数字代码 或信号名。其中,signum是一个信号代码,sigspec是一个信号名(如SIGKILL)或信号代码。如 果未指定信号,默认的信号是SIGTERM。利用“-l”选项,可以列出kill命令支持的所有信号或 指定的信号。 let expr[expr...] let命令用于计算算术表达式expr,多个表达式可以并列。let命令的返回状态以最后一个表达式为 准,如果最后一个表达式的计算结果为0,let命令返回1,否则返回0。 local[-aAfFilrtux][-p][name[=value]...] 定义一个或多个本地变量,同时为变量赋值。local命令的选项与declare命令中的选项意义完全 相同,这里不再做解释。注意,local命令只能在函数中使用。在函数中使用local命令时,表示 定义的变量仅限于当前函数及其子函数。如果未指定任何选项,local将会列出当前定义的所有本 地变量。 Logout 退出注册Shell。 mapfile[-n count][-O origin][-s count][-t][-u fd][array] readarray[-n count][-O origin][-s count][-t][-u fd][array] 从标准输入或文件描述符fd(如果指定了“-u”选项)读取数据行,赋予索引数组array。如果未 指定数组变量,使用MAPFILE变量的值作为默认的数组。可用的部分选项简述如下: -n 最多复制指定数量的数据行。如果count是0,复制所有的数据行。 -O 从指定的索引origin开始为数组赋值。默认的起始索引是0。 -s 扔掉读取的第一行计数数据。 -t 从读取的每个数据行中删除行尾的换行符。 -u 从指定的文件描述符fd而非标准输入读取数据行。 printf[-v var]format[args] 按照指定的格式,把给定参数的值写到标准输出。格式format是一个字符串,其中包括3种字符 对象:一为普通字符,可直接写到标准输出;二为转义字符序列,用于输出特殊字符;三为格式 规范,用于定义参数args的输出形式。“-v”选项表示把输出信息赋予指定的变量var而非写到 标准输出。必要时,格式定义可以循环重用,以满足所有参数的要求。如果格式定义多于提供的 参数,多余的格式定义对应的参数假定是0或空串。 pwd[-LP] 显示当前工作目录的绝对路径名,其作用等同于读取PWD变量的值。换言之,`pwd`命令替换的 结果等同于PWD变量的值。如果提供了“-P”选项,或使用“set-o”命令启用了Shell选项physical, 显示的路径名不包含符号链接。如果指定了“-L”选项,显示的路径名可以包含符号链接。 read[-ers][-a aname][-d delim][-i text][-n nchars][-N nchars][-p prompt][-t timeout][-u fd][names] 从标准输入(键盘)或指定的文件(参见“-u”选项)中逐行读取输入数据,把数据赋予给定的 变量。其中names是一个或一组变量,如果未指定names,read命令读取的数据行将会赋予REPLY 变量。第一个字赋予第一个变量,第二个字赋予第二个变量。多余的字(包括分隔符)赋予最后 一个变量。如果从输入流中读取的字数少于变量的个数,剩余的变量赋予空值。IFS变量定义的 字符用于分解读取的数据行,把数据行分拆成一系列独立的字。反斜线“\”可用于忽略随后读取 的下一个字符的特殊含义,或用作行延续符。read命令支持下列选项: -a aname 读取每个字段(字或字符串),依次赋予指定数组aname中的每个数组元素(数 组下标从0开始)。 -d delim 使用指定的分隔符取代默认的换行符,作为输入数据行的终止符。 -e 如果标准输入是终端,则使用readline获取数据行。readline使用当前或默认的行 编辑设置。 -i text 如果使用readline读取数据行,在开始编辑之前把text放置在编辑缓冲区中。 -n nchars 读取指定数量的字符后立即返回。这意味着只要输入 nchars 个字符,则无须按 下Enter键,read命令就会立即返回。但是,如果输入的字符数量少于nchars, 仍需按下Enter键,read命令才会响应。否则,read命令会一直处于等待状态。 -N nchars 读取恰好nchars个字符后立即返回,除非遇到EOF或超时。此时换行符等数据 行终止符不起任何作用,不会引起read命令返回,除非读取了nchars个字符。 -p prompt 首先利用标准错误输出显示一个提示字符串(无换行,光标停留在提示字符串最 后一个字符之后),然后等待用户输入。这个选项仅适用于从终端上交互输入数 据。 -r 忽略转义符号“\”的特殊意义,使之仅作为数据行中的一个普通字符处理。在此 情况下,不能使用反斜线作为行延续符。 -s 禁止显示输入的字符。可用于输入密码数据。 -t timeout 用于控制输入超时。如果在指定的时间(单位秒)内无法读取完整的输入数据 行,将会引起read命令超时,并返回一个错误信息。仅当读取的数据来自终端、 管道或其他特殊文件时,这个选项才有效(普通文件无效)。 -u fd 从指定的文件描述符fd读取输入数据。 readonly[-aApf][name[=word]...] 把指定的变量设置为只读变量,不允许随后赋值从而修改相应变量的值。如果试图修改相应的变 量,将会产生一个错误信息。如果指定了“-f”选项,相应的名字将被标记作函数。“-a”选项限 定相应的变量是一个索引数组变量。“-A”选项限定相应的变量是一个关联数组变量。如果未指 定名字参数或指定了“-p”选项,则显示所有的只读变量。“-p”选项表示以能够重用的格式显 示变量。如果紧随变量名的是“=word”,表示把word赋予变量。 return[n] 退出Shell函数,返回主程序的调用点,同时返回指定的值n。如果省略了n,返回函数体内最后 执行的一条命令的结束状态。在非Shell函数的情况下,如使用“.”或source命令执行脚本时, 其中的return命令相当于exit命令。在捕捉RETURN信号的情况下,一旦退出函数或脚本,立即 执行相关的处理动作。 set[-abBCeEfhHkmnpPtTuvx][-o option][args] set[+abBCeEfhHkmnpPtTuvx][+o option][args] 如果指定了任何选项option,可用于设置或清除相应的Shell属性。如果未指定任何选项,以能够 重用的命令格式列出每个Shell变量的当前设置,输出的变量按当前语言环境的字符集排序。在 POSIX模式,仅列出Shell变量。注意,不能使用set命令重设只读变量。选项后面的任何参数args 按位置参数的值处理,依次赋予位置变量$1,$2,...,$n。set命令的一个重要用途是重设位置参数(例 如,“set `cmd`”命令表示把命令cmd的输出赋予位置参数)。set命令支持的部分Shell选项简 述如下: -a 把定义或修改的变量与函数自动导入Shell运行环境。 -b 立即而不是在输出下一个主提示符之前显示已终止后台作业的状态。仅当启用了作业控制时 这个选项才有效。 -B 执行花括号扩展(默认)。 -C 如果设置了此选项,在使用“>”、“>&”或“<>”重定向符号创建输出文件时不会覆盖现 有的文件。但使用重定向符号“>|”替代“>”不受此限。 -e 如果一个管道命令、圆括号括住的子Shell命令,或花括号括住的一组命令中的任何一条命令 退出后返回非零的结束状态,立即终止Shell的执行。但是,如果失败的命令只是while或until 结构语句中命令组的一部分、紧跟if或elif关键字的测试部分、&&或||逻辑并列结构语句中的 任何命令部分(紧随最后一个&&或“||”的命令除外)、管道中的任何一个命令(最后一个 命令除外),或者命令的返回值加了否定符号“!”,Shell不会中止执行。如果已经设置,在退 出Shell之前执行捕捉ERR的trap语句。这个选项适用于当前的Shell环境,以及每个单独的子 Shell环境,而且有可能会在执行完子Shell中的所有命令之前引起退出子Shell。 -E 如果设置了此选项,可以继承Shell函数、命令替换或在子Shell环境中执行命令的任何ERR 信号捕捉操作(通常不能捕捉上述情况中的ERR信号)。 -f 禁用文件名的生成机制。 -h 在检索并执行命令时,记住命令的位置(默认的处理方式)。 -H 启用“!”类型的历史替换。在交互模式中,这个选项的默认设置是on(启用)。 -k 不仅是在同一命令行上位于命令前面的赋值语句,其他所有赋值语句形式的参数设置均置于 命令的环境中。 -m 监控模式(启用作业控制功能)。在交互Shell中,这个选项的默认设置为on。 -n 读取Shell脚本中的命令,检查其中是否存在语法错误,但不执行。交互Shell忽略这个选项。 -o 使用下列参数设置各种Shell选项(如果“-o”后面未加任何参数,显示当前选项的设置。如 果“+o”后面未加任何参数,显示可以重建当前选项设置的一系列set命令: allexport 等同于“-a”选项。 braceexpand 等同于“-B”选项。 emacs 使用emacs作为命令行编辑器。在交互Shell中,自动启用emacs作为默认的命 令行编辑器,除非调用Shell时指定了“--noediting”选项。注意,这也影响 “read-e”等命令使用的编辑界面。 errexit 等同于“-e”选项。 errtrace 等同于“-E”选项。 functrace 等同于“-T”选项。 hashall 等同于“-h”选项。 histexpand 等同于“-H”选项。 history 启用命令历史机制。在交互Shell环境中,这个选项的默认设置是on(启用)。 ignoreeof 其效果相当于把IGNOREEOF变量设置为10。参见“Shell变量”一节。 keyword 等同于“-k”选项。 monitor 等同于“-m”选项。 noclobber 防止标准输出(>)重定向覆盖现有的同名文件。一旦设置此选项,仅当使 用“>|”重定向符号时才能清除现有的文件。等同于“-C”选项。 noexec 等同于“-n”选项。 noglob 等同于“-f”选项。 nolog 不允许把函数定义写入命令历史文件中。 notify 等同于“-b”选项。 nounset 等同于“-u”选项。 onecmd 等同于“-t”选项。 physical 等同于“-P”选项。 pipefail 如果设置了此选项,管道的返回值是最后一个返回非 0 结束状态的命令的 返回值。否则,如果管道中的所有命令均成功地执行,其返回值是0。 posix 改变bash的默认处理行为,使其符合POSIX标准。 privileged 等同于“-p”选项。 verbose 等同于“-v”选项。 vi 使用vi/vim作为命令行编辑器。在vi/vim命令行编辑环境中,一开始总是处于 命令模式。注意,这也影响“read-e”等命令使用的编辑界面。 xtrace 等同于“-x”选项。 -p 启用特权模式。在此模式下,禁止执行BASH_ENV或ENV变量指定的文件,也禁止继承 运行环境中的Shell函数,不管存在与否,忽略运行环境中的SHELLOPTS、BASHOPTS、 CDPATH和GLOBIGNORE变量。在启动Shell时,如果有效用户ID不等于真实用户ID, 而且也未指定“-p”选项,把有效用户ID设置成真实用户ID。如果指定了“-p”选项,无 须重置有效用户ID。禁用特权模式时需要把有效用户ID和用户组ID分别设置成真实用户 ID和用户组ID。 -P 如果设置了此选项,在运行诸如改换当前工作目录的cd命令时,bash不会引申解释符号链接 文件,即不会使用其引用的目录,而是直接使用本身表示的目录结构。通常,在使用cd命令 改换当前目录时,bash会采用符号链接文件引用的目录。 -t 读入并执行一条命令之后立即退出。 -T 如果设置了此选项,可以继承Shell函数、命令替换或在子Shell环境中执行命令的任何 DEBUG与RETURN信号捕捉操作(通常不能捕捉上述情况中的DEBUG与RETURN信 号)。 -u 执行变量替换时,事先未设置的变量或参数(特殊参数“$@”与“$*”除外)按错误处理。 -v 显示Shell读入的命令行。 -x 显示PS4变量的值,然后在同一行上显示执行的命令及其参数。 - 表示选项到此结束,余下的所有命令参数赋予位置参数。关闭“-x”和“-v”选项。如果不 存在多余的命令参数,位置参数保持不变。 -- 如果这个选项后面没有任何命令参数args,清除位置参数的设置。重新设置位置参数,否则, 使用命令参数args设置位置参数(即使命令参数前面存在一个连字符“-”)。 除非特别说明,上述选项的默认状态均为禁用或关闭状态(off)。使用“+”替代“-”可以关闭 相应的Shell选项。set命令支持的选项也是bash命令本身支持的选项,可以在调用bash时直接 指定。利用特殊变量“$-”,可以查询上述Shell选项的当前设置。 shift[n] 用于重设位置参数。如果省略了n,n的默认值是1,表示把位置参数$2,$3,…,$N依次重新 命名为$1,$2,…,$N-1,原来的$1和$N不复存在,位置参数总数相应地减1,故新的“$#”变 量值也比原来的“$#”变量值少1。注意,n必须是一个小于或等于“$#”的正整数。如果n等于 0或大于“$#”,则位置参数不发生任何变化。 shopt[-pqsu][-o][optnames] 用于启用或禁用Shell选项,设置Shell选项的开关状态,控制Shell的处理方式。如果未指定任 何选项,显示用户能够设置的Shell选项及其开关状态。shopt支持的选项如下: -o 仅限于显示set内置命令“-o”选项中能够定义的Shell选项的值。 -p 以能够重用的命令格式列出可以设置的Shell选项。 -q 采用安静输出模式,压缩常规的输出信息。返回值表示指定的选项optnames是否设置或取 消。如果同时指定了多个选项,且所有的选项均已启用,返回值为0,否则返回非0。 -s 启用相应的Shell选项。 -u 禁用相应的Shell选项。 如果指定了“-s”或“-u”选项,但未给定 optnames 参数,仅限于显示已经启用或禁用的Shell 选项。除非特别说明,shopt命令能够设置的Shell选项通常都是禁用或关闭的。 利用shopt命令可以设置的部分重要Shell选项如下: autocd 设置此选项后,如果指定的命令名也是一个目录名,按cd命令执行,就像给定 的名字是cd命令的目录参数一样。这个选项仅适用于交互Shell。 cdable_vars 如果设置了此选项,且cd内置命令的参数不是一个目录,则假定给定的参数是 一个变量,其变量值是需要改换到的目录。 cdspell 如果设置了此选项,bash能够在cd命令中的目录参数出现轻微拼写错误时自动 予以校正。这种拼写错误包括字符位置互换、遗漏字符或字符重复等。如果校正 出现,在显示正确的目录名之后继续执行命令。这个选项仅适用于交互Shell。 checkhash 如果设置了此选项,在尝试执行之前,bash首先会检测散列表中是否存在指定的 命令。如果散列表中不存在,按照常规的命令检索路径检索命令。 checkjobs 如果设置了此选项,在退出交互Shell时,bash将会列出已停止运行和当前正在 运行的任何作业的状态。如果当前存在正在运行的任何作业,将引起Shell延缓 退出,直至连续发布第二个退出命令(exit命令或Ctrl-D组合键),参见“作业 控制”一节。如果存在停止运行的任何作业,Shell总是延缓退出。 checkwinsize 如果设置了此选项,bash将会在运行每个命令之后检测终端窗口的大小,必要时 更新LINES与COLUMNS变量的值。 cmdhist 如果设置了这个Shell选项,bash将尝试把一个多行的命令作为单个命令行保存 到命令历史文件中,以便于用户重新编辑多行命令。cmdhist的默认设置为on。 dotglob 如果设置了此选项,在生成文件名时,生成后可以包含首字符为“.”的隐藏文件 名。 execfail 设置此选项后,如果无法执行作为参数提交给exec内置命令执行的指定脚本文 件,非交互Shell不会终止运行。如果exec失败,交互Shell也不会终止运行。 expand_aliases 如果设置了此选项,可以按照“命令别名”一节所述执行命令别名替换。交互Shell 会自动启用此选项。 extglob 如果设置了此选项,表示启用扩充的模式匹配特性,参见“文件名生成”一节。 extquote 如果设置了此选项,在加双引号的"${parameter}"替换形式中执行$'string'与 $"string"引用。这个选项通常是自动启用的。 failglob 如果设置了此选项,在文件名生成期间无法匹配文件名的模式将会导致生成错 误。 globstar 如果设置了此选项,文件名生成中使用的模式“**”能够匹配文件和0个或多个 目录与子目录。如果模式“**”后面是“/”,则只能匹配目录与子目录。 histappend 如果设置了此选项,当退出Shell时,bash将会把缓冲区中的命令历史记录附加 到HISTFILE变量指定的文件中,而不是覆盖文件。histappend的默认设置为off。 histreedit 如果设置了此选项,且使用readline处理输入,用户有机会重新编辑失败的命令 历史替换。 histverify 如果设置了此选项,且使用readline处理输入,命令历史替换的结果并不是立即 送交Shell解析,相反,只是把替换结果加载到readline编辑缓冲区,以便做进一 步的修改。 huponexit 如果设置了此选项,当退出交互式的注册Shell时,bash将会向所有的作业发送 SIGHUP信号。huponexit的默认设置为off。 interactive_comments 如果设置了此选项,在交互Shell中,忽略以“#”作为行首字符的单字或数据行, 参见“注释”一节。通常启用此选项。 lithist 如果设置了此选项且启用了cmdhist选项,保存到命令历史的多行命令将会尽可 能地嵌入换行符而不使用分号分隔符。 nocaseglob 如果设置了此选项,在执行文件名生成期间,bash在匹配文件名时不区分大小写 字母,参见“文件名生成”一节。 nocasematch 如果设置了此选项,bash在执行case和“[[”命令中的条件测试与模式匹配时不 区分大小写字母。 promptvars 如果设置了此选项,在显示命令提示符之前,提示字符串需要执行参数替换、命 令替换、算术计算替换以及删除引用符号,参见“提示符”一节的说明。这个选 项是自动启用的。 shift_verbose 如果设置了此选项,当shift内置命令的执行次数(或其参数n)超过了位置参数 的数量时,shift命令将会输出一条错误信息。 sourcepath 如果设置了此选项(默认),“.”或source内置命令将会在PATH变量值指定 的目录中检索其参数文件(即脚本文件)。sourcepath的默认设置为on。 xpg_echo 如果设置了此选项,echo内置命令将总是解释转义字符序列。 suspend[-f] 挂起当前Shell的执行直至收到一个SIGCONT信号。“-f”选项可用于强制执行挂起操作。注意, 不能挂起注册Shell。 test expr [expr] 取决于表达式expr的计算结果,返回0或1。表达式expr由基本的条件表达式组成,“参见条件 表达式”一节。除了表达式,test内置命令不接受任何选项与参数。 使用下列运算符(按照优先级的降序列出)可以把若干表达式组合成一个逻辑表达式: !expr 如果表达式expr的计算结果为假(1)返回真(0)。 (expr) 返回表达式expr的值。可用于修改运算符的优先顺序。 expr1-a expr2 如果表达式expr1与expr2均为真(0),返回真(0)。 expr1-o expr2 如果表达式expr1或expr2为真(0),返回真(0)。 times 测量Shell或进程运行期间用户与系统模式累计占用的CPU时间。 trap[-lp][[cmds]sigs] trap命令主要用于信号的捕捉与处理。当收到指定的信号sigs时,Shell将会读入并执行指定的命 令cmds。如果cmds不存在或为“-”,但指定了信号,则把指定的每个信号恢复到初始设置。如 果命令cmds是一个空串(使用引号保留其位置),则Shell或调用的命令将会忽略指定的信号sigs。 如果cmds不存在,但指定了“-p”选项,则显示与每个指定信号有关的trap命令。如果未提供任 何选项与参数,或者仅指定了“-p”选项,则显示每个已设定信号关联的trap命令。“-l”选项用 于列出系统支持的一组信号名及相应的信号值。sigs 参数既可以是信号名,也可以是信号值。信 号名不区分大小写字母,且SIG前缀是选用的,可以省略。如果sigs是EXIT(0),每当退出Shell 时立即执行cmds命令。如果sigs是DEBUG,在执行每个简单命令、for命令、case命令、select 命令、计算命令及Shell函数中的第一个命令之前执行cmds命令。如果sigs是RETURN,每当调 用Shell函数或使用“.”及source命令运行脚本结束时,执行cmds命令。如果sigs是ERR,无 论何时,如果简单命令异常结束,立即执行cmds命令。如果失败的命令是while或until循环语 句中命令组的一部分,是if语句中测试条件的一部分,或者是“&&”或“||”逻辑并列语句中的 部分命令,不执行ERR信号捕捉处理。参见set内置命令中的“-o errexit”选项。 type[-aftpP]names 如果未指定任何选项,type命令的输出结果说明了Shell是如何解释每个指定命令的,如显示命令 的完整路径名。如果指定了“-t”选项,且指定的命令名是一个命令别名、Shell保留字、函数、 内置命令或磁盘文件,type命令将会分别显示alias、keyword、function、builtin或file等字样或有 关信息之一。如果未发现指定的命令名字,type命令不会显示任何信息,只是返回一个false的结 束状态。如果指定了“-p”选项,type命令或者返回可执行的磁盘文件名(如果其文件名匹配指 定的命令名),或者不返回任何信息(如果“type-t name”命令无法返回文件)。“-P”选项强 制使用PATH变量定义的命令检索路径检索每一个参数,即使“type-t name”不会返回文件。如 果命令位于散列表中,“-p”与“-P”选项将会输出散列的值,而非出现在PATH变量定义的第 一个目录中的文件。如果指定了“-a”选项,type将显示包含指定名字的可执行文件的所有位置。 当且仅当未指定“-p”选项时,输出结果也包括命令别名和函数。如果指定了“-a”选项,则不 会查询命令散列表。“-f”选项表示禁止检索Shell函数。 ulimit[-HSabcdefilmnpqrstTuvx[limits]] 用于设置或显示Shell及用户进程的资源限制。资源限制的值可以是一个数字,也可以是一个特殊 的文字值hard(表示硬性限制)、soft(软性限制)或unlimited(没有限制)。“-H”与“-S”选项 分别用于指定硬性限制和软性限制。一旦设置,普通用户不能增加硬性限制值,但可以增加软性 限制值,直至达到硬性限制值。如果“-H”或“-S”选项均未指定,表示同时设置软硬性限制。 如果省略了limits,则显示软性资源限制的当前值,除非指定了“-H”选项。如果指定了多个资源, 则按限制的资源名、单位和当前值的形式显示指定的资源。其他选项的意义说明如下(其中“-f” 为默认的选项): -a 显示当前所有的资源限制。 -b 套接字缓冲区的最大容量限制。 -c 显示内存映像转储文件(core)的最大容量限制(1KB数据块)。 -d 进程可用数据段的最大容量限制(KB)。 -e 可用优先级调整值的最大值。 -f Shell及其子进程新建文件的最大容量限制(1KB数据块)。 -i 待处理信号的最大数量限制。 -l 能够封锁的最大内存容量限制(KB)。 -m 可用驻留内存的最大容量限制(KB)。 -n 可用文件描述符的最大数量限制。 -p 管道大小的容量限制(512字节的数据块)。 -q POSIX消息队列的最大字节数。 -r 最大的实时调度优先级。 -s 可用栈空间的最大容量限制(KB)。 -t 每个进程可用的最大CPU时间量限制(秒)。 -T 最大的线程数量限制。 -u 单个用户可用的最大进程数量限制。 -v Shell可用虚拟内存的最大数量限制(KB)。 -x 文件锁的最大数量限制。 如果给出了参数limits,则表示使用新的数值设置指定的资源。如果未指定任何选项,则“-f”是 默认的选项。除了“-t”选项(单位秒)、“-p”选项(单位是512字节的数据块),以及“-T”、 “-b”、“-n”与“-u”选项之外,其他所有数值的单位都是1024字节。 umask[-p][-S][mode] 设置创建文件时使用的默认文件访问权限。如果mode以数字开始,按八进制的数值解释,否则 按chmod命令能够接受的符号名解释mode表示的访问权限。如果省略了参数mode,显示文件访 问权限屏蔽位的当前设置。“-S”选项表示按符号名的形式显示文件访问权限屏蔽位的当前设置。 默认的输出是一个八进制的数值。如果指定了“-p”选项,忽略mode,以能够重用的形式显示文 件访问权限屏蔽位的当前设置。 unalias[-a][names] 删除已定义的命令别名。如果指定了“-a”选项,意味着撤销当前已定义的所有命令别名。 unset[-fv][names] 删除指定的变量或函数。如果未指定任何选项,或指定的选项为“-v”,则表示指定的参数names 是变量。如果指定的选项为“-f”,表示指定的参数names是函数。注意,这个命令并不影响只 读变量。 wait[n...] 等待指定的进程或作业结束,返回其结束状态。其中n可以是进程ID或作业号。必要时,可以 同时指定多个进程ID或作业号,中间加空格分隔符。如果未指定进程ID或作业号,意味着等待 当前活动的所有子进程结束运行。例如,“wait %1”意味着等待作业号为 1 的后台作业运行结 束。“wait 6618”意味着等待进程ID为6618的进程运行终止。
限制的Shell
如果启动bash时使用的名字是rbash,或在启动bash指定了“-r”选项,bash就会成为受限制的Shell。限制的Shell用于提供一个严格控制的Shell环境。实际上,除了施加下列限制之外,限制的Shell基本上等同于标准的bash:
● 不能使用cd改换目录。
● 不能设置或清除SHELL、PATH、ENV或BASH_ENV变量的值。
● 指定的命令名不能含有斜线字符“/”。
● 不能在“.”内置命令中指定含有“/”的文件名参数。
● 不能在hash内置命令的“-p”选项中指定含有“/”的文件名参数。
● 启动时不能从Shell环境中导入函数定义。
● 启动时不能从Shell环境中解析SHELLOPTS变量的值。
● 不能使用重定向符号“>”、“>|”、“<>”、“>&”、“&>”和“>>”重定向命令的输出。
● 不能利用exec内置命令达到使用其他命令替代Shell的目的。
● 不能使用“-f”或“-d”选项增加或删除内置命令,进而启用内置命令。
● 不能使用内置命令enable启用已经禁用的内置命令。
● 不能在command内置命令中指定“-p”选项。
● 不能使用“set +r”或“set +o restricted”命令关闭限制模式。
上述限制是在读取任何启动文件之后强制实施的。当执行的命令是一个Shell脚本时,rbash将会调用bash执行脚本,取消Shell的任何限制。
bc——任意精度的算术运算语言
语法格式
bc [-ilqsw] [files] bc [-h|--help] [-v|--version]
命令简介
bc是一种解释语言,支持任意精度的数值计算,既可以交互运行,也可以采用批处理的方式运行脚本。其中,files是由bc语句组成的一个或一组脚本文件。
在交互运行模式中(未指定 files 参数)没有任何提示符,可以直接输入算术运算表达式,按下Enter键之后即可获得计算结果。类似于bash,bc命令本身也支持行编辑功能,利用上下箭头键可以调出先前输入的表达式,使用左右箭头键可以移动光标,使用空格和Delete键可以删除字符等。当需要退出bc命令时可输入quit命令,或按下Ctrl-C组合键终止bc命令的执行(也可以使用Ctrl-C组合键终止以批处理方式运行的bc命令)。
bc采用类似于C语言的语法,但语句非常简单。利用命令行选项可以选用标准的数学库函数。如果需要,可在处理任何文件之前定义数学库函数(参见“-l”选项)。一经开始,bc首先会依序处理命令行上的所有文件中的代码。在处理完所有文件之后,bc开始读取标准输入(除非某个文件中含有终止bc执行的命令),处理读入的所有代码。
注意,这里介绍的bc命令包含若干扩充的特性,超出了bc的传统实现与POSIX草案标准。在命令行中增加“-w”选项之后,如果使用的特性属于扩充部分,bc命令将会输出警告或拒绝接受(如果当前的版本不支持)信息。
命令选项
-i,--interactive 强制进入交互模式。 -l,--mathlib 指定标准的数学库。 -q,--quiet 禁止显示常规的GNU欢迎信息。 -s,--standard 严格按照POSIX的标准运行bc。 -w,--warn 遇到POSIX标准的扩展特性时显示警告信息。
数值
在bc中,最基本的元素是数值,包括整数部分和小数部分,数值可以是任意精度的。所有的数值均采用十进制数值表示,计算也是如此。数值具有两种属性:长度和精度。长度指的是数值全部有效数字的位数,精度是小数点后面所有数字的位数。例如,数值.000001 的长度为6,精度也为6,1935.000 的长度为7,精度为3。
变量
变量是一种命名的存储单元,用于存储数值或引用其中的数值。变量分为普通变量和数组变量。变量名以字母开始,后面可以跟有任意数量的字母、数字和下画线。所有的字母必须是小写字母。数组变量后面附加一对方括号。方括号中的表达式是数组的下标或索引。
一个简单的变量只是一个标识符:
name
而数组变量具有下列形式:
name[expr]
bc具有4 个特殊的变量:scale、ibase、obase和last。scale定义了某些运算怎样确定小数点后面的位数,其默认值是0。ibas和obase定义了转换输入和输出数值的进位制,默认的进位制是十。last含有最近一次输出的数值。上述4个变量均可赋予必要的值,也可以用于表达式。
注释
在bc语言中,注释以“/*”字符开始,直至“*/”字符结束。注释可以出现在任何位置,但不能影响其他元素的解析。注释中可以含有换行符,即以多行形式存在。
为了支持脚本,bc也支持单行注释。单行注释以“#”字符开始,直至遇到换行符。但换行符并非单行注释的一部分。
表达式
bc语言的基本组成单位是表达式和语句。bc语言是交互式的,没有“主程序”的概念,除了函数定义之外,表达式或语句的输入一结束(如遇到行终止符),立即解释执行。
最简单的表达式是一个常数。按照ibase变量设定的进位制,bc把输入的常数转换成内部的数据表示。ibase变量的合法取值是2~16,因此,输入的数字可以包含字符0~9与A~F(必须是大写字母,小写字母用于变量名)。
类似于其他许多高级语言,完整的表达式由变量、常数和运算符等组成。不同的是,bc仅支持一种数据类型——数值。
每个表达式都具有一定的精度。表达式的精度取决于初始的常数值、变量值,以及执行的运算。合法的精度是0至C语言整型数能够表示的最大数值。
下面是bc支持的各种表达式(其中,expr是任何一种表达式,var是一个简单变量或数组变量,除非特别指定,计算结果的精度是表达式蕴含的最大精度):
-expr 表达式的值是计算结果的负值。 ++var 在变量值的基础上加 1,然后再把计算结果赋予变量。表达式的值是计算后的结 果。 --var 从变量的值中减1,然后再把计算结果赋予变量。表达式的值是计算后的结果。 var++ 表达式的值是变量的当前值。然后再在变量值的基础上加 1,把计算结果赋予变 量。 var-- 表达式的值是变量的当前值。然后再从变量的值中减1,把计算结果赋予变量。 expr1+expr2 两个表达式的和。 expr1-expr2 两个表达式的差。 expr1*expr2 两个表达式的积。 expr1/expr2 两个表达式的商。计算结果的精度是scale变量值表示的精度。 expr1 % expr2 表达式的计算结果是第一个表达式整除以第二个表达式后的余数。例如,为了 计算a%b,首先计算a/b,取其整数部分。最终的计算结果等于a-(a/b)*b。 expr1^expr2 表达式的计算结果是expr1的expr2次方。第二个表达式expr2必须是一个整数。 (expr) 修改标准的优先顺序,强制计算圆括号内的表达式。 var=expr 把表达式的计算结果值赋予变量。 varop=expr 等价于“var=varopexpr”,表示把变量的值与表达式的计算结果经过op运算 后赋予变量,其中op是“+”、“-”、“*”、“/”、“%”或“^”等运算符 之一。注意,bc也支持=+、=-、=*、=/、=%和=^等风格的赋值运算符。
关系表达式是一种特殊的表达式,其计算结果总是0或1。如果关系为假,计算结果就是0;如果关系为真,计算结果就是1。有效的关系运算符如下:
expr1<expr2 如果表达式expr1小于表达式expr2,计算结果为1。 expr1<=expr2 如果表达式expr1小于等于表达式expr2,计算结果为1。 expr1>expr2 如果表达式expr1大于表达式expr2,计算结果为1。 expr1>=expr2 如果表达式expr1大于等于表达式expr2,计算结果为1。 expr1==exp r2 如果表达式expr1等于表达式expr2,计算结果为1。 expr1!=expr2 如果表达式expr1不等于表达式expr2,计算结果为1。
布尔运算也是合法的。如同关系表达式,所有布尔运算的结果均为1或0,分别对应于真或假。布尔运算符如下:
!expr 如果表达式是0,计算结果为1。 expr1&&expr2 如果两个表达式均为非0,计算结果是1。 expr1||expr2 如果任何一个表达式为非0,计算结果是1。
计算表达式的优先顺序如下(从最低到最高):
● “||”逻辑或运算符,从左到右。
● “&&”逻辑与运算符,从左到右。
● “!”逻辑非运算符。
● 关系运算符,从左到右。
● 赋值运算符。
● “+”和“-”运算符,从左到右。
● “*”、“/”和“%”运算符,从左到右。
● “^”运算符。
● “-”一元运算符。
● “++”和“--”运算符。
注意,在处理关系运算符、逻辑运算符和赋值运算符时,一定要注意其优先顺序,以免出现意外的结果。
作为一种特殊的表达式,bc提供一组标准的函数。可以在语句、表达式或用户定义的函数中使用。 length(expr) 函数的值是表达式有效数字的位数。 read() 不管出现在何处,其功能是从标准输入读取一个数值。read函数的值是从标准输 入读取的一系列数字利用ibase变量的当前值作为进位制转换后的结果。 scale(expr) 函数的值是表达式计算结果的小数点后面数字的位数。 sqrt(expr) 函数的值是表达式的平方根。如果表达式是一个负数,将会产生运行时错误。
语句
如同大多数代数语言一样,bc语句提供一种表达式的顺序计算方法。bc是一种解释语言,当遇到换行符,已经读取一个或多个完整的语句时,立即开始执行。在bc中,由于表达式是立即解释执行的,换行符的使用是非常重要的。如果位置不当,将会引起语法错误。事实上,分号“;”与换行符均用作语句的分隔符。下面是bc支持的各种语句,其中,statement-list是由一系列语句组成的语句组,之间加分号或换行符分隔符。方括号“[ ]”表示其中的语句部分是选用的。
expression 表达式也是一种语句,具有两个功能:如果表达式以变量名加等号开始,则按 赋值语句处理;如果表达式并非赋值语句,则计算表达式并输出其结果。在输 出计算结果值之后,再输出一个换行符。例如,“a=1”是赋值语句,而 “(a=1)”则是一个具有内置赋值语句的表达式。输出的所有数值均按obase变量 指定的进位制计算。obase变量的合法取值是2~999(BC_BASE_MAX),但通 常很少使用大于16的进位制。 string 输出的字符串。字符串是从第一个双引号开始直至下一个双引号之间的所有字符。 其中的所有字符,包括换行符,均按其字义处理。字符串之后也不输出换行符。 print list print语句提供另外一种输出方法。其中的参数list是一组字符串或表达式,中间 以逗号“,”为分隔符。每个字符串或表达式均按其位置顺序依次输出。最后没 有换行符输出。表达式计算后即输出其结果,然后把这个数值赋予last变量。语 句中的字符串直接输出,其中可以包含以反斜线为起始字符的特殊字符,bc认 可的特殊字符是“\a”(警示音)、“\b”(退格符)、“\f”(换页符)、“\n” (换行符)、“\r”(回车)、“\q”(双引号)、“\t”(制表符)和“\\”(反 斜线)。反斜线后的其他任何字符忽略之。 {statement-list} 组合语句。允许把多个语句组合在一起执行。 if(expr)statement-list1[else statement-list2] if语句首先计算表达式,然后根据表达式的值决定执行 statement-list1 或 statement-list2。如果表达式的计算结果非 0,则执行 statement-list1。如果 statement-list2存在,且表达式的计算结果为0,则执行statement-list2。 while(expr)statement-list while语句用于循环执行一组语句。每次在开始执行语句之前,while首先要计算 表达式。如果表达式的计算结果非0,则执行语句;如果表达式的计算结果为0, 或中间执行了break语句,将终止while循环。 for([expr1];[expr2];[expr3])statement-list for语句用于控制循环执行的一组语句。在开始循环之前,首先计算表达式 expr1。在每组语句之前,计算表达式expr2。如果计算结果非 0,则执行循环体 中的语句;如果计算结果为 0,循环终止。每执行一次循环体中的语句之后,且 在重新计算表达式expr2之前,计算一次表达式expr3。如果表达式expr1或expr3 省略,在其应该计算之处也忽略之。如果表达式expr2也省略,其默认值为1, 表示无限循环。for语句可以表述为下列等价的while语句: expr1; while(expr2){ statement-list; expr3; } break break语句用于强制退出最近一层的while或for循环语句。 continue continue语句用于中止最近一层for语句的当前循环,转而开始执行下一轮循 环。 halt halt语句用于退出bc。 return 从函数中返回数值0。参见下面的函数介绍。 return(expr) 从函数中返回表达式的值。注意,圆括号并非必需的。
伪语句
伪语句并非传统意义上的语句,原则上不能执行(在交互运行环境中实际上是可以执行的)。 limits 显示当前bc版本的限制。 quit 退出并终止bc的执行。 warranty 显示软件的保修信息。
函数
函数提供了一种方法,用于实现自定义的算法,以便在以后调用。bc中的函数总是计算出一个数值并返回调用者。一个函数可以定义如下(花括号的位置是任意的):
define name(parameters){statement-list;}
或
define name(parameters){ auto-list; statement-list;}
调用函数时只需给出“name(parameters)”形式的表达式即可。其中的参数可以是零个、一个或一组数值(或数组)。在函数定义中需要列出形式参数的名字,多个参数中间需加逗号分隔符。所有的参数都是数值参数,按值调用。如果参数是数组,可以使用“name[]”形式表示。数组也是按值调用的。
在调用函数时,实际参数是一个数字表达式。如果实际参数是一个数组,调用时应采用与形式参数相同的表达方式。由于函数的定义是动态的,仅当调用函数时才检测参数的数量与类型。不管是数量还是类型,任何不匹配都会引起运行时错误。调用未定义的函数也会导致运行时错误。
auto-list 是一组选用的变量,仅限于函数“本地”使用。如果存在,auto-list 的语法格式具有“auto name,...;”形式,其中每个name是变量的名字,分号是选用的。数组的名字可与数组参数同名。auto变量不同于传统的本地变量,当函数a调用函数b时,函数b可以使用相同的名字,直接访问函数a中的auto变量,除非函数b定义了同名的auto变量。由于auto变量和参数在调用时即置于栈中,故bc支持递归的函数调用。
statement-list是函数体中的一系列bc语句。同样,语句之间需加分号或换行符分隔符。return语句引起函数的终止执行,同时返回一个数值。return语句具有两种形式:“return(expression)”表示计算表达式的值,然后返回其计算结果。return是“return (0)”的缩写形式,仅返回一个数值0。如果省略了return语句,蕴含着函数体最后存在一个“return (0)”语句。
在函数中,可以重新定义ibase变量。在调用函数时,函数体中的所有常数均按新的ibase变量值进行转换。但是,如果函数中用到标准函数read,read函数总是以函数外部ibase变量的当前值为准,不受函数中ibase变量的影响。下面是一个采用递归方式求取阶乘的函数。
define f (x) { if (x <= 1) return (1); return (f(x-1) * x); }
函数也可以定义为void类型,void类型的函数不返回任何数值,因而不能用于需要数值的位置。关键字void位于关键字define与函数名之间。
数学库函数
如果运行bc时指定了“-l”选项,将会预先加载一个标准数学库函数。数学库函数将按照调用函数时已设定的精度输出计算结果,默认的精度(scale)是20。数学库函数定义了下列函数:
s(x) 求取x的正弦值,x的单位是弧度。 c(x) 求取x的余弦值,x的单位是弧度。 a(x) 求取x的余切值,x的单位是弧度。 l(x) 求取x的自然对数。 e(x) 求取e的x次方。 j(n,x) 贝塞尔(Bessel)函数。其中,n为函数的阶数,x为函数的自变量。
应用实例
1.采用交互方式直接运行bc,计算各种表达式。
$ bc
…
100+100
200
quit
$
2.使用标准的数学库函数进行计算。
$ bc -l … e(2) 7.38905609893065022723 quit $
bzip2, bunzip2——采用数据块排序方法的文件压缩工具
bzcat——显示压缩的文件
bzip2recover——恢复已损bzip2压缩文件中的数据
语法格式
bzip2 [-cdfkqstvz123456789] [files] bunzip2 [-fksv] [files] bzcat [-s] [files] bzip2recover file bzip2 [-h|--help] [-L|--license] [-V|--version]
命令简介
bzip2命令采用Burrows-Wheeler数据块排序文本压缩算法与Huffman编码压缩指定的文件。其压缩效果通常好于基于LZ77/LZ78算法的压缩工具,性能接近于PPM系列的统计压缩工具。
其中,files是一个或多个文件。如果未指定文件名参数,bzip2将会压缩来自标准输入的数据,把压缩后的结果写到标准输出,但会拒绝把压缩数据写到终端,因为这是完全无法理解的,也是没有意义的,除非重定向到一个文件。在第四种语法格式中,file是已受损的压缩文件。
bzip2的命令行选项非常类似于GNU gzip,但两者并不相同。
bzip2依次压缩命令行中指定的每个文件,然后使用压缩后的文件替换每一个初始文件,压缩文件以初始文件名加“.bz2”后缀(original.bz2)命名。每个压缩文件与相应的初始文件具有相同的修改时间与访问权限,同时尽可能保持相同的文件属主等属性。确保在解压文件时能够正确地恢复上述各种文件属性。
通常,bzip2与bunzip2命令不会覆盖现有的文件。如果需要覆盖现有的文件,可以在命令行中指定“-f”选项。
bunzip2或“bzip2-d”命令用于解压指定的所有文件。如果指定的文件并非bzip2命令创建的,bunzip2或“bzip2-d”命令不会处理,但会输出一条忽略相应文件的错误信息。通常,bzip2将会按照下列方式命名压缩文件解压后的文件名:
filename.bz2 filename filename.bz filename filename.tbz2 filename.tar filename.tbz filename.tar othername othername.out
如果文件的后缀并非.bz2、.bz、.tbz2或.tbz等能够识别的扩展名之一,则bzip2使用初始的文件名加.out后缀作为文件名参数。
bzcat或“bzip2-dc”命令将会解压指定的所有文件,把解压结果写到标准输出。
在开始压缩或解压之前,bzip2将会依次从BZIP2与BZIP环境变量中读取命令选项及其参数。在读取任何命令行选项及其参数之前,首先处理环境变量预定义的选项及其参数。这种机制为用户使用默认选项及其参数提供了方便。
即使压缩后的文件稍微大于压缩前的文件,压缩也总是执行。如果文件小于100字节,压缩后的文件肯定大于压缩前的文件,因为压缩算法通常需要有一个约50字节的常规开销。
作为一种自检与保护机制,bzip2使用32位的CRC校验和,确保压缩后的文件等同于初始的文件,保护压缩后的数据不致受损。压缩后数据受损的机会微乎其微,其概率是40亿分之一。尽管如此,bzip2解压时仍会做必要的检测。如果压缩文件已经受损,可以使用bzip2recover命令尝试恢复已受损的压缩文件中的数据。
bzip2以数据块为单位压缩文件,每个数据块通常为900KB,独立处理。如果因介质或传输错误等原因导致压缩文件受损,可以从未受损的数据块中恢复部分数据。
bzip2recover命令用于检索压缩文件中的每一个数据块,把抽取的每个数据块写到rec00001file.bz2、rec00002file.bz2等一系列单独的文件中。其中,file是压缩文件去掉“.bz2”后缀的文件名。
最后,利用“bzip2-dc rec*file.bz2>recovered-data”命令,可以按照正确的顺序,把恢复后的数据块连接到一起,形成一个文件。
命令选项
-c,--stdout 把压缩或解压结果写到标准输出。采用这种方式可以同时压缩或解压多个文件, 把压缩或解压结果连续地写到标准输出。 -d,--decompress 强制解压模式。bzip2、bunzip2和bzcat实为同一个程序,至于究竟采取什么处理 动作,取决于使用的是哪一个名字。这个选项强制bzip2解压指定的文件。 -f,--force 强制覆盖输出文件,或强制删除现有的文件。通常,bzip2 不会覆盖现有的同名 文件,除非指定了“-f”选项。而且,bzip2 拒绝解压魔术(magic)代码不正确 的文件。但是,如果指定了“-f”选项,bzip2将会不加修改地复制这样的文件(这 也是GNU gzip的处理方式)。 -k,--keep 在压缩或解压文件时,保持输入文件不变(即不删除输入文件)。 -q,--quiet 禁止输出不重要的警示信息。但不限制输出I/O错误或其他严重事件之类的信 息。 -s,--small 在压缩、解压或检测期间,减少内存的使用。 -t,--test 检测指定文件的完整性而不执行解压动作。这仅仅是一个试解压过程,最终会 扔掉解压结果。 -v,--verbose 详细显示模式。显示正在处理的每个文件的压缩率。同时增加了输出数据的详 细程度,其主要目的是输出大量的信息供诊断使用。 -z,--compress 强制压缩模式。与“-d”选项相反,不管调用哪一个名字,均强制执行压缩动作。 -1(--fast) ~ -9(--best) 设置压缩时使用的数据块的大小,其中“-1”至“-9”分别表示100KB至900KB。 注意,这些选项对解压没有任何影响。“--fast”与“--best”选项主要是为保持与 GNU gzip兼容而保留的别名。尤其是“--fast”选项并不意味着压缩速度更快, “--best”选项也只是选择默认的处理方式而已。 -- 选项终止标志。表示此后的任何参数均作为文件名处理,即使其首字符为“-”。 主要用于处理文件名的首字符为“-”的文件。例如,“bzip2---filename”。
应用实例
1.压缩指定的文件,观察文件的压缩比等信息。
$ bzip2 -v test1 test2 nmap: 3.549:1, 2.254 bits/byte, 71.82% saved, 162458 in, 45780 out. tcpdump: 3.147:1, 2.542 bits/byte, 68.22% saved, 55967 in, 17787 out. $
2. 检测压缩文件的完整性。
$ bunzip2 -tv nmap.bz2 tcpdump.bz2 nmap.bz2: ok tcpdump.bz2: ok $