命令历史

当使用“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而言,此即命令名本身。
            nn个单字。
            ^        第一个参数,即第一个单字。
            $        最后一个参数。
            %        最近的“?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。如果分界符“/”是最后一
                            个字符,可以省略。此外,可以使用任何分界符替代“/”。如果oldnew本身
                            也含有分界符,可以加转义符号。如果“&”出现在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]
            用于显示、编辑或重复执行命令历史缓冲区中的命令。在第一种语法格式中,从命令历史记录中
            选择firstlast指定范围的命令。指定的firstlast可以是一个数字(在命令历史记录中的索引,
            其中负数表示相对于当前命令序号的偏移值)或一个字符串(用于匹配和定位最近执行的命令)。
            如果未指定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]
            用于重设位置参数。如果省略了nn的默认值是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    如果表达式expr1expr2均为真(0),返回真(0)。
            expr1-o expr2    如果表达式expr1expr2为真(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       表达式的计算结果是expr1expr2次方。第二个表达式expr2必须是一个整数。
        (expr)            修改标准的优先顺序,强制计算圆括号内的表达式。
        var=expr          把表达式的计算结果值赋予变量。
        varop=expr        等价于“var=varopexpr”,表示把变量的值与表达式的计算结果经过op运算
                          后赋予变量,其中op是“+”、“-”、“*”、“/”、“%”或“^”等运算符
                          之一。注意,bc也支持=+、=-、=*、=/、=%和=^等风格的赋值运算符。

关系表达式是一种特殊的表达式,其计算结果总是0或1。如果关系为假,计算结果就是0;如果关系为真,计算结果就是1。有效的关系运算符如下:

        expr1expr2       如果表达式expr1小于表达式expr2,计算结果为1。
        expr1<=expr2      如果表达式expr1小于等于表达式expr2,计算结果为1。
        expr1expr2       如果表达式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-list1statement-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。如果表达式expr1expr3
                             省略,在其应该计算之处也忽略之。如果表达式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
        $