Bash参考手册

目录

下一页: , 前一页: , 上: (dir)   [目录][索引]

Bash功能

本文简要介绍了目前 Bash shell(版本4.4,2016年9月7日)中的功能。 Bash主页是http://www.gnu.org/software/bash/

这是GNU Bash参考手册的4.4版本,最后更新于2016年9月7日,适用于Bash,版本4.4。

Bash包含出现在其他流行shell中的功能,以及仅在Bash中出现的一些功能。 Bash从Bourne Shell(sh),Korn Shell(ksh)和C-shell(csh ;及其后继者tcsh)引入一些概念。 下面的菜单将这些功能分成几个类别,注意哪些功能是受其他shell启发的,哪些功能是Bash特有的。

本手册是对Bash中的功能的简要介绍。 Bash手册页应该用作shell行为的明确参考。


下一页:,上一页:Top [目录] [索引]

1引言


下一个: ,上一页:引言 [目录] [索引]

1.1什么是Bash?

Bash是GNU操作系统的shell或命令行解释器。 这个名字是“Bourne-Again SHell”的缩写,意在调侃Stephen Bourne,他是当前Unix shell的直接祖先sh的作者,最初出现在贝尔实验室研究版Unix第七版中。

Bash在很大程度上与sh兼容,并且集成了Korn shell ksh和C shell csh的有用特性。 它的设计力求遵循 IEEE POSIX 规范中的 Shell和Tools 一节的规范(IEEE Standard 1003.1)。 它在交互式和编程两方面对sh的功能进行了改进。

虽然GNU操作系统还提供其他的shell,包括csh的一个版本,但默认的shell是Bash。 像其他的GNU软件一样,Bash具有很好的移植性。 目前,它几乎可以在任何版本的Unix和其他一些操作系统上运行 - 对于MS-DOS,OS/2和Windows等平台,存在独立维护的移植版。


前一页: ,上:引言 [目录] [索引]

1.2什么是shell?

本质上,shell是一个执行各种命令的宏处理器。 术语“宏处理器”指扩展文本和符号以创建更大表达式的功能。

Unix shell既是命令解释器又是编程语言。 作为一个命令解释器,shell提供了包含丰富的GNU工具集的用户界面。 编程语言功能可以将这些实用程序进行组合。 可以创建包含命令的文件,并且文件本身也可以作为命令。 这些新命令与/ bin等目录中的系统命令具有相同的地位,允许用户或组建立自定义环境来自动执行他们的常规任务。

shell可以以交互方式或非交互方式使用。 在交互模式下,他们接受从键盘输入。 当以非交互方式执行时,shell会执行从文件中读取的命令。

一个shell允许同时和异步执行GNU命令。 shell在接受更多的输入之前,等待同步命令完成;异步命令在shell读取并执行其他命令时继续与shell并行执行。 重定向结构允许对这些命令的输入和输出进行细粒度的控制。 而且,shell允许控制命令环境的内容。

shell也提供一小组内建的命令(builtins),实现外部命令不可能或不方便实现的功能。 例如,cdbreakcontinueexec不能在shell之外实现,因为它们直接操作shell本身。 内建的historygetoptskillpwd等命令可以在单独的实用程序中实现,但作为内建命令使用起来更为方便。 shell所有的内建命令都在后面的章节中介绍。

虽然执行命令是其关键任务,但shell的大部分功能(和复杂性)在于它们的嵌入式编程语言。 像任何高级语言一样,shell提供变量,流控制结构,引用和函数。

Shell提供了专门用于交互式使用的功能,而不是为了增强编程语言特性。 这些交互功能包括作业控制,命令行编辑,命令历史和别名。 本手册将介绍每个功能。


下一页:,上一页:,上一级:顶部[目录] [索引]

2定义

这些定义将在本手册的后续部分中使用。

POSIX

基于Unix的开放系统标准族。 Bash主要和POSIX 1003.1标准的 Shell和Utilities 部分有关。

空白符

一个空格或制表符。

内建命令

一个由shell自己内部实现的命令,而不是由文件系统中某个可执行程序执行的命令。

控制操作符

执行控制功能的一些 符号 包含换行符或以下符号之一: ‘||’, ‘&&’, ‘&’, ‘;(分号)’, ‘;;(双分号)’, ‘;&’, ‘;;&’, ‘|’, ‘|&’, ‘(’, or ‘)’.

退出状态

由命令返回给调用者的值。 该值限制在八位,所以最大值是255。

字段

执行shell扩展后得到的文本的一部分。 当执行一个命令时,经过shell扩展后的字段分别作为命令名和参数。

文件名

用于标识文件的字符串。

作业

组成一个管道的一系列进程,以及其衍生出的进程,这些进程都属于同一个进程组。

作业控制

用户可以选择性地停止(暂停)和重新启动(恢复)进程执行的一种机制。

元字符

当没有引用时能分隔开单词的字符。 元字符包括 (空格)tab(制表符)换行符或以下字符之一: ‘|’, ‘&’, ‘;’, ‘(’, ‘)’, ‘<’, or ‘>’.

名称

一个仅由字母,数字和下划线组成的 单词,以字母或下划线开头。 名称 被用作shell变量和函数名称。 也被称为标识符

运算符

包括控制运算符重定向运算符 有关重定向操作符的列表,请参阅重定向 运算符至少包含一个未被引用的元字符

进程组

相关进程的集合,每个进程具有相同的进程组ID

进程组ID

在进程运行的周期内,表示进程组的唯一标识符。

保留字

一个对shell有特殊的含义单词 大多数保留字引入了shell流控制结构,例如forwhile

返回状态

退出状态的同义词。

信号

当系统中发生某个事件时,内核用以通知(用户)进程的一种机制。

特殊内建命令

POSIX标准归类为具有特殊作用的shell内建命令。

符号

被shell当作单独单位的字符。 它可以是单词运算符

单词

被shell当作一个单位处理的一串字符。 单词不能包含未被引用的元字符


下一页:,上一页:,上:顶部 [目录][索引]

3 Shell的基本功能

Bash是'Bourne-Again SHell'的缩写。 Bourne shell最初是由Stephen Bourne编写的传统的Unix shell。 所有的Bourne shell内建命令都在Bash中可用,求值和引用的规则取自POSIX规范中定义的“标准”Unix shell。

本章简要总结了shell的“构建结构”:命令,控制结构,shell函数,shell 参数,shell扩展,重定向,即把输入和输出定向自(到)文件,以及shell如何执行命令。


下一页:,上一页:Shell的基本功能 [目录] [索引]

3.1 Shell语法

当shell读取输入时,它通过一系列操作进行。 如果输入表示注释的开始,那么shell将忽略注释符号('')和该行的其余部分。

否则,大致来说,shell读取输入并将输入分为单词和操作符,利用引用规则来选择分配各种单词和字符的含义。

然后,shell将这些标记解析为命令和其他结构,删除特定字或字符的特殊含义,扩展其他字符,根据需要重定向输入和输出,执行指定的命令,等待命令的退出状态,并使退出状态可用于进一步检查或处理。


下一页:,上一页:Shell语法 [目录] [索引]

3.1.1 Shell操作

以下是关于读取和执行命令时shell的操作的简要说明。 基本上,shell执行以下操作:

  1. 从文件中读取输入(参见Shell脚本 ),从作为参数的字符串提供给-c调用选项(参见调用Bash),或来自用户的终端。
  2. 将输入分解为单词和运算符,遵守引用中描述的引用规则。 这些字符由元字符分隔。 别名扩展是在这一步执行的(请参阅别名)。
  3. 将字符解析为简单和复合命令(请参阅Shell命令)。
  4. 执行各种shell扩展(请参阅Shell扩展),将扩展的字符拆分为文件名列表(参见文件扩展名)以及命令和参数。
  5. 执行任何必要的重定向(请参阅重定向),并从参数列表中删除重定向运算符及其操作数。
  6. 执行命令(请参阅执行命令)。
  7. (可选)等待命令完成并收集其退出状态(请参阅退出状态)。

下一页:,上一页:,上:Shell语法 [目录][索引]

3.1.2 引用

引用用于删除某些字符或单词对shell的特殊含义。 引用可以用来禁止对特殊字符的特殊处理,是保留字不在被认为是保留字,并禁止参数扩展。

每个shell元字符(参见定义)对shell都有特殊的含义,如果要表示它自身的意思,必须要引用它。 当使用命令历史扩展功能时(参见历史交互),历史扩展字符,通常是'!必须引用它(!)来防止历史扩张。 有关历史扩展的更多详情,请参见bash历史工具

有三种引用机制:转义字符,单引号和双引号。


下一页:,上一页:引用 [目录] [索引]

3.1.2.1转义字符

一个不带引号的反斜杠“\”是Bash转义字符。 它保留下一个字符的本身的意思,除了newline(换行)之外。 如果出现\newline对,并且反斜杠本身没有被引用,则将\newline视为一个续行(即从输入流中忽略\newline 换行的效果)。


下一页:,上一页:,上:引用 [目录][索引]

3.1.2.2单引号

用单引号括起来的字符(''')保留引号中每个字符的字面含义。 单引号之间不允许再出现单引号,即使前面有反斜杠也是如此。


下一页:,上一页:,上:引用 [目录][索引]

3.1.2.3双引号

用双引号括起来的字符('')保留了引号内的所有字符的字面含义,除了‘$’, ‘`’, ‘\’,并且当启用历史记录展开时,!”。 当shell处于POSIX模式(参见 POSIX模式)时,!在双引号内没有特殊含义,即使启用了历史扩展。 字符'$'和'`'在双引号内保留其特殊含义(参见Shell 扩展)。 反斜线只有在跟随以下字符时才保留其特殊含义: ‘$’, ‘`’, ‘"’, ‘\’, 或 newline 在双引号内,反斜线后面跟着其中一个字符的时,会删除这个反斜线。 在没有特殊含义的字符之前的反斜杠保持不变。 双引号可以用双引号引起来,在双引号内部的双引号前面加一个反斜线。 在双引号中如果启用历史扩展 !,则将执行历史扩展,除非“!”前使用反斜杠。 在“!”前的反斜杠 不会被删除。

在双引号(参见Shell参数扩展)中,特殊参数‘*’ 和 ‘@’ 具有特殊含义。


下一页:,上一页:,上:引用 [目录][索引]

3.1.2.4 ANSI-C引用

$'string'形式中的单词被特殊处理。 这个词扩展为string,反斜杠转义字符会替换为ANSI C标准指定的字符。 如果出现反斜杠转义序列,则按如下方式解码:

\a

警报(钟)

\b

退格

\e
\E

一个转义字符(不属于ANSI C)

\f

走纸换页

\n

新行

\r

回车

\t

水平制表符

\v

垂直制表符

\\

反斜线

\'

单引号

\"

双引号

\?

问号

\nnn

八位数值的八位字符nnn(一至三位数字)

\xHH

八位字符,其值是十六进制值HH(一个或两个十六进制数字)

\uHHHH

Unicode值(ISO/IEC 10646)字符,其值是十六进制值HHHH (1到4个十六进制数字)

\UHHHHHHHH

Unicode值(ISO/IEC 10646)字符,其值是十六进制值HHHHHHHH (1到8个十六进制数字)

\cx

一个control-x字符,Ctr-X 控制字符

扩展的结果是单引号的,好像美元符号本来就不存在。


上一页:,上:引用 [内容] [索引]

3.1.2.5 本地特殊翻译

以美元符号('$')开头的双引号字符串将导致根据当前语言环境翻译字符串。 如果当前区域设置为CPOSIX,美元符号将被忽略。 如果字符串被翻译和替换,替换是双引号。

某些系统使用由LC_MESSAGES shell变量选择的消息目录。 也有些系统根据TEXTDOMAIN这个shell变量的值来决定消息目录的名称,有可能加上.mo 这个后缀。 如果使用TEXTDOMAIN变量​​,则可能需要将TEXTDOMAINDIR变量设置为消息目录文件的路径。 还有些系统使用这两种变量:TEXTOMAINDIR/LC_MESSAGES/ LC_MESSAGES/TEXTDOMAIN.mo。


上一页:,上:Shell语法 [内容] [索引]

3.1.3 注释

在非交互式shell或交互式shell中,如果shopt内建命令的interactive_comments选项已启用(请参阅Shopt内建命令以“”开头的单词会使得该单词和该行上的所有剩余字符被忽略。 没有启用interactive_comments选项的交互式shell不允许注释。 交互式shell中interactive_comments选项默认打开。 请参阅交互式shell,了解shell交互原理。


下一页:,上一页:,上:基本Shell特性 [目录][索引]

3.2 Shell命令

一个简单的shell命令(如echo a b c)包含命令本身,后面跟着由空格分隔的参数。

更复杂的shell命令由以各种方式排列在一起的简单命令组成:在一个管道中,一个命令的输出成为第二个命令的输入,如:在一个循环或条件结构中,或者在其他命令组中。


下一页:,上:Shell命令 [目录][索引]

3.2.1简单的命令

简单的命令是使用最频繁的命令类型。 它只是一个由空白 s分隔的单词序列,由一个shell的控制操作符(见定义)终止。 第一个单词通常指一个要执行的命令,其余单词是该命令的参数。

简单命令的返回状态(参见退出状态)是由POSIX 1003.1中waitpid函数规定的退出状态,如果一个命令由一个信号n终止,则其退出状态是 128+n


下一页:,上一页:,上:Shell命令[目录][索引]

3.2.2管道

一个管道是由一个控制运算符'|'或'|&'分隔的一个或多个命令的序列。

管道的格式是

[time [-p]] [!] command1 [|或|& command2] …

管道中每个命令的输出通过管道连接到下一个命令的输入。 也就是说,每个命令读取前一个命令的输出。 该连接在该命令指定的任何重定向之前执行。

如果使用'|&',command1的标准错误将追加到它的标准输出后面,通过管道连接到command2的标准输入;它是2&1 |的简写。 标准错误隐式重定向到标准输出是在命令指定的任何重定向之后执行。

保留字time会在流程完成时为流程打印时序统计信息。 统计数据目前包括命令执行所消耗的总时间(钟表时间)以及用户和系统花费的时间。 -p选项将输出格式更改为由POSIX指定的格式。 当shell处于POSIX模式(参见 POSIX模式)时,如果‘time’下一个符号是‘-’,它将不会被识别为保留字。 可以将TIMEFORMAT变量​​设置为格式字符串,该格式字符串指定应该如何显示时间输出信息。 请参阅Bash变量,了解可用格式的说明。 使用time作为保留字允许统计 shell内建命令,shell函数和管道的时间。 外部time命令不能很容易地做到这点。

当shell处于POSIX模式(参见Bash POSIX 模式)时,time后面可能会换行。 在这种情况下,shell将显示shell及其子项消耗的总用户和系统时间。 可以使用TIMEFORMAT变量​​来指定时间信息的格式。

如果管道不是异步执行的(参见列表),则shell将等待管道中的所有命令完成。

管道中的每个命令都在其自己的子shell中执行(请参阅命令执行环境)。 管道的退出状态是管道中最后一个命令的退出状态,除非启用了pipefail选项(请参见set内建命令)。 如果启用了pipefail选项,则管道的返回状态是以非零状态退出的最后一个(最靠右的)命令的值,如果所有命令都成功退出,则为零。 如果保留字“!'在管道之前,退出状态是如上所述的退出状态的逻辑否定。 在返回值之前,shell等待管道中的所有命令终止。


下一页:,上一页:,上一条:Shell命令 [目录][索引]

3.2.3命令列表

list是一个或多个管道的通过运算符‘;’, ‘&’, ‘&&’, 或 ‘||’, 连接而成,并以可选的运算符 ‘;’, ‘&’, 或者 newline结束.

在这些列表运算符中, ‘&&’ 和‘||’ 具有相同的优先级,之后是‘;’ 和‘&’, 它们具有相同的优先级。

一个或多个换行符的序列可能出现在列表中,用于分隔命令,等同于分号。

如果一个命令被控制操作符‘&’,终止,那么shell会在一个子shell中异步地执行这个命令。 这被称为在后台中执行命令。 shell不会等待命令完成,并且返回状态为0(true)。 如果作业控制处于非活动状态(请参见作业控制),则在没有任何显式重定向的情况下,异步命令的标准输入将重定向到/dev/null

由‘;’ 分隔的命令按顺序执行; shell等待每个命令依次终止。 返回状态是最后一个执行的命令的退出状态。

ANDOR列表是由控制运算符‘&&’和‘||’, 分隔的一个或多个管道的序列, ANDOR 列表以左结合执行。

一个AND列表的形式

command1 && command2

当且仅当command1返回退出状态为零时,才执行command2

一个OR列表的形式

command1 || command2

当且仅当command1返回非零退出状态时才执行command2

ANDOR列表的返回状态是在列表中执行的最后一个命令的退出状态。


下一页:,上一页:,上:Shell命令 [目录][索引]

3.2.4复合命令

复合命令是shell编程结构。 每个结构以保留字或控制运算符开始,并由相应的保留字或运算符终止。 与复合命令关联的任何重定向(请参阅重定向)将应用于该复合命令中的所有命令,除非是显示覆盖。

在大多数情况下,复合命令描述中的命令列表可能会与命令的其余部分由一个或多个换行符分隔开来,并且后面可能会换行而不是分号。

Bash提供循环结构,条件结构,以及将命令分组并将其整体作为一个单元执行的机制。


下一页:,上:复合命令 [目录] [索引]

3.2.4.1循环结构

Bash支持以下循环结构。

请注意,无论在命令的语法描述中任何地方出现“”,它都可能被替换为一个或多个换行符。

until

until命令的语法是:

until test-commands; do consequent-commands; done

只要test-commands的退出状态不为零,就执行consequent-commands 返回状态是在consequent-commands中执行的最后一个命令的退出状态,如果没有执行,则返回零。

while

while命令的语法是:

while test-commands; do consequent-commands; done

只要test-commands的退出状态为零,则一直执行consequent-commands 返回状态是在consequent-commands中执行的最后一个命令的退出状态,如果没有执行,则返回零。

for

for命令的语法是:

for name [ [in [words …] ] ; ] do commands; done

扩展words,并为结果列表中的每个成员执行一次commands ,并将name绑定到当前成员。 如果‘in words’不存在, for 依次对每个位置参数执行commands,就好像指定了‘in "$@"’一样(见特殊参数)。 返回状态是执行的最后一个命令的退出状态。 如果单词扩展中没有项目,则不执行命令,返回状态为零。

还支持for命令的替代形式:

for (( expr1 ; expr2 ; expr3 )) ; do commands ; done

首先,算术表达式expr1根据以下规则进行运算(请参阅Shell算术)。 然后重复运算算术表达式expr2,直到它计算为零。 每当expr2计算结果为非零值时,执行commands,并计算算术表达式expr3 如果省略了任何表达式,则表现就好像它的计算结果为1。 返回值是执行的commands中的最后一个命令的退出状态,如果任何表达式无效,则返回false。

可以使用breakcontinue 内建命令(参见Bourne Shell 内建命令)来控制循环执行。


下一页:,上一页:,上:复合命令 [目录] [索引]

3.2.4.2 条件结构

if

if命令的语法是:

if test-commands; then
  consequent-commands;
[elif more-test-commands; then
  more-consequents;]
[else alternate-consequents;]
fi

执行test-commands列表,如果返回状态为零,则执行​​ consequent-commands列表。 如果test-commands返回一个非零状态,则依次执行每个elif列表,如果其退出状态为零,则相应的more-consequents命令被执行,并结束整个命令。 如果存在else alternate-consequents,并且最后的ifelif子句中的最后一个命令一个非零的退出状态,则执行alternate-consequents命令块。 返回状态是执行的最后一个命令的退出状态,如果没有条件测试为真,返回状态为零。

case

case 命令的语法是:

case word in [ [(] pattern [| pattern]…) command-list ;;]… esac

case将有选择地执行第一个patternword匹配的对应的command-list命令块。 如果启用了nocasematch shell选项(参见shopt内建命令shopt的描述),则不考虑字母字符大小写。 '|'用于分隔多个模式,''操作符终止模式列表。 模式列表和相关的命令列表被称为子句

每个子句必须‘;;’, ‘;&’, or ‘;;&’.结尾。 在尝试匹配之前,单词进行了波浪号扩展,参数扩展,命令替换,算术扩展和引用去除。 每个模式也要经过波浪号扩展,参数扩展,命令替换和算术扩展。

可能有任意数量的case子句,每个子句都以‘;;’, ‘;&’, or ‘;;&’结尾. 匹配的第一个模式决定了执行的命令列表。 使用'*'作为定义默认情况的最终模式是一个常见的习惯用法,因为该模式将始终匹配。

下面是一个在脚本中使用case的例子,可以用来描述动物的一个有趣的特征:

echo -n "Enter the name of an animal: "
read ANIMAL
echo -n "The $ANIMAL has "
case $ANIMAL in
  horse | dog | cat) echo -n "four";;
  man | kangaroo ) echo -n "two";;
  *) echo -n "an unknown number of";;
esac
echo " legs."

如果使用‘;;’运算符,则在第一个模式匹配后不会尝试后续匹配。 使用 ‘;&’ 代替 ‘;;’ 会导致执行完当前字句后继续执行与下一个子句关联的command-list 使用 ‘;;&’'代替 ‘;;’会导致shell测试下一个子句中的模式(如果有的话),并执行任何关联的command-list成功匹配。

如果没有匹配pattern,返回状态为零。 否则,返回状态是执行command-list的退出状态。

select

选择select结构能轻松生成菜单。 它和for命令的语法几乎相同:

select name [in words …]; do commands; done

in后面的单词列表被扩展,生成一个项目列表。 扩展结果的集合打印在标准错误输出流上,每个输出流前面都有一个数字。 如果省略了 ‘in words’ 中的位置参数,就好像 ‘in "$@"’ 已经指定了一样。 然后显示 PS3提示,并从标准输入中读取一行。 如果该行由与显示的单词相对应的数字组成,则将name的值设置为该单词。 如果输入行为空,则会再次显示单词和提示。 如果读取了EOF,则select命令结束。 读取任何其他值都会导致name被设置为null。 读取的行保存在变量REPLY中。

在每次选择之后执行commands,直到执行​​ break命令,此时select命令结束。

这里是一个例子,允许用户从当前目录中选择一个文件名,并显示所选文件的名称和索引。

select fname in *;
do
	echo you picked $fname \($REPLY\)
	break;
done
((…))
(( expression ))

算术表达式expression根据下面描述的规则来计算(参见Shell算术)。 如果表达式的值不为零,则返回状态为0;否则返回状态为1。 这与下面的表达式完全相同

let "expression"

参见Bash 内建命令,对let内建命令的完整描述。

[[…]]
[[ expression ]]

根据条件表达式表达式的计算结果,返回状态0或1。 表达式由Bash条件表达式中描述的元素组成。 字符分割和文件名扩展不在[[]]之间的单词上执行。波浪字符扩展,参数和变量扩展,算术扩展,命令替换,进程替换和引用移除会执行。 -f等条件运算符必须不加引号才能被识别为元素。

当与[[一起使用时,‘lt’和‘gt’运算符使用当前语言环境按照字典顺序进行排序。

当使用'=='和'!='操作符时,操作符右边的字符串被认为是一个匹配模式,并根据模式匹配中的规则进行匹配,就像启用了extglob shell选项一样。 '='运算符与'=='相同。 如果启用了nocasematch shell选项(参见Shopt 内建命令shopt的描述),则不考虑字母字符大小写。 如果字符串匹配('==')或不匹配(!=)指定的模式,成功则返回值为0,否则返回1。 模式的任何部分可能被引用来强制引用的部分匹配为一个字符串。

另外一个二进制运算符“=〜”可用,其优先级与“==”和“!=”相同。 当它被使用时,运算符右边的字符串被认为是一个扩展的正则表达式,并相应匹配(见regex 3))。 如果字符串能匹配模式成功,则返回值为0,否则返回1。 如果正则表达式在语法上不正确,那么条件表达式的返回值是2。 如果启用了nocasematch shell选项(参见Shopt 内建命令shopt的描述),则不考虑字母字符大小写。 模式的任何部分可能被引用来强制引用的部分被匹配为一个字符串。 正则表达式中的括号表达式必须小心处理,因为正常的引用字符在括号之间失去了含义。 如果模式存储在shell变量中,则引用变量扩展会强制将整个模式匹配为字符串。 在正则表达式中由子句表达式匹配的括号中子字符串保存在数组变量BASH_REMATCH中。 索引为0的BASH_REMATCH元素是匹配整个正则表达式的字符串部分。 具有索引nBASH_REMATCH的元素是匹配n括号的子表达式的字符串的部分。

例如,以下内容将匹配一行(存储在shell变量line中),如果存在一个字符序列,它的值由任意个数(包括零)空格字符,零个或一个实例'a',然后跟'b'字符串组成:

[[ $line =~ [[:space:]]*(a)?b ]]

这意味着像“aab”和“ aaaaaab”将匹配,如同在任何位置包含'b'的行一样。

将正则表达式存储在shell变量中,通常是一种有效的方式来避免引用对shell来说是特殊字符的问题。 有时不使用引号很难指定正则表达式,或者在跟踪正则表达式使用的引用的同时注意shell引用的移除。 使用shell变量来存储模式可以减少这些问题。 例如,下面的例子相当于上面的内容:

pattern='[[:space:]]*(a)?b'
[[ $line =~ $pattern ]]

如果要匹配正则表达式语法中特殊的字符,必须引用它来删除其特殊含义。 这意味着在 ‘xxx.txt’模式中,‘.’匹配字符串中的任何字符(通常的正则表达式含义),但是在模式 "xxx.txt"中,它只能匹配字符串‘.’(点) Shell程序员应该特别注意反斜杠,因为反斜杠被shell和正则表达式用来从下面的字符中删除特殊的含义。 以下两组命令是等效的:

pattern='\.' 
[[ . =~ $pattern ]]
[[ . =~ \. ]]

[[ . =~ "$pattern" ]]
[[ . =~ '\.' ]]

前两个匹配将会成功,但是后两个匹配不会成功,因为后两个匹配中,反斜线将成为要匹配的模式的一部分。 在前两个例子中,反斜杠去除了‘.’的特殊含义, 所以字面的‘.’点匹配。 如果第一个例子中的字符串是任何其他字符而不是‘.’ ,那么'a',模式不匹配,因为引用的‘.’在模式中失去了匹配任何单个字符的特殊含义。

表达式可以使用以下运算符进行组合,按优先级的降序排列:

表达式

返回表达式的值。 括号()可以用来覆盖运算符的正常优先级。

! 表达式

如果表达式为True,则返回假(取相反结果)。

表达式1 && 表达式2

如果表达式1表达式2都为true,则为true。

表达式1 || 表达式2

如果表达式1表达式2为true,则为true。

如果表达式1的值足以确定&&||运算符的整个条件表达式的返回值,则不计算表达式2


上一页:,上一页:复合命令 [目录] [索引]

3.2.4.3 分组命令

Bash提供了两种方法将一组命令作为一个单元来执行。 当命令分组时,重定向可以应用于整个命令列表。 例如,列表中的所有命令的输出可以被重定向到单个流。

()
( list )

在圆括号之间放置一个命令列表将导致创建一个子shell环境(请参阅命令执行环境),并在该子shell中执行​​list中的每个命令。 由于list是在子shell中执行的,因此在子shell完成后,变量赋值不再有效。

{}
{ list; }

在大括号之间放置一个命令列表将导致列表在当前shell环境中执行。 没有子shell被创建。 list后面的分号(或换行符)是必需的。

除了创建子外壳之外,由于历史原因,这两个结构之间存在细微的差别。 大括号是保留字,所以它们必须通过空白或其他shell元字符与list分开。 圆括号是运算符,即使它们没有被空格分隔list,也被shell识别为单独的符号。

这两个结构的退出状态是list的退出状态。


下一页:,上一页:,上:Shell命令 [目录] [索引]

3.2.5 协同处理

coprocess是以coproc保留字开头的shell命令。 协同处理在子shell中异步执行,就好像命令已经用''控制运算符结束了一样,在执行的shell和协处理之间建立了双向管道。

协同处理的格式是:

coproc [NAME] command [redirections]

这会创建一个名为NAME的协同处理程序。 如果未提供NAME,则默认名称为COPROC 如果命令是一个简单的命令(参见简单命令),则不能指定NAME。否则,它将被解释为简单命令的第一个单词。

执行协同处理时,shell在执行shell的上下文中创建一个名为NAME的数组变量(参见Arrays)。 命令的标准输出通过管道连接到正在执行的shell中的文件描述符,并且该文件描述符被分配给NAME[0]。 命令的标准输入通过管道连接到正在执行的shell中的文件描述符,并将该文件描述符分配给NAME[1]。 这个管道是在命令指定的任何重定向之前建立的(参见重定向)。 文件描述符可以用作shell命令的参数和使用标准字展开的重定向。 文件描述符在子shell中不可用。

执行协处理产生的进程ID可以用作变量NAME_PID的值。 可以使用wait内建命令来等待协处理终止。

由于协处理是作为异步命令创建的,所以coproc命令总是返回成功。 协处理的返回状态是命令的退出状态。


上一页:,上:shell命令 [目录] [索引]

3.2.6 GNU并行

有许多方法可以并行运行他们并不是Bash中的命令。 GNU并行是一个做这种事情的工具。

顾名思义,GNU并行可以用来并行构建和运行命令。 您可以使用不同的参数运行相同的命令,无论它们是文件名,用户名,主机名或从文件中读取的行。 GNU并行提供了许多最常见的操作(输入行,输入行的各个部分,指定输入源的不同方法等)的速记。 并行可以替换xargs或将来自其输入源的命令提供给几个不同的Bash实例。

有关完整的说明,请参阅GNU Parallel文档。 一些例子提供了一个简单的介绍。

例如,很容易替换xargs来使用gzip压缩当前目录及其子目录中的所有html文件:

find . -type f -name '*.html' -print | parallel gzip

如果您需要保护文件名中的特殊字符(如换行符),请使用find的-print0选项和并行的-0选项。

当文件数量太大而无法用一个mv调用进行处理时,可以使用“并行”从当前目录移动文件:

ls | parallel mv {} destdir

正如你所看到的,{}被从标准输入中读取的每行代替。 虽然在大多数情况下使用ls都是可行的,但是处理所有文件名是不够的。 如果您需要在文件名中容纳特殊字符,您可以使用

find . -depth 1 \! -name '.*' -print0 | parallel -0 mv {} destdir

如上所述。

这将运行与当前目录中的文件一样多的mv命令。 您可以通过添加-X选项来模拟并行xargs

find . -depth 1 \! -name '.*' -print0 | parallel -0 -X mv {} destdir

GNU并行可以替换从文件读取的行上运行的某些常用习惯用法(在这种情况下,每行列出一个文件名):

	while IFS= read -r x; do
		do-something1 "$x" "config-$x"
		do-something2 < "$x"
	done < file | process-output

用更简洁的语法让人想起lambda:

cat list | parallel "do-something1 {} config-{} ; do-something2 < {}" | process-output

Parallel提供了一个内置的机制来删除文件扩展名,这个扩展名适用于批处理文件转换或重命名:

ls *.gz | parallel -j+0 "zcat {} | bzip2 >{.}.bz2 && rm {}"

这将使用bzip2重新压缩当前目录中名称以.gz结尾的所有文件,并行地为每个CPU(-j+0)运行一个作业。 (为了简洁起见,我们使用ls;如上所述,使用find在包含非预期字符的文件名中更实用。 并行可以从命令行获取参数;上面的示例也可以写成

parallel "zcat {} | bzip2 >{.}.bz2 && rm {}" ::: *.gz

如果一个命令产生输出,你可能想保留输出中的输入顺序。 例如,下面的命令

{ echo foss.org.my ; echo debian.org; echo freenetproject.org; } | parallel traceroute

将作为输出显示首先完成的traceroute调用。 添加-k选项

{ echo foss.org.my ; echo debian.org; echo freenetproject.org; } | parallel -k traceroute

将确保首先显示traceroute foss.org.my的输出。

最后,Parallel可以用来并行运行一系列shell命令,类似于‘cat file | bash’。 获取文件名列表并不罕见,创建一系列shell命令来对其进行操作,并将该列表的源文件提供给shell。 并行可以加速这一点。 假设文件包含一个shell命令列表,每行一个,

parallel -j 10 < file

将使用shell运行命令(因为没有明确的命令作为参数提供),一次执行十个shell作业块。


下一页:,上一页:,上一节:基本Shell特征 [目录][索引]

3.3 Shell函数

Shell函数是一种将命令分组之后以使用单个组的名称来执行的方法。 它们像“常规”命令一样执行。 当一个shell函数的名字用作一个简单的命令名时,执行与该函数名相关的命令列表。 Shell函数在当前的shell上下文中执行;没有新的进程被创造来解释他们。

函数声明使用这个语法:

name () compound-command [ redirections ]

或者

function name [()] compound-command [ redirections ]

它定义了一个名为name的shell函数。 保留字function是可选的。 如果提供了function保留字,则小括号()是可选的。 该函数的body部分是复合命令compound-command(参见复合命令)。 该命令通常是一个包含在{和}之间的list,但可以是上面列出的任何复合命令,但有一个例外:如果使用function保留字,但括号()没有提供,大括号是必需的。 只要将函数的name指定为命令的名称,就会执行 复合命令 当shell处于POSIX模式(参见Bash POSIX Mode)时,name可能与特殊的内建命令不同特殊内建命令)。 任何与shell函数关联的重定向(参见Redirections)在执行该函数时执行。

可以使用-f选项删除unset内建命令定义(请参阅Bourne Shell 内建命令)。

函数定义的退出状态为零,除非发生语法错误或已存在具有相同名称的只读函数。 执行时,函数的退出状态是在主体中执行的最后一个命令的退出状态。

请注意,由于历史原因,在最常见的用法中,围绕函数体的大括号必须通过空格或换行符与函数体分离。 这是因为大括号是保留字,只有当它们被空格或另一个shell元字符与命令列表分离时才被识别。 另外,当使用大括号时,list必须以分号,或换行符结尾。

执行一个函数时,函数的参数在执行时成为位置参数(参见位置参数)。 扩展到位置参数数量的特殊参数“”被更新以反映该变化。 特殊参数0不变。 当函数执行时,FUNCNAME变量​​的第一个元素被设置为函数的名字。

shell执行环境的所有其他方面在函数和调用者之间是相同的,除了这些例外:DEBUGRETURN陷阱不会被继承,除非使用declare内建命令给函数赋予trace属性或使用set内建命令启用-o functrace shell选项,(所有函数都继承DEBUGRETURN陷阱),并且ERR陷阱不会继承,除非-o errtrace shell选项已经启用。 请参阅Bourne Shell 内建命令,了解trap内建命令的说明。

如果FUNCNEST变量设置为大于0的数值,则​​定义了最大函数嵌套级别。 超过限制的函数调用将导致整个命令中止。

如果函数中的return内建命令被执行,则函数完成,继续执行函数调用后的下一个命令。 在执行恢复之前,与RETURN陷阱关联的任何命令都会执行。 当函数完成时,位置参数的值和特殊参数''被恢复为函数执行之前的值。 如果给return一个数字参数,则作为函数的返回状态;否则函数的返回状态是在return之前执行的最后一个命令的退出状态。

函数的局部变量可以用local内建命令声明。 这些变量仅对函数及其调用的命令可见。

函数名和定义可以用declaretypeset)内置命令的-f选项列出(参见Bash 内建命令)。 declaretypeset-F选项将仅列出函数名称(以及可选的源文件和行号,如果extdebug shell选项启用)。 export内建命令可以导出函数,以便子shell可以自动使用-f选项定义(请参阅Bourne Shell 内建命令)。 请注意,shell函数和具有相同名称的变量可能会在传递给shell子项的环境中产生多个相同名称的条目。 在可能导致问题的情况下应该小心。

函数可能是递归的。 可以使用FUNCNEST变量​​来限制函数调用堆栈的深度,并限制函数调用的次数。 默认情况下,递归调用的数量没有限制。


下一页:,上一页:,上:基本Shell特性 [目录][索引]

3.4 shell参数

一个parameter是一个存储值的实体。 它可以是name,一个数字或下面列出的特殊字符之一。 variable​​是由name表示的参数。 变量具有value和零个或多个属性 使用declare内置命令(参见Bash Builtinsdeclare内建命令的说明)指定的属性。

如果参数已经分配了一个值,则这个参数被设置。 空(null)字符串也是一个有效的值。 一旦设置了一个变量,只有使用unset内建命令才可以取消设置。

分配一个变量可以通过下面的形式声明

name=[value]

如果没有给出value,则该变量被分配空字符串(null)。 所有value经历波浪线扩展,参数和变量扩展,命令替换,算术扩展和引用去除(详述如下)。 如果变量具有integer属性集,那么即使没有使用$((…))扩展,value也会作为算术表达式求值(参见算术扩展)。 除了"$@"之外,分词操作不会执行,如下所述。 文件名扩展不执行。 赋值语句也可以作为aliasdeclaretypesetexportreadonlylocal内建命令的参数(declaration命令)。 POSIX模式下(参见Bash POSIX Mode),这些内建命令可能会在command内建命令的一个或多个实例中出现,并保留这些赋值语句的属性。

在赋值语句为shell变量或数组索引(参见Arrays)指定值的情况下,可以使用+=运算符来追加或添加到变量以前的值上。 这包括接受赋值语句(声明命令)的内置命令(如declare)的参数。 +=应用于已设置整数属性的变量时,value将作为算术表达式计算并添加到变量的当前值,这也是求值。 当使用复合赋值将+=应用于数组变量时(参见Arrays),变量的值不会取消设置(就像使用'='),并且新值从数组的最大索引(对于索引数组)添加到数组中,或者作为附加键值对添加到关联数组中。 当应用于字符串变量时,value被展开并附加到变量的值。

可以使用declarelocal内建命令的-n选项为变量分配nameref属性(参见 Bash内建命令)创建一个nameref,或者引用另一个变量。 这允许变量间接操作。 只要nameref变量被引用,赋值,取消设置或修改了其属性(除了使用或更改nameref属性本身),操作实际上是在由nameref变量的值指定的变量上执行的。 在shell函数中通常使用nameref来引用一个名字作为参数传递给函数的变量。 例如,如果一个变量名作为第一个参数传递给一个shell函数,则运行

declare -n ref=$1

在函数内部创建一个nameref变量ref,其值是作为第一个参数传递的变量名。 ref的引用和赋值以及对其属性所作的更改将被视为对名称作为$1传递的变量的引用,赋值和属性修改。

如果for循环中的控制变量具有nameref属性,则单词列表可以是一个shell变量列表,并且将为列表中的每个单词建立一个名称引用,循环被执行。 数组变量不能被赋予nameref属性。 但是,nameref变量可以引用数组变量和下标数组变量。 Namerefs可以使用unset内建命令的-n选项取消属性设置(请参阅Bourne Shell 内建命令 否则,如果使用nameref变量的名称作为参数执行unset,则nameref变量引用的变量将被取消设置。


下一页:,上一页:Shell参数[目录][索引]

3.4.1位置参数

位置参数是由一个或多个数字表示的参数,而不是单个数字0 位置参数在调用时从外壳的参数中分配,可以使用set内置命令重新分配。 Positional parameter N may be referenced as ${N}, or as $N when N consists of a single digit. 位置参数不能用赋值语句赋值。 内置的setshift用于设置和取消设置(参见Shell内置命令)。 在执行shell函数时,位置参数将被临时替换(参见Shell函数)。

当一个位数超过一位数字的参数被展开时,它必须用大括号括起来。


上一个:,上一个:外壳参数 [内容] [索引]

3.4.2特殊参数

shell特殊对待几个参数。 这些参数只能被引用;不允许给他们分配值。

*

($*)扩展到位置参数,从一开始。 当扩展不在双引号内时,每个位置参数扩展为一个单独的单词。 在被执行的上下文中,这些单词需要进一步分词和路径名扩展。 当扩展出现在双引号内时,它扩展为单个字,每个参数的值由IFS特殊变量的第一个字符分隔。 也就是说,"$*"相当于"$1c$2c…",其中cIFS变量值的第一个字符。 如果IFS未设置,则参数由空格分隔。 如果IFS为空,则参数连接时不插入分隔符。

@

($@)从一个开始扩展到位置参数。 当扩展出现在双引号内时,每个参数将扩展为一个单独的单词。 That is, "$@" is equivalent to "$1" "$2" …. 如果双引号扩展出现在一个单词中,则第一个参数的扩展与原始单词的开始部分连接,最后一个参数的扩展连接到原始单词的最后部分。 When there are no positional parameters, "$@" and $@ expand to nothing (i.e., they are removed).

#

($#)扩展为十进制位置参数的数量。

?

($?) 扩展到最近执行的前台管道的退出状态。

-

($- ,连字符) 通过set内置命令或由shell本身设置的那些(例如-i选项)扩展为当前选项标志。

$

($$)扩展到shell的进程ID ()子shell中,它扩展到调用shell的进程ID,而不是子shell。

!

($!) 无论是作为异步命令还是使用bg内建命令(参见作业控制内置命令),都可以扩展到最近放置在后台的作业的进程ID)。

0

($0)扩展为shell或shell脚本的名称。 这是在shell初始化时设置的。 如果Bash被命令文件调用(参见Shell脚本),则将$0设置为该文件的名称。 如果Bash以-c选项启动(参见调用Bash),那么$0被设置为要执行的字符串之后的第一个参数如果有的话。 否则,它被设置为用于调用Bash的文件名,如参数零所示。

_

($_,下划线)。 在shell启动时,设置为用于调用正在执行的shell或shell脚本的绝对路径名,如在环境或参数列表中传递的那样。 随后,展开后扩展到上一个命令的最后一个参数。 还设置为用于调用每个执行的命令的完整路径名,并放置在导出到该命令的环境中。 检查邮件时,该参数保存邮件文件的名称。


下一页:,上一页:,上一章:基本Shell特性[目录] [索引]

3.5 Shell扩展

在分割成字段之后,扩展在命令行上执行。有七种扩展执行:

扩展的顺序是:大括号扩展;波浪字符扩展,参数和变量扩展,算术扩展和命令替换(按照从左到右的方式完成),分词,和文件名扩展。

在可以支持的系统上,还有一个额外的扩展可用:进程替换 这与波形,参数,变量,算术扩展和命令替换同时进行。

执行这些扩展之后,原始单词中出现的字符引用会移除,除非已被引用(引用移除)。

只有扩展,分词和名称扩展才能改变扩展的字数;其他扩展将单个单词扩展为单个单词。 唯一例外的是“$@”(见特殊参数)和“${名称[@]}“(参见Arrays)。

在所有展开之后,执行引用移除(请参阅引用移除)。


下一页:,上一页:Shell扩展 [目录][索引]

3.5.1 大括号扩展

大括号扩展是一种可以生成任意字符串的机制。 这种机制类似于文件名扩展(参见文件扩展名),但生成的文件名对应的文件不需要存在。 要扩展的模式采用可选的preamble的形式,后跟一系列逗号分隔的字符串或一对大括号之间的序列表达式,随后是可选的postscript 前导码以大括号内包含的每个字符串作为前缀,然后将后导码附加到每个结果字符串,从左向右扩展。

大括号扩展可以嵌套。 每个展开的字符串的结果都不排序;从左到右的顺序被保留。 例如,

bash$ echo a{d,c,b}e
ade ace abe

序列表达式采用{x..y[..incr]}的形式,其中xy可以是整数或单个字符,而incr是一个可选的增量,是一个整数。 当提供整数时,表达式扩展到xy之间的每个数字。 提供的整数可以以“0”作为前缀,以强制每个词具有相同的宽度。 xy以零开始时,shell将尝试强制所有生成的项包含相同数量的数字,必要时使用零填充。 当提供字符时,表达式将使用默认的C语言环境,按照字典顺序扩展到xy(含)之间的每个字符。 请注意,xy必须是相同的类型。 当提供增量时,它被用作每个术语之间的差异。 默认增量为1或-1。

大括号扩展在任何其他扩展之前执行,并且在结果中保留任何特殊于其他扩展的字符。 这是严格的文本。 Bash不会对扩展或大括号之间的文本应用任何语法解释。 为避免与参数扩展冲突,字符串“${”不被认为适用于大括号扩展。

正确形成的大括号扩展必须包含未加引号的开尾括号,并且至少包含一个不带引号的逗号或有效的序列表达式。 任何不正确形成的大括号扩展保持不变。

一个{或''可以用一个反斜杠来引用,以防止它被认为是大括号表达式的一部分。 为避免与参数扩展冲突,字符串“${”不被认为适用于大括号扩展。

当要生成的字符串的通用前缀长于上面的例子时,该构造通常用作简写:

mkdir /usr/local/src/bash/{old,new,dist,bugs}

或者

chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}   这样

下一页:,上一页:,上一节:shell扩展 [目录][索引]

3.5.2 波浪扩展

如果一个单词以不带引号的波浪字符(~)开始,那么所有直到第一个非加引号的斜杠(或所有字符,如果没有未加引号的斜杠)的字符都被认为是波浪前缀 如果没有引用 波浪前缀 中的字符,则在波浪字符之后的波浪前缀中的字符将被视为可能的登录名 如果这个登录名是空字符串,波浪字符将被替换为HOME shell变量的值。 如果HOME 未设置,则执行shell的用户的主目录将被替换。 否则,用指定的登录名与关联的主目录替换波浪字符前缀。

如果波浪字符前缀是“〜+”,那么shell变量PWD的值将替换波浪字号前缀。 如果波浪字符前缀是'〜-',则shell变量OLDPWD的值(如果设置)将替换波浪前缀。

如果波浪字符前缀中的波浪字符后面的字符由数字N和可选前缀“+”或“-”组成,则用目录栈中的相应元素替换波浪字符前缀,因为它将通过用作为参数的波浪字符前缀中的~之后的字符调用的dirs内建命令来显示(参见目录栈)。 如果波浪字符前缀(即波浪字符)包含一个没有前导'+'或'-'的数字,则+为默认。

如果登录名无效,或者波浪字符扩展失败,则该字保持不变。

检查每个变量分配的非引号波浪前缀,紧跟在“:'或第一个'='。 在这些情况下,也会进行波浪字符扩展。 因此,可以使用带有波浪字符的文件名来分配PATHMAILPATHCDPATH,并且shell会分配扩展值。

下表显示了Bash如何处理未加引号的波浪前缀:

~

$HOME的值

〜/foo

$HOME/foo

〜fred/foo

用户fred的主目录的子目录foo

〜+/foo

$PWD/foo

〜-/foo

${OLDPWD-'〜-'}/foo

N

将由'dirs +N'显示的字符串

〜+N

将由'dirs +N'显示的字符串

N

将由'dirs -N'显示的字符串


下一页:,上一页:,上一节:Shell扩展 [目录][索引]

3.5.3 shell参数扩展

'$'字符引入参数扩展,命令替换或算术扩展。 要展开的参数名称或符号可以用大括号括起来,这些大括号是可选的,但是可以用来保护变量使紧随其后的可以被解释为名字的一部分的字符不被扩展。

使用大括号时,匹配的大括号是第一个'}',不会被反斜线或引用字符串转义,也不在嵌入的算术扩展,命令替换或参数扩展中。

参数扩展的基本形式是${parameter}。 parameter的值被替换。 parameter是如上所述的shell参数(请参阅Shell参数)或数组引用(请参阅Arrays)。 parameter是多位数的位置参数时,或者当parameter后面跟着一个不被解释为名称一部分的字符时,需要使用大括号。

如果parameter的第一个字符是感叹号(!),并且parameter不是nameref,它间接引入了一个变量级别。 Bash使用由parameter其余部分形成的变量的值作为变量的名称;这个变量然后被展开,并且该值被用于替换的其余部分,而不是parameter本身的值。 这被称为间接扩展 如果parameter是nameref,则展开为由parameter引用的变量的名称,而不是执行完整的间接展开。 例外的是${!prefix*}和${!name[@]}的扩展。 为了引入间接性,感叹号必须紧跟左括号。

在以下每种情况下,word都需要进行波浪字符扩展,参数扩展,命令替换和算术扩展。

当不执行子字符串扩展时,使用下面描述的形式(例如':-'),Bash测试未设置或为空的参数。 省略冒号只会对未设置的参数进行测试。 换句话说,如果包含冒号,运算符会测试parameter的存在,并且它的值不为空;如果省略冒号,操作只测试是否存在。

${parameter:-word}

如果parameter未设置或为null,则替换word的扩展名。 否则,parameter的值将被代用。

${parameter:=word}

如果parameter未设置或为null,则将word的扩展分配给parameter 然后parameter的值代用。 位置参数和特殊参数不能以这种方式分配。

${parameter:?word}

如果parameter为空或未设置,则word的扩展结果(如果word不存在则为该结果的消息)写入标准错误和shell,如果不是交互式的shell,则退出。 否则,parameter的值将被代用。

${parameter:+word}

如果parameter为空或未设置,则不进行任何替换,否则将替换word的扩展。

${parameter:offset}
${parameter:offset:length}

这被称为子串扩展。 它从offset指定的字符开始扩展到parameterlength个字符。 如果parameter为'@',那么可以用'@'或'*'作为下标的索引数组,关联数组名,不同结果,如下所述。 如果省略length,子字符串的值将从parameteroffset指定的字符处开始扩展到的值的结尾。 lengthoffset是算术表达式(参见Shell算术)。

如果offset的值为小于零的数字,则将该值用作从parameter的值的末尾开始的偏移量。 如果长度的计算结果小于零,则将其解释为从参数的值的末尾以字符为单位的偏移量,而不是多个字符,是offset和结果之间的字符。 请注意,为了避免与“:-”扩展混淆,必须至少将一个负偏移量与冒号分隔开来。

下面是一些例子,说明参数和下标数组的子串扩展:

$ string=01234567890abcdefgh
$ echo ${string:7}
7890abcdefgh
$ echo ${string:7:0}

$ echo ${string:7:2}
78
$ echo ${string:7:-2}
7890abcdef
$ echo ${string: -7}
bcdefgh
$ echo ${string: -7:0}

$ echo ${string: -7:2}
bc
$ echo ${string: -7:-2}
bcdef
$ set -- 01234567890abcdefgh
$ echo ${1:7}
7890abcdefgh
$ echo ${1:7:0}

$ echo ${1:7:2}
78
$ echo ${1:7:-2}
7890abcdef
$ echo ${1: -7}
bcdefgh
$ echo ${1: -7:0}

$ echo ${1: -7:2}
bc
$ echo ${1: -7:-2}
bcdef
$ array[0]=01234567890abcdefgh
$ echo ${array[0]:7}
7890abcdefgh
$ echo ${array[0]:7:0}

$ echo ${array[0]:7:2}
78
$ echo ${array[0]:7:-2}
7890abcdef
$ echo ${array[0]: -7}
bcdefgh
$ echo ${array[0]: -7:0}

$ echo ${array[0]: -7:2}
bc
$ echo ${array[0]: -7:-2}
bcdef

如果parameter@,则结果是从offset偏移开始length长度位置参数。 相对于大于最大位置参数的一个采用负的offset,因此-1的偏移量计算为最后一个位置参数。 如果length的计算结果小于零,那么这是一个扩展错误。

以下示例说明了使用位置参数的子字符串扩展:

$ set -- 1 2 3 4 5 6 7 8 9 0 a b c d e f g h
$ echo ${@:7}
7 8 9 0 a b c d e f g h
$ echo ${@:7:0}

$ echo ${@:7:2}
7 8
$ echo ${@:7:-2}
bash: -2: substring expression < 0
$ echo ${@: -7:2}
b c
$ echo ${@:0}
./bash 1 2 3 4 5 6 7 8 9 0 a b c d e f g h
$ echo ${@:0:2}
./bash 1
$ echo ${@: -7:0}

如果parameter是由@*下标的索引数组名称,则结果为length${parameter[offset]}开头的数组成员。 相对于大于指定数组的最大索引的值,取一个负的offset 如果length的计算结果小于零,那么这是一个扩展错误。

这些示例显示了如何使用索引数组的子字符串扩展:

$ array=(0 1 2 3 4 5 6 7 8 9 0 a b c d e f g h)
$ echo ${array[@]:7}
7 8 9 0 a b c d e f g h
$ echo ${array[@]:7:2}
7 8
$ echo ${array[@]: -7:2}
b c
$ echo ${array[@]: -7:-2}
bash: -2: substring expression < 0
$ echo ${array[@]:0}
0 1 2 3 4 5 6 7 8 9 0 a b c d e f g h
$ echo ${array[@]:0:2}
0 1
$ echo ${array[@]: -7:0}

应用于关联数组的子字符串扩展会产生未定义的结果。

除非使用位置参数,子串索引是从零开始的,除非使用位置参数,在这种情况下,默认索引从1开始。 如果offset为0,并且使用了位置参数,那么$@将加到列表的前面。

${!prefix*}
${!prefix@}

扩展为名称以prefix开头的变量的名称,由IFS特殊变量的第一个字符分隔。 当使用'@'并且扩展出现在双引号内时,每个变量名称将扩展为单独的单词。

${!name[@]}
${!name[*]}

如果name是数组变量,则展开为在name中分配的数组索引(键)的列表。 如果name不是数组,则设置name时展开为0,否则返回null。 当使用'@'并且扩展出现在双引号内时,每个键扩展为单独的单词。

${#parameter}

parameter扩展值的字符长度被代用。 如果parameter是'*'或'@',则取代的值是位置参数的数量。 如果parameter是由*@下标的数组名称,则替换值是数组中元素的数量。 如果parameter是由负数下标的索引数组名称,则该数字被解释为相对于大于parameter的最大索引的数字,因此负指数从数组的末尾,索引-1引用最后一个元素。

${parameter#word}
${parameter##word}

word被扩展为产生一个模式,就像在文件扩展中一样(参见文件名扩展)。 如果模式匹配parameter的扩展值的开始,则扩展的结果是具有最短匹配模式的parameter的展开值(#情况)或最长匹配模式(“##”情况)被删除。 如果parameter@*,则依次对每个位置参数应用模式删除操作,扩展是结果列表。 如果parameter是一个以'@'或'*'为下标的数组变量,模式删除操作将依次应用于数组中的每个成员,而扩展是结果列表。

${parameter%word}
${parameter%%word}

扩展word以生成一个模式,就像在文件扩展中一样。 如果模式匹配parameter扩展值的尾部,那么扩展的结果是parameter的值与最短匹配模式('“情况)或最长匹配模式(”%%“情况)被删除。 如果parameter@*,则依次对每个位置参数应用模式删除操作,扩展为结果列表。 如果parameter是一个以'@'或'*'为下标的数组变量,模式删除操作将依次应用于数组中的每个成员,而扩展是结果列表。

${parameter/pattern/string}

pattern被扩展为产生一个模式,就像在文件扩展中一样。 Parameter被展开,pattern与其值的最长匹配被替换为string 如果pattern以'/开始,pattern的所有匹配被替换为string 通常只有第一个匹配被取代。 如果pattern以'开始,它必须在parameter的扩展值的开头匹配。 如果pattern以'开始,它必须在parameter的扩展值的末尾匹配。 如果string为空,则pattern的匹配被删除,/之后的pattern可能被省略。 如果启用了nocasematch shell选项(参见Shopt内建命令shopt的描述),则不考虑字母字符的大小写。 如果parameter@*,则依次对每个位置参数应用替换操作,扩展为结果列表。 如果parameter是以“@”或“*”为下标的数组变量,则会依次将替换操作应用于数组的每个成员,而扩展是结果列表。

${parameter^pattern}
${parameter^^pattern}
${parameter,pattern}
${parameter,,pattern}

这种扩展修改了parameter中的字母字符的情况。 pattern被扩展为产生一个模式,就像在文件扩展中一样。 parameter展开值中的每个字符都会根据pattern进行测试,如果与模式匹配,则会转换大小写。 该模式不应该尝试匹配多个字符。 '^'操作符将pattern的小写字母转换为大写; “”运算符将匹配的大写字母转换为小写字母。 ^^”和“,,”展开式将每个匹配的字符转换为展开后的值; “^”和“,”展开式匹配并仅转换扩展值中的第一个字符。 如果省略pattern,则将其视为“?',匹配每个字符。 如果参数@*,则依次对每个位置参数应用大小写修改操作,结果列表。 如果参数是一个以'@或'*为下标的数组变量,则将大小写修改操作应用于数组中的每个成员转,而扩展是结果列表。

${parameter@operator}

根据operator的值,扩展可以是parameter值的变换或parameter的信息。 每个operator是单个字母:

Q

扩展是一个字符串,它是以可以作为输入重用的格式引用的parameter的值。

E

扩展是一个字符串,它是parameter的值,带有反斜杠转义序列,像$'...'引用机制一样展开。

P

展开是一个字符串,它是将parameter的值扩展为提示字符串的结果(请参阅控制提示)。

A

扩展是以赋值语句或declare命令的形式存在的字符串,如果计算结果将会使用其属性和值重新创建parameter

a

扩展是由代表parameter属性的标志值组成的字符串。

如果参数@*,则该操作依次应用于每个位置参数,并且展开是结果列表。 如果参数是以'@'或'*'为下标的数组变量,则该操作将依次应用于数组的每个成员,而扩展是结果列表。

扩展的结果受到如下所述的分词和路径名扩展的影响。


下一页:,上一页:,上一节:shell扩展 [目录][索引]

3.5.4 命令替换

命令替换允许命令的输出替换命令本身。 当命令被如下格式封闭时,发生命令替换:

$(command)

或者

`command`

Bash通过在子shell环境中执行command来执行扩展,并将命令替换替换为命令的标准输出,删除任何结尾的换行符。 嵌入的换行符不会被删除,但在分词过程中可能会被删除。 命令替换 $(cat file) 可以被等价但更快的$(< file)

当使用旧式的反引号替换形式时,反斜杠将保留其字面含义,除非在后面加上$,‘`’或 ‘\’。 第一个没有反斜杠的反引号终止了命令替换。 当使用$(command)形式时,括号之间的所有字符组成命令;没有一个是被认为是特殊字符。

命令替换可能是嵌套的。 要使用反向引用的表单嵌套时,请用反斜杠将内部反引号转义。

如果替换出现在双引号内,则不会对结果执行单词拆分和文件名扩展。


下一页:,上一页:,上一节:Shell扩展; [目录] [索引]

3.5.5 算术扩展

算术扩展允许计算算术表达式和替换结果。 算术扩展的格式是:

$(( expression ))

该表达式被视为在双引号内,但括号内的双引号不会被视为特殊字符。 表达式中的所有字段都经过参数和可变扩展,命令替换和引用移除。 结果被视为待计算的算术表达式。 算术扩展可以嵌套。

计算按照以下规则执行(请参阅Shell算法)。 如果表达式是无效的,Bash将打印一条消息,指示标准错误失败,并且不会发生替换。


下一页:,上一页:,上一节:shell扩展 [目录][索引]

3.5.6 进程替代

进程替换允许使用文件名引用进程的输入或输出。 它采取的形式如下:

<(list)

或者

>(list)

进程list是异步运行的,其输入或输出显示为文件名。 作为扩展的结果,该文件名作为参数传递给当前命令。 如果使用>(list)形式,则写入文件将为list提供输入。 如果使用<(list)形式,则应读取作为参数传递的文件以获取list的输出。 请注意,<> 与左括号之间不会有空格,否则该结构将被解释为重定向。 在支持命名管道(FIFO)或命名打开文件的/dev/fd 方法的系统上支持进程替换。

在可用的情况下,进程替换与参数和变量扩展,命令替换和算术扩展同时进行。


下一页:,上一页:,上一节:shell扩展 [目录] [索引]

3.5.7 分词

shell扫描参数扩展,命令替换和算术扩展的结果,这些扩展没有出现在双引号内,用于分词。

shell把$IFS的每个字符作为分隔符,并把其它扩展的结果拆分为单词并合并这些字符作为最终字段。 如果IFS未被设置,或者其值完全是<space><tab><newline>,则默认序列 ,<tab>, and <newline> 在扩展结果的开始或者结尾,则被忽略, IFS 字符不在扩展结果的开始或结尾的,将分隔单词. 如果IFS的值不是默认值,则space, tab, 和 newline只要在扩展结果的开始或结尾,都被忽略,只有在IFS(一个IFS空白字符)的值中,在字的开始和结尾才会生效。 IFS中不是IFS中的任何字符以及任何相邻的IFS空格字符都会分隔一个字段。 一系列IFS空格字符也被视为分隔符。 如果IFS的值为空,则不会发生分词。

显式的空参数(""'')被保留并作为空字符串传递给命令。 未加引号的隐式空参数(由于没有值的参数的扩展而产生)将被删除。 如果在双引号内扩展了一个没有值的参数,则会生成一个空参数并保留并作为空字符串传递给一个命令。 当带引号的null参数作为扩展名非空的单词的一部分出现时,将删除null参数。 也就是说,单词拆分和空参数删除之后,单词-d''变成-d

请注意,如果不进行扩展,则不会执行分割。


下一页:,上一页:,上一节:shell扩展 [目录] [索引]

3.5.8 文件名扩展

在分词之后,除非设置了-f选项(参见Set内建命令),Bash将扫描每个单词的字符*,“?'和'[')。 如果其中一个字符出现,那么这个单词就被认为是一个pattern,并且被匹配模式的按字母顺序排列的文件名列表替换(见模式匹配)。 如果没有找到匹配的文件名,并且shell选项nullglob被禁用,则该字保持不变。 如果设置了nullglob选项,并且找不到匹配项,则该单词被删除。 如果设置了failglob shell选项,并且找不到匹配项,则会打印一条错误消息,并且不执行该命令。 如果启用shell选项nocaseglob,则不考虑字母字符大小写的情况进行匹配。

当一个模式用于文件名扩展时,字符'.'在文件名开头或斜线后必须显式匹配,除非设置了shell选项dotglob 匹配文件名时,斜杠字符必须始终明确匹配。 在其他情况下,.'字符不被特别处理。

有关nocaseglobnullglob的描述,请参见The Shopt Builtin中的shopt failglobdotglob选项。

可以使用GLOBIGNORE shell变量来限制匹配模式的一组文件名。 如果设置了GLOBIGNORE,那么每个匹配的文件名与GLOBIGNORE中的一个匹配的文件名相匹配,则移出匹配列表。 如果设置了nocaseglob选项,则不考虑字母字符大小写,与GLOBIGNORE中的模式进行匹配。 文件名 . .. GLOBIGNORE设置且不为空时,总是被忽略。 但是,将GLOBIGNORE设置为非null值会启用dotglob shell选项,因此所有其他以“.'开头的文件名会匹配。 为了得到忽略文件名以“.'开始,使'.*'在GLOBIGNORE中的其中一个模式。 dotglob选项在未设置GLOBIGNORE时被禁用。


上一节: 文件名扩展   [目录][索引]

3.5.8.1 模式匹配

除了下面描述的特殊模式字符以外,出现在模式中的任何字符都与自身相匹配。 NUL字符可能不会出现在模式中。 反斜杠转义下面的字符;匹配时会丢弃转义的反斜杠。 如果要直接匹配特殊模式字符,则必须引用它们。

特殊模式字符具有以下含义:

*

匹配任何字符串,包括空字符串。 当启用globstar shell选项,并且在文件名扩展上下文中使用'*'时,将两个相邻的*用作单一模式将匹配所有文件和零个或多个目录和子目录。 如果后面跟着一个“/”,两个相邻的*将只匹配目录和子目录。

?

匹配任何单个字符。

[...]

匹配任何一个附上的字符。 由连字符分隔的一对字符表示范围表达式;任何落在这两个字符之间的字符,包括(使用当前语言环境的排序序列和字符集)是匹配的。 如果'['后面的第一个字符是'!'或者'^',那么任何不包围的字符都是匹配的。 一个' - '可以通过包含它作为集合中的第一个或最后一个字符来匹配。 ']'可以通过将其包括为集合中的第一个字符来匹配。 范围表达式中字符的排序顺序由当前语言环境和LC_COLLATELC_ALL shell变量的值(如果已设置)确定。

例如,在默认的C语言环境中,'[a-dx-z]'相当于'[abcdxyz]'。 许多语言环境按字典顺序排序字符,在这些语言环境中,[a-dx-z]通常不等同于[abcdxyz]。例如,它可能相当于“[aBbCcDdxXyYz]”。 要获得对括号表达式的范围的传统解释,可以通过将LC_COLLATELC_ALL环境变量设置为值C来强制使用C语言环境,或者启用globasciiranges shell选项。

在'['和']'中,可以使用语法指定字符类 [:class:], 这里的 class 是下列类型之一,在 POSIX 标准中定义的类型:

alnum   alpha   ascii   blank   cntrl   digit   graph   lower
print   punct   space   upper   word    xdigit

一个字符类匹配属于该类的任何字符。 word字符类匹配字母,数字和字符'_'。

[]中,可以使用[=c=]的语法来指定等价类,它将所有具有相同归类权重(由当前语言环境定义)的字符与字符c匹配。

['和']'内,语法 [symbol.] 匹配整理符号symbol

如果extglob shell选项是使用shopt内置命令启用的,则可以识别多个扩展模式匹配运算符。 在下面的描述中,pattern-list是由|分隔的一个或多个模式的列表。 复合模式可以使用以下一个或多个子模式来形成:

?(pattern-list)

出现匹配给定模式零次或一次。

*(pattern-list)

匹配零个或多个出现的给定模式。

+(pattern-list)

匹配给定模式出现一个或多个。

@(pattern-list)

匹配一个给定的模式。

!(pattern-list)

匹配任何东西,除了一个给定的模式。


上一页:,上一节:shell扩展 [目录] [索引]

3.5.9 引用移除

在前面的扩展之后,所有未加引号的字符“\”,“'”和“",不是以上扩展的结果被移除。


下一页:,上一页:,上一节:基本Shell特性 [目录][索引]

3.6 重定向

执行命令之前,可以使用shell解释的特殊符号将其输入和输出重定向 重定向允许命令的文件句柄被复制,打开,关闭,指向不同的文件,并且可以改变命令读取和写入的文件。 重定向也可以用来修改当前shell执行环境中的文件句柄。 以下重定向操作符可以在简单命令内的任何位置之前或之后出现,也可以跟随一个命令。 重定向按照从左到右的顺序进行处理。

每个可能由文件描述符编号开头的重定向可能会以{varname}形式出现。 在这种情况下,除了下面的每个重定向操作符 >&- 和 <&- ,shell将分配大于10的文件描述符并分配它给{varname}。 如果 >&- 或者 <&- 发生在 {varname} 之前, varname 的值定义要关闭的文件描述符.

在下面的描述中,如果省略文件描述符编号,并且重定向操作符的第一个字符是'<',则重定向是指标准输入(文件描述符0)。 如果重定向操作符的第一个字符是“>”,则重定向是指标准输出(文件描述符1)。

除非另有说明,在以下描述中的重定向操作符之后的单词将经历大括号扩展,波浪字符扩展,参数扩展,命令替换,算术扩展,引用移除,文件名扩展和分词。 如果它扩展到多个字,Bash报告错误。

请注意,重定向的顺序是重要的。 例如,命令

ls > dirlist 2>&1

将标准输出(文件描述符1)和标准错误(文件描述符2)指向文件dirlist,而命令

ls 2>&1 > dirlist

只将标准输出导向文件dirlist,因为在标准输出被重定向到dirlist之前,标准错误被作为标准输出的副本。

如下表所述,Bash特别处理重定向时使用的几个文件名。 如果运行Bash的操作系统提供这些特殊文件,bash将使用它们;否则它将在下面描述的行为中模拟它们。

/dev/fd/fd

如果fd是一个有效整数,则文件描述符fd是重复的。

/dev/stdin

文件描述符0被复制。

/dev/stdout

文件描述符1被复制。

/dev/stderr

文件描述符2被复制。

/dev/tcp/host/port

如果host是有效的主机名或Internet地址,并且port是整数端口号或服务名称,则Bash将尝试打开相应的TCP套接字。

/dev/udp/host/port

如果host是有效的主机名或Internet地址,并且port是整数端口号或服务名称,则Bash会尝试打开相应的UDP套接字。

无法打开或创建文件会导致重定向失败。

使用大于9的文件描述符的重定向应该小心使用,因为它们可能与shell在内部使用的文件描述符冲突。

3.6.1 重定向输入

输入的重定向会导致名称是word扩展的结果的文件的描述符n或标准输入(文件描述符0)被打开,如果n 未指定。

重定向输入的一般格式是:

[n]<word

3.6.2 重定向输出

输出的重定向导致名称由word扩展开来的文件的文件描述符n或者标准输出(文件描述符1)被打开,如果n没有被指定。 如果该文件不存在,则创建它;如果它确实存在,它将被截断为零大小。

重定向输出的一般格式是:

[n]>[|]word

如果重定向操作符是>,并且启用了set内建命令的noclobber选项,则文件名称是由word的扩展而来的文件并且是一个常规文件的重定向将失败。 如果重定向操作符是>|,或者重定向操作符是>,并且noclobber选项没有被启用,即使由word扩展而来的文件存在,也将尝试重定向。

3.6.3 追加重定向输出

以这种方式重定向输出会导致文件名称是由word的扩展而来的文件的文件描述符n或标准输出(文件描述符1)被打开,如果n未指定。 如果文件不存在,则创建该文件。

追加输出的一般格式是:

[n]>>word

3.6.4 重定向标准输出和标准错误

该结构允许将标准输出(文件描述符1)和标准错误输出(文件描述符2)重定向到名称是word的扩展的文件。

重定向标准输出和标准错误有两种格式:

&>word

>&word

在这两种形式中,第一种是优选的。 这在语义上等同于

>word 2>&1

使用第二种形式时,word可能不会展开为数字或“-”。 如果有,则应用其他重定向操作符(请参阅下面的重复文件描述符)以获得兼容性。

3.6.5 追加标准输出和标准错误

该结构允许标准输出(文件描述符1)和标准错误输出(文件描述符2)被附加到名称是word的扩展的文件中。

附加标准输出和标准错误的格式是:

&>>word

这在语义上等同于

>>word 2>&1

(请参阅下面的复制文件描述符)。

3.6.6 Here文档

这种类型的重定向指示shell从当前源读取输入,直到看到只包含word(没有尾随空白)的行。 所有读到这一点的行都被用作标准输入(或者如果指定了n的文件描述符n)。

Here文档的格式是:

[n]<<[-]word
        here-document
delimiter

word上不执行参数和变量扩展,命令替换,算术扩展或文件名扩展。 如果word的任何部分被引用,则delimiterword上去除引用的结果,并且在Here文档中的行不扩展。 如果word没有被引用,则here-document的所有行都经过参数扩展,命令替换和算术扩展,字符序列\newline被忽略,\必须用于引用字符 ‘\’, ‘$’,和`'。

如果重定向操作符是<<-,则所有前导制表符将从输入行和包含 delimiter定界符的行中被去除。 这允许Here文档在shell脚本中以自然的方式缩进。

3.6.7 Here字符串

Here文档的一个变种,格式是:

[n]<<< word

word进行大括号扩展,波浪字符扩展,参数和变量扩展,命令替换,算术扩展和引用移除。 不执行路径名扩展和分词。 结果作为一个单一的字符串提供,附加一个换行符,将其作为标准输入(或者如果指定了n的文件描述符n)。

3.6.8 复制文件描述符

重定向操作符

[n]<&word

用于复制输入文件描述符。 如果word展开为一个或多个数字,则将由n表示的文件描述符作为该文件描述符的副本。 如果word中的数字没有指定文件描述符打开输入,则会发生重定向错误。 如果word计算结果为' - ',则文件描述符n关闭。 如果没有指定n,则使用标准输入(文件描述符0)。

操作符

[n]>&word

类似地用于复制输出文件描述符。 如果没有指定n,则使用标准输出(文件描述符1)。 如果word中的数字未指定打开文件描述符以输出,则会发生重定向错误。 如果word计算结果为' - ',则文件描述符n关闭。 作为一种特殊情况,如果省略n,并且word不扩展为一个或多个数字或“ - ”,则标准输出和标准错误如前所述被重定向。

3.6.9 移动文件描述符

重定向操作符

[n]<&digit-

如果未指定n,则将文件描述符digit移动到文件描述符n或标准输入(文件描述符0)。 digit复制到n后关闭。

同样,重定向操作符

[n]>&digit-

如果没有指定n,则将文件描述符digit移动到文件描述符n或标准输出(文件描述符1)。

3.6.10 打开读写文件描述符

重定向操作符

[n]<>word

导致名称为word展开的文件在文件描述符n上被读取和写入,如果n没有指定,则在文件描述符0上打开。 如果该文件不存在,则会创建该文件。


下一页:,上一页:,上一节:基本Shell特性[目录][索引]

3.7 执行命令


下一页:,上一节:执行命令 [目录] [索引]

3.7.1 简单的命令扩展

当一个简单的命令被执行时,shell从左到右执行下面的扩展,赋值和重定向。

  1. 解析器标记为变量赋值(命令名称前面的那些)和重定向的单词被保存以供稍后处理。
  2. 不是变量赋值或重定向的单词被扩展(见Shell 扩展)。 如果扩展后有任何单词保留,则第一个单词被认为是命令的名称,其余的单词是参数。
  3. 重定向如上所述执行(请参阅重定向)。
  4. 每个变量赋值中的“=”之后的文本在赋予变量之前经过了波浪扩展,参数扩展,命令替换,算术扩展和引用删除。

如果没有命令名称,则变量赋值会影响当前的shell环境。 否则,变量将被添加到执行的命令的环境中,而不会影响当前的shell环境。 如果任何分配尝试为只读变量赋值,则会发生错误,并且该命令以非零状态退出。

如果没有命令名称,则执行重定向,但不影响当前的shell环境。 重定向错误导致命令以非零状态退出。

如果在扩展之后还有一个命令名,执行过程如下所述。 否则,该命令退出。 如果其中一个扩展包含命令替换,则该命令的退出状态是最后执行的命令替换的退出状态。 如果没有命令替换,则命令以状态0退出。


下一页:,上一页:,上一节:执行命令 [目录] [索引]

3.7.2 命令搜索和执行

在命令被分成单词后,如果它产生一个简单的命令和一个可选的参数列表,则采取以下动作。

  1. 如果命令名不包含斜杠,shell将尝试找到它。 如果这个名称存在shell函数,那么该函数将按照Shell函数中的描述被调用。
  2. 如果名称与函数不匹配,shell将在shell内建的列表中搜索它。 如果找到匹配,则调用该内建命令。
  3. 如果这个名字既不是shell函数,也不是内建的,并且不包含斜杠,Bash会搜索每个$PATH元素的包含可执行文件的目录。 Bash使用哈希表来记住可执行文件的完整路径名,以避免多个PATH搜索(请参阅Bourne Shell Builtinshash的描述) 。 只有在哈希表中找不到该命令时,才会执行$PATH目录中的完整搜索。 如果搜索失败,shell会搜索名为command_not_found_handle的定义的shell函数。 如果该函数存在,则以原始命令和原始命令的参数作为参数来调用,函数的退出状态将成为shell的退出状态。 如果没有定义该函数,shell将打印一条错误消息并返回127的退出状态。
  4. 如果搜索成功,或者命令名称包含一个或多个斜杠,则shell将在单独的执行环境中执行指定的程序。 参数0被设置为给定的名称,并且命令的其余参数被设置为提供的参数(如果有的话)。
  5. 如果由于文件不是可执行格式而导致执行失败,并且该文件不是目录,则假定它是一个shell脚本,shell执行它,如Shell脚本
  6. 如果该命令不是异步启动的,shell将等待命令完成并收集其退出状态。

下一页:,上一页:,上一节:执行命令 [目录] [索引]

3.7.3 命令执行环境

shell有一个执行环境,它包含以下内容:

当执行一个简单的命令,而不是一个内建函数或shell函数时,它将在一个独立的执行环境中调用,该环境由以下几部分组成。 除非另有说明,否则这些值是从shell继承而来的。

在这个单独的环境中调用的命令不会影响shell的执行环境。

命令替换,分组为括号的命令和异步命令在与shell环境相同的子shell环境中调用,除了shell捕获的陷阱被重置为shell在调用时从其父节点继承的值。 作为管道的一部分调用的内建命令也在子shell环境中执行。 对子shell环境所做的更改不会影响shell的执行环境。

产生执行命令替换的子shell继承父shell的-e选项的值。 当不在POSIX模式下,Bash清除这些子shell中的-e选项。

如果命令后跟一个“&”,并且作业控制未激活,则该命令的默认标准输入是空文件/dev/null 否则,被调用的命令继承重定向修改的调用shell的文件描述符。


下一页:,上一页:,上一节:执行命令 [目录] [索引]

3.7.4 环境

当一个程序被调用时,它被赋予一个名为environment的字符串数组。 这是名称-值对的列表,其格式为name=value

Bash提供了几种操作环境的方法。 在调用时,shell会扫描自己的环境,并为找到的每个名称创建一个参数,并自动将其标记为export给子进程。 执行的命令会继承环境。 exportdeclare -x命令允许将参数和函数添加到环境中并从环境中删除。 如果修改了环境中参数的值,则新值将成为环境的一部分,替换旧的值。 由shell的初始环境组成的由任何执行的命令继承的环境,其值可以在shell中修改,而不是由unsetexport -n命令删除的任何对。以及通过exportdeclare -x命令添加的内容。

Shell 参数中所述,任何简单命令或函数的环境都可以通过在参数赋值前加上临时的扩展。 这些赋值语句只影响该命令看到的环境。

如果设置了-k选项(参见The Set Builtin),则所有参数赋值都放置在命令的环境中,而不仅仅放在命令名之前。

当Bash调用外部命令时,变量“$_”被设置为命令的完整路径名,并在其环境中传递给该命令。


下一页:,上一页:,上一节:执行命令 [目录][索引]

3.7.5 退出状态

执行的命令的退出状态是由waitpid系统调用或等效函数返回的值。 退出状态在0到255之间,但是,如下所述,shell可能会使用高于125的值。 从shell buildins和复合命令中退出状态也限制在这个范围内。 在某些情况下,shell将使用特殊值来指示特定的失败模式。

对于shell的目的,一个以零退出状态退出的命令已经成功。 非零退出状态表示失败。 这个表面上反直觉的方案被使用,所以有一个明确的方式来指示成功和各种方式来指示各种故障模式。 当一个命令终止于一个致命的信号,其编号是N时,Bash使用值128+N作为退出状态。

如果找不到命令,则创建的执行子进程返回状态127。 如果发现一个命令但不可执行,返回状态是126。

如果由于扩展或重定向期间的错误而导致命令失败,则退出状态大于零。

Bash条件命令(参见条件结构)和一些列表结构(参见Lists)使用了退出状态。

所有的Bash内建函数如果成功则返回一个零的退出状态,失败则返回一个非零的状态,所以它们可以被条件和列表结构使用。 所有的内建函数返回2的退出状态,表示不正确的用法,通常是无效的选项或缺少的参数。


上一页:,上一节:执行命令 [目录] [索引]

3.7.6 信号

当Bash是交互式时,在没有任何陷阱的情况下,它忽略SIGTERM(所以'kill 0'不杀死交互式shell),SIGINT被捕获和处理(所以内建的wait是可中断的)。 当Bash接收到一个SIGINT时,它会跳出任何正在执行的循环。 在所有情况下,Bash都忽略SIGQUIT 如果作业控制有效(见作业控制),Bash将忽略SIGTTINSIGTTOUSIGTSTP

由Bash启动的非内建命令将信号处理程序设置为从其父项继承的值。 当作业控制不起作用时,除了这些继承的处理程序外,异步命令还会忽略SIGINTSIGQUIT 作为命令替换结果运行的命令忽略键盘生成的作业控制信号SIGTTINSIGTTOUSIGTSTP

接收到SIGHUP时,shell会默认退出。 在退出之前,交互式shell将SIGHUP重新发送到所有正在运行或停止的作业。 停止的作业被发送SIGCONT以确保它们接收到SIGHUP 为了防止shell将SIGHUP信号发送到特定的作业,应该使用disown内建命令从作业表中删除(参见作业控制)或者使用disown -h标记为不接收SIGHUP

如果huponexit shell选项已经由shopt内建命令设置(参见The Shopt Builtin),Bash会发送一个SIGHUP当交互式登录shell退出时的所有作业。

如果Bash正在等待命令完成并接收到一个已经设置了陷阱的信号,那么在命令完成之前陷阱不会被执行。 当Bash通过内建的wait等待异步命令时,接收到一个已经设置了陷阱的信号将导致wait内建命令立即返回一个退出状态大于128,紧接着陷阱被执行。


上一页:,上一节:基本Shell功能 [目录] [索引]

3.8 Shell脚本

shell脚本是一个包含shell命令的文本文件。 如果在调用Bash时将这样的文件用作第一个非选项参数,并且不提供-c-s选项(请参阅调用Bash),Bash从文件读取并执行命令,然后退出。 这种操作模式创建一个非交互式shell。 shell首先在当前目录中搜索文件,如果在当前目录中没有找到则在$PATH目录中查找。

当Bash运行一个shell脚本时,它将特殊参数0设置为文件的名称,而不是shell的名字,位置参数设置为剩下的参数(如果有的话) 。 如果没有提供附加参数,则不设置位置参数。

可以通过使用chmod命令打开执行权限来使shell脚本可执行。 当Bash在$PATH中搜索命令,找到指定的文件时,它会生成一个子shell来执行它。 换句话说,执行

filename arguments

相当于执行

bash filename arguments

如果filename是一个可执行的shell脚本。 这个子shell自己重新初始化,效果就好像一个新的shell已经被调用来解释这个脚本,父shell记录的命令的位置(见Bourne Shell 内建命令中的hash)由子shell继承。

大部分Unix的版本都将这个作为操作系统的命令执行机制的一部分。 如果脚本的第一行以两个字符开头,#!,该行的其余部分指定了该程序的解释器。 因此,您可以指定Bash,awk,Perl或其他解释器,并用该语言编写脚本文件的其余部分。

解释器的参数由脚本文件第一行的解释器名称后面的单个可选参数组成,其后是脚本文件的名称,后面是其余参数。 Bash将在不处理它们的操作系统上执行此操作。 请注意,一些旧版本的Unix将解释器名称和参数限制为最多32个字符。

Bash脚本通常以 #!/bin/bash 开头。 (假设Bash已经安装在/bin中),因为这确保Bash将被用来解释脚本,即使它在另一个shell下执行。


下一页:,上一页:,上一节:Top [目录][索引]

4 Shell内置命令

内置命令包含在shell自身中。 当内建命令的名称被用作简单命令的第一个单词时(参见简单命令),shell会直接执行命令,而不会调用其他程序。 内建命令对于实现不可能或不方便使用单独实用程序获得的功能是必需的。

本节简要介绍Bash从Bourne Shell继承的内置命令,以及在Bash中唯一或已经扩展的内建命令。

在其他章节中描述了几个内置命令:为作业控制工具提供Bash接口的内置命令(参见作业控制内置命令),目录堆栈(参见目录堆栈内置 ),命令历史(参见Bash历史命令)和可编程完成工具(参见可编程完成内建命令)。

许多内建命令已经被POSIX或Bash扩展了。

除非另有说明,否则每个内置命令记录为接受“-”的选项前缀,接受“--”来表示选项的结尾。 :truefalsetest 等内建命令不会接受选项,并且不会特殊处理“--”。 exit, logout, return, break, continueletshift内建命令的接受并处理以-开始的参数,而不需要--'。 其他的内建命令接受参数,但没有被指定为接受选项以“-”开头的参数解释为无效选项,并要求“--”来防止这种解释。


下一页:,上一节:Shell内建命令 [目录] [索引]

4.1 Bourne Shell 内建命令

以下shell内置命令是从Bourne Shell继承的。 这些命令按照POSIX标准的规定执行。

: (冒号)
: [arguments]

除了展开arguments并执行重定向之外,不做其他任何事情。 返回状态为零。

. (点)
. filename [arguments]

从当前shell上下文的filename参数中读取和执行命令。 如果filename不包含斜线,则在PATH变量表示的路径下来查找filename 当Bash不在POSIX模式下时,如果$PATH中找不到filename,则搜索当前目录。 如果提供了任何arguments,则在执行​​filename时,它们将成为位置参数。 否则,位置参数不变。 如果启用-T选项,source将继承DEBUG上的任何陷阱。如果没有启用,任何DEBUG陷阱字符串都会被保存并在source调用结束后恢复,source在执行时会取消DEBUG陷阱。 如果未设置-T,并且源文件更改了DEBUG陷阱,则在source完成时保留新值。 返回状态是执行的最后一个命令的退出状态,如果没有执行命令,返回状态为零。 如果filename未找到或无法读取,则返回状态为非零。 . 点内建命令相当于source

break
break [n]

forwhileuntilselect循环中退出。 如果n被提供,则退出第n次循环。 n 必须大于或等于1。 除非n不大于或等于1,否则返回状态为零。

cd
cd [-L|[-P [-e]] [-@] [directory]

将当前工作目录更改为directory 如果没有提供directory,则使用HOME shell变量的值。 directory后面的任何附加参数都将被忽略。 如果shell变量CDPATH存在,它将被用作搜索路径:在CDPATH中的每个目录名称都会搜索directory,在CDPATH中用冒号分隔每个路径(:)。 如果directory以斜杠开头,则不使用CDPATH

-P选项意味着不遵循符号链接:符号链接在cd遍历directory时处理,在处理directory中“..时被移除。

默认情况下,或者在提供-L选项时,directory中的符号链接被移除,之后cd命令切换到..'在directory中。

如果“..'出现在directory中,通过删除前面的路径名组件,返回到斜杠或directory的开始处理。

如果-e选项与-P一起提供,并且目录更改成功后无法成功确定当前工作目录,则cd将返回不成功的状态。

在支持它的系统上,-@选项将与文件关联的扩展属性作为目录。

如果directory-,则在尝试更改目录之前将其转换为$OLDPWD

如果使用CDPATH中的非空目录名称,或者如果“-”是第一个参数,并且目录更改成功,则新工作的绝对路径名目录被写入标准输出。

如果目录成功更改,则返回状态为零,否则为非零。

continue
continue [n]

for, while, until, 或者 select循环的情况下,继续进行下一次迭代。 如果提供了n,则继续执行第​​n次循环。 n必须大于或等于1。 除非n不大于或等于1,否则返回状态为零。

eval
eval [arguments]

这些参数被连接成一个单一的命令,然后被读取和执行,并且退出返回状态作为eval的退出状态。 如果没有参数或只有空的参数,返回状态是零。

exec
exec [-cl] [-a name] [command [arguments]]

如果提供了command,它将替换shell而不创建新进程。 如果提供了-l 选项,那么shell会在传递给command的第零个参数的开始处放置一个破折号。 这就是login程序的功能。 -c选项会导致command在空白环境下执行。 如果提供-a选项,shell将name作为第零个参数传递给command 如果由于某种原因command无法执行,则非交互式shell将退出,除非启用了execfail shell选项。 在这种情况下,它会返回失败。 如果文件无法执行,交互式shell将返回失败。 如果没有指定 command,重定向可能被用来影响当前的shell环境。 如果没有重定向错误,则返回状态为零;否则返回状态不为零。

exit
exit [n]

退出shell,将n的状态返回到父shell。 如果省略n,则退出状态是最后执行的命令的状态。 任何在EXIT上的陷阱在shell终止之前执行。

export
export [-fn] [-p] [name[=value]]

将标记每个被传递给环境中的子进程的name 如果提供了-f选项,则name指的是shell函数。否则这个名字就是指shell的变量。 -n选项意味着不永久标记每个name用于导出。 如果未提供names ,或者给定了-p选项,则显示所有导出变量的名称列表。 -p选项以可以重新用作输入的形式显示输出。 如果变量名后跟 =value,则该变量的值将设置为value

返回状态为零,除非提供了无效选项,其中一个名称不是有效的shell变量名称,或者-f提供的名称不是shell函数。

getopts
getopts optstring name [args]

shell脚本使用getopts来解析位置参数。 optstring包含要识别的选项字符;如果一个字符后跟一个冒号,则该选项应该有一个参数,该参数应该用空格分隔。 冒号(':')和问号('?')不能用作选项字符。 每次调用时,getopts将下一个选项放在shell变量name中,如果不存在则初始化name,把下一个要处理的变量的索引放入OPTIND变量。 每次调用shell或shell脚本时,OPTIND被初始化为1。 当选项需要参数时,getopts将该参数放入变量OPTARG中。 shell不会自动重置OPTIND,如果要使用一组新的参数,则必须在同一个shell调用内对getopts的多次调用之间进行手动重置。

遇到选项结束时,getopts以大于零的返回值退出。 OPTIND设置为第一个非选项参数的索引,name设置为'?”。

getopts通常会解析位置参数,但如果在args中给出更多参数,getopts则会解析这些参数。

getopts可以通过两种方式报告错误。 如果optstring的第一个字符是冒号,则使用silent错误报告。 在正常操作中,遇到无效选项或缺少选项参数时,会打印诊断消息。 如果变量OPTERR设置为0,即使optstring的第一个字符不是冒号,也不会显示错误消息。

如果看到一个无效的选项,getopts放置'?'到name中,如果不是静默,则打印错误消息并取消设置OPTARG 如果getopts为静默,则找到的选项字符被放置在OPTARG中,并且不打印诊断消息。

如果找不到必需的参数,并且getopts不是静默的,则问号('?')被放置在name中,取消OPTARG设置,并打印诊断消息。 如果getopts是沉默的,那么冒号(':')被放置在name中,OPTARG被设置为找到的选项字符。

hash
hash [-r] [-p filename] [-dt] [name]

每次调用hash时,都会记住指定为name参数的命令的完整路径名,所以在随后的调用中不需要搜索它们。 这些命令是通过搜索$PATH中列出的目录找到的。 任何以前记住的路径名被丢弃。 -p选项禁止路径搜索,filename用作name的位置。 -r选项会导致shell忘记所有记忆的位置。 -d选项会导致shell忘记每个name的记忆位置。 如果提供-t选项,将打印每个name对应的完整路径名。 如果在-t中提供了多个name参数,则会在散列完整路径名之前打印name -l选项使输出以可以重新用作输入的格式显示。 如果没有给出参数,或者只提供-l ,则会打印有关记住的命令的信息。 除非找不到name或提供了无效的选项,否则返回状态为零。

pwd
pwd [-LP]

打印当前工作目录的绝对路径名。 如果提供-P选项,则打印的路径名将不包含符号链接。 如果提供了-L选项,则打印的路径名可能包含符号链接。 返回状态为零,除非在确定当前目录的名称时遇到错误或者提供了一个无效的选项。

readonly
readonly [-aAf] [-p] [name[=value]] …

将每个name标记为只读。 这些名称的值可能不会被随后的赋值改变。 如果提供-f选项,则每个name都指向一个shell函数。 -a选项意味着每个name引用一个索引数组变量; -A选项意味着每个name指的是一个关联数组变量。 如果提供了这两个选项,那么-A优先。 如果没有给出name参数,或者提供了-p选项,则将打印所有只读名称的列表。 其他选项可用于将输出限制为只读名称集合的子集。 -p选项会使输出以可作为输入重用的格式显示。 如果变量名后跟 =value,则该变量的值将设置为value 返回状态为零,除非提供了无效的选项,name参数之一不是有效的shell变量或函数名称,或者-f选项与这个名字不是一个shell函数。

return
return [n]

导致shell函数停止执行并将值n返回给调用者。 如果没有提供n,则返回值是在函数中执行的最后一个命令的退出状态。 如果return由陷阱处理程序执行,则用于确定状态的最后一个命令是陷阱处理程序之前执行的最后一个命令。 如果returnDEBUG陷阱中执行,则用于确定状态的最后一个命令是陷阱处理程序在return之前执行的最后一个命令调用。 return也可以用来终止正在执行的脚本的执行 . source)内置函数,返回脚本的退出状态,或者返回n或脚本内执行的最后一个命令的退出状态。 如果提供n,则返回值是其最低有效8位。 任何与RETURN陷阱关联的命令都会在执行恢复之前,在函数或脚本之后执行。 如果return提供了一个非数字参数或者在函数外部使用而不是在通过. 或 source 来执行脚本期间返回状态是非零 .

shift
shift [n]

将位置参数向左移动n个位置。从n +1 ... $#的位置参数被重命名为$1 ... $#-n。由数字$#$#-n+1表示的参数被取消设置。 n必须是小于或等于$#的非负数。 如果n为零或大于$#,则位置参数不会改变。 如果n未被提供,则假定为1。 返回状态为零,除非n大于$#或小于零,否则为非零。

test
[
test expr

计算条件表达式expr并返回状态0(true)或1(false)。 每个运算符和操作数必须是一个单独的参数。 表达式由Bash条件表达式中描述的元素组成。 test不接受任何选项,也不接受并忽略--的参数作为选项的结束。

当使用[形式时,命令的最后一个参数必须是]

可以使用以下运算符来组合表达式,按优先级的降序排列。 计算取决于参数的数量;见下文。 当有五个或更多的参数时使用运算符优先级。

! expr

如果expr为假,则为真。

( expr )

返回expr的值。 这可以用来覆盖运算符的正常优先级。

expr1 -a expr2

如果expr1expr2都为真,则为true。

expr1 -o expr2

如果expr1expr2为true,则为true。

内建命令test[使用一组基于参数数量的规则来评估条件表达式。

0个参数

表达式是错误的。

1个参数

当且仅当参数不为null时,表达式才为真。

2个参数

如果第一个参数是“!',当且仅当第二个参数为null时,表达式才为真。 如果第一个参数是一元条件运算符(见Bash条件表达式)之一,如果一元测试为真,则表达式为真。 如果第一个参数不是一个有效的一元运算符,则表达式为false。

3个参数

以列出的顺序应用以下条件。 如果第二个参数是二进制条件运算符之一(参见Bash条件表达式),则表达式的结果是使用第一个和第三个参数作为操作数的二进制测试的结果。 当有三个参数时,'-a'和'-o'运算符被认为是二元运算符。 如果第一个参数是“!',这个值就是使用第二和第三个参数的双参数检验的否定。 如果第一个参数正好是“”,第三个参数正好是“”,则结果是第二个参数的单参数测试。 否则,表达式是错误的。

4个参数

如果第一个参数是“!',结果是否定了由其余参数组成的三个参数表达式的结果。 否则,使用上面列出的规则,根据优先级解析和评估表达式。

5个或更多参数

使用上面列出的规则,根据优先级对表达式进行解析和评估。

当与test[)一起使用时,<>运算符按照字典顺序使用ASCII排序。

times
times

打印出shell及其子项使用的用户和系统时间。 返回状态为零。

trap
trap [-lp] [arg] [sigspec …]

当shell收到信号sigspec时,arg中的命令将被读取和执行。 如果arg不存在(并且存在一个sigspec)或者等于-,当shell启动时每个指定的信号的处置都会重置为信号的值。 如果arg是空字符串,那么每个sigspec指定的信号将被shell和它调用的命令忽略。 如果arg不存在并且-p已被提供,那么shell将显示与每个sigspec关联的陷阱命令。 如果没有提供参数,或者只给出了-p,那么trap将打印与每个信号编号关联的命令列表,这些命令可以作为shell输入重用。 -l 选项会使shell打印一个信号名称列表及其相应的数字。 每个sigspec是信号名称或信号编号。 信号名称不区分大小写,SIG前缀是可选的。

如果sigspec0EXIT,则在shell退出时执行arg 如果一个sigspecDEBUG,那么在一个shell脚本中命令arg在每个简单命令,for 命令,case命令,select命令,每个算术for命令之前执行,在第一个命令之前执行。 有关其在DEBUG陷阱上的作用的详细信息,请参阅shopt内建命令的extdebug选项的详细描述(参见Shopt 内建命令)。 如果一个sigspecRETURN,每次执行一个shell函数或一个脚本时,执行arg . 或者source内建命令完成执行。

如果sigspecERR,则arg被执行,不论是管道(可能包含一个简单命令),一个列表或一个复合命令返回一个非零的退出状态,受以下条件限制。 如果失败的命令是紧跟在until或者while之后的命令列表的一部分,if或者elif保留字后面的一部分,&&或者 || 列表命令的一部分,&&或者 || 结尾命令的一部分,其他在管道结尾的命令的一部分,或者命令的返回状态已经被调用,ERR陷阱不会执行。 !. 这些与errexit-e)选项遵守的条件相同。

进入shell时忽略的信号不能被捕获或重置。 在子shell或子shell环境中,陷阱信号不会被忽略或者重置为初始值,当它被创建时。

返回状态为零,除非sigspec未指定有效信号。

umask
umask [-p] [-S] [mode]

将shell进程的文件创建掩码设置为mode 如果mode以数字开始,则解释为八进制数;如果不是,则将其解释为与chmod命令相同的符号模式掩码。 如果省略mode,则会打印掩码的当前值。 如果提供的-S选项没有使用mode参数,则掩码将以符号格式打印。 如果提供了-p选项,并省略mode,则输出的格式可以重新用作输入。 如果模式成功更改或者没有提供mode参数,返回状态为零,否则为非零。

请注意,当模式被解释为八进制数时,从7中减去umask的每个数字。 因此,022的umask导致755的权限。

unset
unset [-fnv] [name]

删除每个变量或函数name 如果给出-v选项,则每个名称指的是一个shell变量,并且该变量被删除。 如果给出-f选项,则name指的是shell函数,并且函数定义被移除。 如果提供-n选项,并且namenameref属性的变量,则name将被取消设置而不是它引用的变量被取消。 如果提供了-f选项,-n不起作用。 如果没有提供选项,则每个name指向一个变量;如果没有该名称的变量,则任何具有该名称的函数都将被取消设置。 只读变量和函数可能不会被取消设置。 除非name是只读的,否则返回状态为零。


下一页:,上一页:,上一节:Shell内置命令 [目录][索引]

4.2 Bash内建命令

本节介绍在Bash中唯一或已被扩展的内置命令。 其中一些命令是在POSIX标准中指定的。

alias
alias [-p] [name[=value] …]

如果没有参数或使用-p选项,alias将在标准输出中打印别名列表,使其可以作为输入重用。 如果提供了参数,则为给定name的每个value定义一个别名。 如果未给出value,则打印别名的名称和值。 别名在Aliases中有描述。

bind
bind [-m keymap] [-lpsvPSVX]
bind [-m keymap] [-q function] [-u function] [-r keyseq]
bind [-m keymap] -f filename
bind [-m keymap] -x keyseq:shell-command
bind [-m keymap] keyseq:function-name
bind [-m keymap] keyseq:readline-command

显示当前的Readline(参见命令行编辑)键和函数绑定,将一个键序列绑定到Readline函数或宏,或者设置一个Readline变量。 每个非选项参数都是一条命令,因为它将出现在Readline初始化文件中(参见Readline Init File),但每个绑定或命令都必须作为单独的参数传递;例如"\C-x\C-r":re-read-init-file

选项(如果提供)具有以下含义:

-m keymap

使用keymap作为受后续绑定影响的键映射。 可接受的keymap名称是emacsemacs-standardemacs-metaemacs-ctlxvivi-movevi-commandvi-insert vivi-command等价(vi-move也是同义词)。 emacs等同于emacs-standard

-l

列出所有Readline函数的名称。

-p

显示Readline函数名称和绑定,以便可以将它们用作输入或在Readline初始化文件中。

-P

列出当前的Readline函数名称和绑定。

-v

显示Readline变量名称和值,以便它们可以用作输入或在Readline初始化文件中。

-V

列出当前的Readline变量名称和值。

-s

显示绑定到宏的Readline键序列和它们输出的字符串,以便可以将它们用作输入或在Readline初始化文件中。

-S

显示绑定到宏的Readline键序列和它们输出的字符串。

-f filename

filename读取键值绑定。

-q function

查询哪些键调用指定的function

-u function

解除绑定到命名的function的所有键。

-r keyseq

删除keyseq的所有当前绑定。

-x keyseq:shell-command

当输入keyseq时,会导致执行shell-command命令。 执行shell-command时,shell将READLINE_LINE变量设置为Readline行缓冲区的内容,将READLINE_POINT变量设置为当前位置的插入点。 如果执行的命令更改READLINE_LINEREADLINE_POINT的值,则这些新值将反映在编辑状态中。

-X

列出绑定到shell命令的所有关键序列和相关的命令,格式可以重新用作输入。

除非提供了无效选项或发生错误,否则返回状态为零。

builtin
builtin [shell-builtin [args]]

运行一个shell内建函数,传递它args,并返回它的退出状态。 当定义一个与shell内部名称相同的shell函数时,这是非常有用的,在函数中保留了内置函数。 如果shell-builtin不是shell内置命令,则返回状态不为零。

caller
caller [expr]

返回任何活动的子例程调用的上下文(一个shell函数或用 . source内建命令)。

没有exprcaller显示当前子程序调用的行号和源文件名。 如果一个非负整数作为expr提供,caller将显示当前执行调用堆栈中与该位置相对应的行号,子例程名称和源文件。 例如,这个额外的信息可以用来打印堆栈跟踪。 当前帧是0帧。

返回值为0,除非shell不执行子例程调用,或者expr不对应于调用堆栈中的有效位置。

command
command [-pVv] command [arguments …]

使用arguments运行command,忽略名为command的任何shell函数。 只执行shell内置命令或通过搜索PATH找到的命令。 如果有一个名为ls的shell函数,那么在函数中运行'command ls将执行外部命令ls,而不是递归地调用函数。 -p选项意味着为PATH使用默认值,保证找到所有标准实用程序。 如果command找不到或发生错误,则返回状态为127,command 的退出状态为其他值。

如果提供-V-v选项,则会打印command的说明。 -v选项会显示一个单词,指示用于调用command的命令或文件名; -V选项产生更详细的描述。 在这种情况下,如果找到command,则返回状态为零,否则返回非零。

declare
declare [-aAfFgilnrtux] [-p] [name[=value] …]

声明变量并赋予它们属性。 如果没有给出name,则改为显示变量的值。

-p选项将显示每个name的属性和值。 -pname参数一起使用时,将忽略除-f-F之外的其他选项。

-p不带name参数时,declare将显示具有由其他选项指定的属性的所有变量的属性和值。 如果-p不提供其他选项,declare将显示所有shell变量的属性和值。 -f选项将显示限制为shell函数。

-F选项禁止显示函数定义;只打印功能名称和属性。 如果使用shopt(请参见The Shopt Builtin)启用了extdebug shell选项,则定义每个name的源文件名和行号也被显示。 -F意味着-f

即使在shell函数中执行​​declare,当使用-g选项时强制在全局范围创建或修改变量。 在所有其他情况下都被忽略。

以下选项可用于将输出限制为具有指定属性的变量或赋予变量属性:

-a

每个name是一个索引数组变量(请参阅Arrays)。

-A

每个name都是一个关联数组变量(请参阅Arrays)。

-f

仅使用函数名称。

-i

该变量将被视为一个整数;算术计算(参见Shell算术)是在变量分配一个值时执行的。

-l

当变量被分配一个值时,所有的大写字符都被转换成小写字母。 大写属性被禁用。

-n

为每个name赋予nameref属性,使其成为另一个变量的名称引用。 其他变量由name的值定义。 所有对name的引用,赋值和属性修改,除了那些使用或者改变-n属性本身的属性外,都会由name的值引用的变量上执行。 nameref属性不能应用于数组变量。

-r

使name只读。 这些名称不能通过随后的赋值语句赋值或取消设置。

-t

为每个name赋予trace属性。 跟踪的函数继承调用shell中的DEBUGRETURN陷阱。 trace属性对变量没有特殊的含义。

-u

当变量被赋值时,所有的小写字符都被转换成大写字母。 小写属性被禁用。

-x

标记每个name以便通过环境导出到后续命令。

使用'+'替换'-'来关闭属性,除了'+a'不能用来销毁一个数组变量和'+r'不会删除readonly属性。 当在函数中使用时,declare使得每个name局部化,与local命令一样,除非使用-g选项。 如果变量名后跟=value,则该变量的值将设置为value

当使用-a-A和复合赋值语法创建数组变量时,其他属性在后续赋值之前不会生效。

返回状态为零,除非遇到无效选项,尝试使用'-f foo=bar'定义函数,尝试将值赋给只读变量,尝试在不使用复合赋值语法的情况下为数组赋值(请参阅Arrays),其中一个names不是有效的shell变量名称,尝试关闭readonly变量的readonly状态,尝试关闭数组变量的数组状态,或试图用-f显示一个不存在的函数。

echo
echo [-neE] [arg …]

输出arg,以空格分隔,以换行符结尾。 除非发生写入错误,否则返回状态为0。 如果指定了-n,则结尾的换行符被抑制。 如果给出-e选项,则启用对以下反斜线转义字符的解析。 -E选项将禁用这些转义字符的解析,即使在默认情况下解析它们的系统上。 xpg_echo shell选项可用于动态确定echo默认情况下扩展这些转义字符。 echo不会将-解析为选项的结尾。

echo解析以下转义序列:

\a

警报(钟)

\b

退格

\c

进一步压制输出

\e
\E

转义

\f

格式化

\n

新行

\r

回车

\t

水平制表符

\v

垂直制表符

\\

反斜线

\0nnn

8位字符,其值是八进制值nnn(零到三个八进制数字)

\xHH

八位字符,其值是十六进制值HH(一个或两个十六进制数字)

\uHHHH

Unicode值(ISO/IEC 10646)字符,其值是十六进制值HHHH(1到4个十六进制数字)

\UHHHHHHHH

Unicode值(ISO/IEC 10646)字符,其值是十六进制值HHHHHHHH(1到8个十六进制数字)

enable
enable [-a] [-dnps] [-f filename] [name …]

启用和禁用内置shell命令。 禁用内建命令,允许执行与shell内部命名相同的磁盘命令,而不指定完整的路径名,即使shell通常在磁盘命令之前搜索内建命令。 如果使用-n选项,name将被禁用。 否则,name被启用。 例如,要使用通过$PATH而不是shell内置版本找到的test二进制文件,请键入enable -n test

如果提供了-p选项,或者没有name参数,则会打印一个shell内建列表。 没有其他参数,该列表包含所有启用的shell内置函数。 -a选项意味着列出每个内建命令提示是否启用。

-f选项意味着在支持动态加载的系统上从共享对象filename中加载新的内置命令name -d选项将删除一个用-f加载的内建命令。

如果没有选项,则会显示shell内建命令的列表。 -s选项限制enable通过POSIX指定的特殊的内置函数。 如果-s-f一起使用,则新的内建命令变成特殊的内建(参见特殊内建命令)。

返回状态为零,除非name不是shell内置命令,或者从共享对象加载新内建命令时出错。

help
help [-dms] [pattern]

显示有关内置命令的帮助信息。 如果指定了pattern,那么help给出与pattern匹配的所有命令的详细帮助,否则将打印内建列表。

选项(如果提供)具有以下含义:

-d

显示每个pattern的简短描述

-m

以手册页格式显示每个pattern的描述

-s

仅显示每个pattern的简短使用情况摘要

除非没有命令匹配pattern,否则返回状态为零。

let
let expression [expression …]

let内建命令允许对shell变量执行算术运算。 每个expression根据下面在Shell算术中给出的规则进行运算。 如果最后一个expression的计算结果为0,let 返回1;否则返回0。

local
local [option] name[=value] …

对于每个参数,都会创建一个名为name的局部变量,并分配value option可以是declare接受的任何选项。 local只能在函数内使用;它使变量 name有一个可见的范围限制在该函数及其子级。 如果name-,那么shell选项的集合将被调用到调用local的函数中。函数内部的set内置函数在函数返回时恢复为原来的值。 返回状态为零,除非在函数之外使用local,将提供无效的name ,或者name是只读变量。

logout
logout [n]

退出登录shell,将n状态返回到shell的父级。

mapfile
mapfile [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd]
    [-C callback] [-c quantum] [array]

从标准输入读取到索引数组变量array,或者从文件描述符fd,如果使用了 -u 选项,读取行。 变量MAPFILE是默认的array 选项(如果提供)具有以下含义:

-d

delim的第一个字符用于终止每个输入行,而不是换行符。

-n

最多复制count行。 如果count为0,则复制所有行。

-O

开始在索引origin处分配给array 默认索引是0。

-s

丢弃读取的第一行count行。

-t

从每行读取删除尾随的delim(默认换行符)。

-u

从文件描述符fd读取行而不是从标准输入读取。

-C

每次读取quantumP行时,计算callback -c选项指定quantum

-c

指定每次调用callback之间读取的行数。

如果-C没有指定-c,默认量程是5000。 当计算callback时,会提供下一个要分配的数组元素的索引以及要分配给该元素的行作为附加参数。 在读取行之后但在分配数组元素之前计算callback

如果没有提供明确的初始值,mapfile 将在分配给它之前清除array

mapfile将返回成功,除非提供了无效的选项或选项参数,,array无效或不可分配,或array不是索引数组。

printf
printf [-v var] format [arguments]

将格式化的参数写入格式控制下的标准输出。 -v选项会将输出分配给变量var,而不是打印到标准输出。

format是一个字符串,它包含三种类型的对象:简单复制到标准输出的纯字符,转换并复制到标准输出的转义序列的字符和格式规范,每次打印下一个连续的argument 除了标准的printf(1)格式外,printf解析了以下扩展:

%b

使用printf在相应的argument中扩展反斜杠转义序列,方法与echo -e相同(请参阅Bash 内建命令)。

%q

使printf以可以作为shell输入重用的格式输出相应的argument

%(datefmt)T

使printf输出使用datefmt产生的日期时间字符串作为strftime(3)的格式字符串。 相应的argument是一个整数,表示自纪元以来的秒数。 可以使用两个特殊的参数值:-1表示当前时间,-2表示shell被调用的时间。 如果没有指定参数,转换的行为就像给出了-1一样。 这是通常的printf行为的一个例外。

非字符串格式说明符的参数被视为C语言常量,除了允许使用前导加号或减号,并且如果前导字符是单引号或双引号,则该值是以下字符的ASCII值。

根据需要重用format以消耗所有arguments 如果format需要比提供的arguments更多,则额外格式规范的行为就像提供了适当的零值或空字符串一样。 成功返回值为零,失败时为非零。

read
read [-ers] [-a aname] [-d delim] [-i text] [-n nchars]
    [-N nchars] [-p prompt] [-t timeout] [-u fd] [name …]

从标准输入读取一行或从作为参数提供给-u选项的文件描述符fd中读取一行,如单词分隔,第一个词分配给第一个name,第二个词分配给第二个name,依此类推。 如果有比名称更多更多的单词,剩下的单词和它们的中间分隔符被分配到最后一个name 如果从输入流中读取的单词少于名称,则剩余的名称将被分配空值。 IFS变量​​的值中的字符用于把行分隔为单词,和shell扩展将行分割成单词的规则相同(如上面的单词分隔中所述)。 反斜杠字符“\”可用于删除下一个读取字符和续行的特殊含义。 如果未提供名称,则读取的行将分配给变量REPLY 退出状态为零,除非遇到文件结束,read读取超时(在这种情况下,状态大于128),变量赋值错误(例如分配给只读变量)发生,或者提供一个无效的文件描述符作为-u的参数。

选项(如果提供)具有以下含义:

-a aname

这些字被分配给数组变量aname的顺序索引,从0开始。 在分配之前,所有元素都从aname中删除。 其他name参数被忽略。

-d delim

delim的第一个字符用于终止输入行,而不是换行符。

-e

Readline(参见命令行编辑)用于获取行。 Readline使用当前(或默认,如果行编辑以前不活动)编辑设置。

-i text

如果正在使用Readline读取行,在编辑开始之前,将text放入编辑缓冲区。

-n nchars

read 在读取nchars字符后返回,而不是等待完整的输入行,但是如果在读取分隔符字符之前读取少于nchars 字符,使用名义分隔符。

-N nchars

read在完全读取nchars字符之后返回,而不是等待完整的输入行,除非遇到EOF或read 超时。 在输入中遇到的分隔符不作特殊处理,不会导致read返回,直到读取nchars字符才会返回。 结果不会在IFS中的字符上分割;目的是为变量分配恰好读取的字符(反斜杠除外;请参阅下面的-r选项)。

-p prompt

在尝试读取任何输入之前,显示prompt,没有结尾的换行符。 仅当输入来自终端时,才会显示提示。

-r

如果给出这个选项,反斜杠不作为转义字符。 反斜杠被认为是该行的一部分。 特别是,一个反斜杠-换行符对可能不能用作续行。

-s

静默模式。 如果输入来自终端,则字符不会被回显。

-t timeout

如果在timeout 秒之内没有读取完整的输入行(或指定数量的字符),导致read超时并返回失败。 timeout 可能是一个小数点后的小数部分。 此选项仅在read从终端,管道或其他特殊文件读取输入时有效;从常规文件读取时不起作用。 如果read超时,read将任何输入读取部分保存到指定变量name中。 如果timeout为0,read立即返回,而不尝试读取数据。 如果输入在指定的文件描述符上可用,则退出状态为0,否则为非零。 如果超时,退出状态大于128。

-u fd

从文件描述符fd读取输入。

readarray
readarray [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd]
    [-C callback] [-c quantum] [array]

从标准输入读取行到索引数组变量array中,或者从文件描述符fd 中读取行,如果提供了 -u 选项。

mapfile的同义词。

source
source filename

一个同义词(.) . (参见Bourne Shell Builtins)。

type
type [-afptP] [name …]

对于每个name,指出如果用作命令名称将如何解释。

如果使用-t选项,如果name是一个别名,shell函数,shell内建命令,磁盘文件,保留字,则type打印一个单词,即aliasfunctionbuiltinfilekeyword 如果找不到name,则不会打印任何内容,type返回失败状态。

如果使用-p选项,则type返回将被执行的磁盘文件的名称,如果-t返回不是“file”,则不显示。

-P选项强制每个name的路径搜索,即使-t 不会返回file

如果一个命令被散列,那么-p-P选项将输出散列值,该值不一定是在$PATH中最先出现的文件。

如果使用-a选项,则type将返回包含名为file的可执行文件的所有位置。 这包括别名和函数,当且仅当-p选项不被使用。

如果使用-f选项,那么type不会尝试查找shell函数,像command内建命令那样。

如果找到所有名称,返回状态为零,如果没有找到,则返回非零值。

typeset
typeset [-afFgrxilnrtux] [-p] [name[=value] …]

提供typeset命令是为了与Korn shell兼容。 它是declare内置命令的同义词。

ulimit
ulimit [-HSabcdefiklmnpqrstuvxPT] [limit]

在允许这种控制的系统上,ulimit提供对shell启动的进程可用资源的控制。 如果给出选项,则解释如下:

-S

更改并报告与资源关联的软限制。

-H

更改并报告与资源关联的硬限制。

-a

报告当前所有的限制。

-b

最大套接字缓冲区大小。

-c

创建的核心文件的最大大小。

-d

进程数据段的最大大小。

-e

最大的调度优先级(“nice”)。

-f

shell及其子项写入的最大文件大小。

-i

未决信号的最大数量。

-k

可以分配的最大kqueue数量。

-l

可能被锁定到内存的最大大小。

-m

最大常驻尺寸(许多系统不符合此限制)。

-n

打开的文件描述符的最大数量(大多数系统不允许设置该值)。

-p

管道缓冲区大小。

-q

POSIX消息队列中的最大字节数。

-r

最大的实时调度优先级。

-s

最大的堆栈大小。

-t

cpu时间的最大值,以秒为单位。

-u

单个用户可用的最大进程数。

-v

可用于shell的最大虚拟内存量,以及在某些系统上可用的子虚拟内存量。

-x

文件锁的最大数量。

-P

假末端的最大数量。

-T

最大线程数。

如果给定limit,并且不使用-a选项,则limit是指定资源的新值。 指定的limit值,hardsoft, unlimited,分别表示当前的硬限制,软限制,和没有限制。 一旦设置了非root用户,硬限制就不能增加;软限制可以增加到硬限制的值。 否则,除非提供了-H选项,否则将打印指定资源的软限制的当前值。 当设置新的限制时,如果-H-S都没有被提供,硬限制和软限制都被设置。 如果没有给出选项,则假定-f 除了-t(以秒为单位)之外,其他值以1024字节为增量。 -p,以512字节块为单位;-P, -T, -b, -k, -n-u,,它们是未缩放的值;当处于POSIX模式(参见Bash POSIX Mode),-c-f, 512字节的增量。

返回状态为零,除非提供了无效的选项或参数,或者在设置新限制时发生错误。

unalias
unalias [-a] [name … ]

从别名列表中删除每个name 如果-a被提供,所有的别名被删除。 别名在Aliases中有描述。


下一页:,上一页:,上一节:shell内建命令 [目录] [索引]

4.3 修改Shell行为


下一页:,上一节:修改shell行为 [目录] [索引]

4.3.1 Set 内建命令

这个内建命令很复杂,需要单独的一个小节。 set允许您更改shell选项的值并设置位置参数,或者显示shell变量的名称和值。

set
set [--abefhkmnptuvxBCEHPT] [-o option-name] [argument …]
set [+abefhkmnptuvxBCEHPT] [+o option-name] [argument …]

如果没有提供选项或参数,set显示所有shell变量和函数的名称和值(按照当前语言环境排序),格式可以被重新用作输入来设置或重置当前设置变量。 只读变量不能被重置。 POSIX模式中,只列出shell变量。

当提供选项时,它们设置或取消设置shell属性。 选项(如果指定)具有以下含义:

-a

每个创建或修改的变量或函数都被赋予export属性,并标记为导出到后续命令的环境中。

-b

立即报告终止的后台作业的状态,在打印下一个主要提示符之前。

-e

如果一个管道(参见Pipelines),它可能包含一个简单的命令(参见简单命令),一个列表(参见Lists)或复合命令(参阅复合命令)返回非零状态将立即退出。 如果失败的命令是紧跟在whileuntil关键字之后,if条件语句的一部分,在&&||命令列表中,跟在&&或者||结尾命令之后的部分,管道中的任何一个但不是最后一个命令,或者如果命令的返回状态被 ! 调用,shell都不会退出 如果一个子shell以外的复合命令返回一个非零的状态,是因为命令在-e被忽略的时候失败了,shell不会退出。 如果设置了 ERR陷阱,在shell退出之前执行。

此选项单独应用于shell环境和每个子shell环境(请参阅命令执行环境),并且可能会导致子shell在执行子shell中的所有命令之前退出。

如果复合命令或shell函数在忽略-e的上下文中执行,那么复合命令或函数体内执行的命令都不会受到-e设置的影响,即使设置了-e并且一个命令返回一个失败状态。 如果复合命令或shell函数设置了-e选项,当在-e被忽略的上下文中执行时,则该设置将不起作用,直到复合命令或包含命令函数调用完成。

-f

禁用文件名扩展(globbing)。

-h

找到并记住(散列)命令,以便查找并执行。 该选项默认启用。

-k

赋值语句形式的所有参数都放置在一个命令的环境中,而不仅仅是命令名之前的那些。

-m

作业控制已启用(请参阅作业控制)。 所有进程都在一个单独的进程组中运行。 当后台作业完成时,shell会打印一个包含其退出状态的行。

-n

读取命令但不执行它们。 这可以用来检查脚本是否有语法错误。 这个选项被交互式shell忽略。

-o option-name

设置对应于option-name的选项:

allexport

-a相同。

braceexpand

-B相同。

emacs

使用emacs风格的行编辑界面(请参阅命令行编辑)。 这也影响用于read -e的编辑界面。

errexit

-e相同。

errtrace

-E相同。

functrace

-T相同。

hashall

-h相同。

histexpand

-H相同。

history

启用命令历史记录,如Bash History Facilities中所述。 交互式shell中默认使用此选项。

ignoreeof

读取到EOF后交互式shell不会退出。

keyword

-k相同。

monitor

-m相同。

noclobber

-C相同。

noexec

-n相同。

noglob

-f相同。

nolog

目前被忽略。

notify

-b相同。

nounset

-u相同。

onecmd

-t相同。

physical

-P相同。

pipefail

如果设置,管道的返回值是以非零状态退出的最后一个(最右边的)命令的值,如果管道中的所有命令都成功退出,则为零。 该选项默认是禁用的。

posix

更改bash行为,把默认与POSIX标准不同的操作改为与标准相同的操作(见Bash POSIX Mode)。 这是为了使Bash表现为该标准的严格超集。

privileged

-p相同。

verbose

-v相同。

vi

使用vi-风格的行编辑界面。 这也影响用于 read -e的编辑界面。

xtrace

-x相同。

-p

打开特权模式。 在这种模式下,不处理$BASH_ENV$ ENV文件,shell函数不会从环境中继承,而SHELLOPTSBASHOPTSCDPATHGLOBIGNORE变量,如果它们出现在环境中,则会被忽略。 如果启动的shell的有效用户(组)id与实际用户(组)id不相同,并且没有提供-p选项,则执行这些操作,并且有效用户标识为设置为真实的用户ID。 如果在启动时提供-p选项,则不会重置有效的用户标识。 关闭此选项会导致有效的用户和组ID被设置为真实的用户和组ID。

-t

读取并执行一个命令后退出。

-u

在执行参数扩展时,将特殊参数“@”或“*”以外的变量和参数视为错误。 一条错误消息将被写入标准错误,一个非交互式shell将退出。

-v

在读取shell时输出shell行。

-x

打印一些简单的命令, for命令,case命令,select命令以及算术for命令及其参数或相关的单词列表,在它们被展开之后并且在它们被执行之前。 PS4 变量​​的值被展开,结果值被打印在命令及其扩展参数之前。

-B

shell将执行大括号扩展(参见Brace Expansion)。 这个选项默认是打开的。

-C

防止使用‘>’, ‘>&’, 和‘<>’来输出重定向覆盖现有文件。

-E

如果设置,那么ERR上的任何陷阱都会被shell函数,命令替换和在子shell环境中执行的命令继承。 在这种情况下,ERR陷阱通常不会被继承。

-H

启用“!'风格历史替代(参见历史交互)。 对于交互式shell,这个选项默认是打开的。

-P

如果设置,请不要在执行更改当前目录的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

如果设置,那么在DEBUGRETURN上的任何陷阱都会被shell函数,命令替换和在子shell环境中执行的命令继承。 在这种情况下,DEBUGRETURN陷阱通常不会被继承。

--

如果没有参数遵循这个选项,那么位置参数是未设置的。 否则,位置参数被设置为arguments,即使它们中的一些以“-”开始。

-

指示选项结束,使所有剩余的arguments 分配给位置参数。 -x-v选项被关闭。 如果没有参数,位置参数保持不变。

使用'+'而不是' - '会导致这些选项被关闭。 这些选项也可以在调用shell时使用。 当前的选项集可以在$-中找到。

其余的N arguments是位置参数,按顺序分配给$1$2,... $N 特殊参数设置为N.

除非提供无效选项,否则返回状态始终为零。


前一页: , 上一节: 修改bash行为   [目录][索引]

4.3.2 Shopt 内建命令

这个内建命令允许你改变额外的shell可选行为。

shopt
shopt [-pqsu] [-o] [optname …]

切换控制可选shell行为的设置值。 这些设置可以是下面列出的设置,或者如果使用-o选项,可以使用set内建命令的-o选项(参见Set Builtin)。 如果没有选项或使用-p选项,将显示所有可设置选项的列表,并显示是否设置了每个选项。 -p选项使输出显示为可作为输入重用的形式。 其他选项具有以下含义:

-s

启用(设置)每个optname

-u

禁用(取消设置)每个optname

-q

抑制正常输出;返回状态指示optname是否已设置或未设置。 如果使用-q给出多个optname参数,则如果所有optnames都被启用,则返回状态为零;否则非零。

-o

optname的值限制为set内建命令-o选项定义的值(请参阅Set 内建命令 )。

如果-s-u选项使用时,没有optname参数,则shopt仅分别显示这些选项设置或未设置。

除非另有说明,默认情况下,shopt的选项被禁用(关闭)。

如果所有optnames启用,列表选项的返回状态为零,否则为非零。 设置或取消设置选项时,返回状态为零,除非optname不是有效的shell选项。

shopt选项的列表是:

autocd

如果设置,那么作为目录名称的命令名称被执行,就像它是cd命令的参数一样。 该选项仅用于交互式shell。

cdable_vars

如果设置了这个参数,那么cd内置命令不是一个目录的参数被认为是一个变量的名称,其值是要改变的目录。

cdspell

如果设置,cd命令中目录组成的拼写错误将被纠正。 检查的错误是位置变换字符,缺少字符和字符太多。 如果找到更正,则打印更正的路径,然后继续执行命令。 该选项仅用于交互式shell。

checkhash

如果设置了这个选项,Bash会检查在哈希表中找到的命令是否存在,然后再尝试执行它。 如果散列命令不再存在,则执行正常的路径搜索。

checkjobs

如果设置,Bash会在退出交互式shell之前列出所有已停止和正在运行的作业的状态。 如果任何作业正在运行,则会导致退出被推迟,直到尝试执行第二次退出而没有中间命令(请参阅作业控制)。 如果没有任何作业停止,shell总是推迟退出。

checkwinsize

如果设置,Bash将在每个命令之后检查窗口大小,如有必要,将更新LINESCOLUMNS的值。

cmdhist

如果设置,Bash会尝试将多行命令的所有行保存在同一个历史记录条目中。 这允许轻松地重新编辑多行命令。

compat31

如果设置,则Bash将其行为更改为版本3.1的相对于条件命令“=〜”运算符的引用参数的行为,并且相对于使用[[ 条件命令的‘ < ’ 和 ‘>’ 运算符。 bash-4.1之前的bash版本使用ASCII排序顺序和字符比较(3); bash-4.1及更高版本使用当前语言环境的排序顺序和字符排序(3)。

compat32

如果设置,当使用[[条件命令的<’和‘>’操作符(参见前面的项目)时,Bash将其行为更改为版本3.2相对于特定于语言环境的字符串比较的行为,以及中断命令列表的效果。 Bash版本3.2和更早的版本在列表中的下一个命令由于中断而终止之后继续执行。

compat40

如果设置,当使用[[条件命令的 ‘<’ 和‘>’ 操作符(参见compat31的描述)时,Bash将其行为更改为特定于语言环境的字符串比较, 以及中断命令列表的效果。 Bash版本4.0和更高版本中断列表,就好像shell收到中断一样;以前的版本继续使用列表中的下一个命令。

compat41

如果设置,Bash则在POSIX模式下,将双引号参数扩展中的单引号视为特殊字符。 单引号必须匹配(偶数),单引号之间的字符被认为是引用的。 这是通过版本4.1的POSIX模式的行为。 默认的Bash行为与以前的版本保持一致。

compat42

如果设置,Bash不使用引用移除来处理替换字扩展中的替换字符串。

compat43

如果设置,如果尝试使用带引号的复合数组赋值作为declare的参数,则Bash不会打印警告消息,使字扩展错误成为导致当前命令失败的非致命错误(默认行为是使它们成为致命的错误,导致shell退出),并且在执行shell函数时不重置循环状态(这允许breakcontinue 在shell函数中影响调用者上下文中的循环)。

complete_fullquote

如果设置,Bash在执行完成时引用文件名和目录名中的所有shell元字符。 如果未设置,则Bash将从元字符集中移除元字符,例如当这些元字符出现在要完成的单词的shell变量引用中时,元字符将在完整的文件名中引用。 这意味着变量名称中扩展到目录的美元符号不会被引用。不过,文件名中出现的任何美元符号也不会被引用。 只有当bash使用反斜杠来引用完整的文件名时,这才是有效的。 这个变量是默认设置的,这是4.2版本中默认的Bash行为。

direxpand

如果设置,Bash将在执行文件名完成时用扩展名的结果替换目录名。 这改变了readline编辑缓冲区的内容。 如果未设置,Bash会尝试保留用户输入的内容。

dirspell

如果设置,如果最初提供的目录名称不存在,Bash将在单词完成期间尝试对目录名称进行拼写更正。

dotglob

如果设置,Bash包含以文件名扩展结果中的‘.’开始的文件名。

execfail

如果设置了这个参数,如果不能执行指定给exec内建命令参数的文件,一个非交互的shell将不能退出。 如果exec失败,交互式shell不会退出。

expand_aliases

如果设置,别名将按照别名Aliases中的描述进行扩展。 交互式shell默认启用此选项。

extdebug

如果设置为shell调用,则在shell启动之前安排执行调试器配置文件,与--debugger 选项相同。 如果在调用之后进行设置,则打开供调试器使用的行为:

  1. 内置的declare-F选项(参见Bash Builtins)显示了与每个函数名相对应的源文件名和行号参数。
  2. 如果由DEBUG陷阱运行的命令返回非零值,则跳过下一个命令并且不执行。
  3. 如果由DEBUG陷阱运行的命令返回值为2,并且shell在子例程中执行(shell函数或由 . source 内建命令),shell模拟对return的调用。
  4. BASH_ARGCBASH_ARGV按照其描述进行更新(请参阅Bash变量)。
  5. 函数跟踪已启用:命令替换,shell函数和使用( command ) 调用的子shell继承DEBUGRETURN 陷阱。
  6. 启用错误跟踪:命令替换,shell函数和使用command调用的子shell继承ERR陷阱。
extglob

如果设置,则启用上述扩展模式匹配功能(请参阅模式匹配)。

extquote

如果设置,在双引号之间的${parameter}扩展 $'string'$"string"引用被执行。 该选项默认启用。

failglob

如果设置,文件名扩展期间不匹配文件名的模式会导致扩展错误。

force_fignore

如果设置,即使被忽略的字是唯一可能的完成,由FIGNORE shell变量指定的后缀也会导致在执行完成字时忽略字。 请参阅Bash Variables,了解FIGNORE的说明。 该选项默认启用。

globasciiranges

如果设置,则在执行比较时,模式匹配括号表达式(请参阅模式匹配)中使用的范围表达式就像在传统的C语言环境中一样。 也就是说,当前语言环境的排序顺序没有考虑到,所以'b'不会在'AB之间进行整理。 大写和小写ASCII字符将整理在一起。

globstar

如果设置,文件扩展上下文中使用的模式“**”将匹配所有文件和零个或多个目录和子目录。 如果模式之后是“/”,则只有目录和子目录匹配。

gnu_errfmt

如果设置,shell错误消息将以标准的GNU错误消息格式写入。

histappend

如果设置,那么在shell退出时,历史列表将追加到由HISTFILE变量​​的值命名的文件中,而不是覆盖文件。

histreedit

如果设置,并且正在使用Readline,则用户有机会重新编辑失败的历史记录替换。

histverify

如果设置,并且正在使用Readline,则历史替换的结果不会立即传递给shell解析器。 相反,生成的行将被加载到Readline编辑缓冲区中,以便进一步修改。

hostcomplete

如果设置,并且正在使用Readline,则当包含“@”的单词正在完成时,Bash将尝试执行主机名完成(请参阅Commands For Completion)。 该选项默认启用。

huponexit

如果设置,当交互式登录shell退出时,Bash将发送SIGHUP到所有作业(参见Signals)。

inherit_errexit

如果设置,命令替换将继承errexit选项的值,而不是在子shell环境中取消设置。 POSIX模式启用时,该选项被启用。

interactive_comments

允许以 ‘#’ 开头的单词在交互式shell中忽略该单词和该行上的所有剩余字符。 该选项默认启用。

lastpipe

如果设置,并且作业控制未激活,则shell将运行当前shell环境中未在后台执行的管道的最后一个命令。

lithist

如果启用,并且启用了cmdhist选项,多行命令将被保存到带有嵌入换行符的历史记录中,而不是在可能的情况下使用分号分隔符。

login_shell

如果shell是作为登录shell启动的,请设置此选项(请参阅调用Bash)。 该值可能不会更改。

mailwarn

如果设置,并且Bash正在检查邮件的文件自上次检查以来已被访问,则显示"The mail in mailfile has been read"

no_empty_cmd_completion

如果设置,并且正在使用Readline,Bash将不会尝试在空行尝试完成时搜索PATH中可能的完成项。

nocaseglob

如果设置,在执行文件名扩展时,Bash以不区分大小写的方式匹配文件名。

nocasematch

如果设置,则在执行case[[条件命令时执行匹配时,Bash以不区分大小写的方式匹配模式,执行模式替换字展开或者筛选可能的完成时作为可编程完成的一部分。

nullglob

如果设置,Bash允许文件名模式匹配没有文件扩展到一个空字符串,而不是自己。

progcomp

如果设置,则可编程完成设备(参见可编程完成)已启用。 该选项默认启用。

promptvars

如果设置,提示字符串按照如下所述进行参数扩展,命令替换,算术扩展和引用移除(参见控制提示)。 该选项默认启用。

restricted_shell

如果在限制模式下启动,shell会设置此选项(请参阅受限Shell)。 该值可能不会更改。 启动文件执行时不会重置,允许启动文件发现是否限制了shell。

shift_verbose

如果设置了这个值,当移位计数超过位置参数的数量时,shift内建命令打印错误消息。

sourcepath

如果设置,source内建命令使用PATH的值来查找包含作为参数提供的文件的目录。 该选项默认启用。

xpg_echo

如果设置,默认情况下,echo内置扩展反斜杠转义序列。

如果所有optnames启用,列表选项的返回状态为零,否则为非零。 设置或取消设置选项时,返回状态为零,除非optname不是有效的shell选项。


上一页:,上一节:Shell内置命令 [目录] [索引]

4.4 特别内建命令

由于历史原因,POSIX标准将几个内置命令分类为special 当Bash以POSIX模式执行时,特殊的内建函数在三个方面与其他的内建函数不同:

  1. 在命令查找过程中,在shell函数之前找到了特殊的内建函数。
  2. 如果一个特殊的内建函数返回一个错误状态,一个非交互式的shell将退出。
  3. 命令前的赋值语句在命令完成后在shell环境中保持有效。

当Bash没有以POSIX模式执行时,这些内建行为与Bash内建命令的其余部分没有区别。 Bash POSIX模式在Bash POSIX Mode中描述。

这些是POSIX特殊的内建函数:

break : . continue eval exec exit export readonly return set
shift trap unset

下一页:,上一页:,上一节:Top [目录] [索引]

5 Shell变量

本章介绍Bash使用的shell变量。 Bash自动将默认值分配给一些变量。


下一页:,上一节:Shell变量 [目录] [索引]

5.1 Bourne Shell变量

Bash以与Bourne shell相同的方式使用某些shell变量。 在某些情况下,Bash为变量分配一个默认值。

CDPATH

用作cd内置命令的搜索路径的以冒号分隔的目录列表。

HOME

当前用户的主目录;内置命令cd的默认值。 这个变量的值也被波浪字符扩展使用(参见Tilde扩展)。

IFS

分隔字段的字符列表;当shell拆分作为扩展的一部分时使用。

MAIL

如果此参数设置为文件名或目录名,并且未设置MAILPATH变量​​,Bash会通知用户邮件到达指定文件或Maildir格式目录。

MAILPATH

shell定期检查新邮件的以冒号分隔的文件名列表。 每个列表条目都可以指定新邮件到达邮件文件时打印的邮件,方法是将邮件中的文件名与“?”。 当在消息文本中使用时,$_展开为当前邮件文件的名称。

OPTARG

内置的getopts处理的最后一个选项参数的值。

OPTIND

内置的getopts处理的最后一个选项参数的索引。

PATH

shell查找命令的冒号分隔列表。 PATH值中的零长度(空)目录名表示当前目录。 空目录名称可能显示为两个相邻的冒号,或者作为初始或结尾冒号。

PS1

主要提示字符串。 默认值是'\s-\v\$ ”。 请参阅控制提示,以获取在显示PS1之前展开的转义序列的完整列表。

PS2

辅助提示字符串。 默认值是'> ’。


上一页:,上一节:Shell变量 [目录] [索引]

5.2 Bash变量

这些变量是由Bash设置或使用的,但其他shell通常不会特别对待它们。

Bash使用的一些变量在不同的章节中有描述:用于控制作业控制工具的变量(参见作业控制变量)。

BASH

用于执行Bash的当前实例的完整路径名。

BASHOPTS

启用shell选项的冒号分隔列表。 列表中的每个单词都是shopt内置命令的-s选项的有效参数(参见The Shopt Builtin)。 出现在BASHOPTS中的选项是由shopt用‘on’选项报告的。 如果此变量在Bash启动时处于环境中,则在读取任何启动文件之前将启用列表中的每个shell选项。 这个变量是只读的。

BASHPID

扩展为当前Bash进程的进程ID。 这在某些情况下不同于$$,例如不需要重新初始化Bash的子shell。

BASH_ALIASES

一个关联数组变量,其成员对应于由alias内置维护的别名内部列表。 (参见Bourne Shell Builtins)。 添加到此数组的元素显示在别名列表中;但是,取消设置数组元素当前不会导致别名从别名列表中删除。 如果BASH_ALIASES未被设置,即使随后被重置,它也会失去其特殊属性。

BASH_ARGC

一个数组变量,其值是当前bash执行调用堆栈的每个帧中的参数数量。 当前子例程的参数个数(shell函数或脚本执行的 . source)位于堆栈顶部。 当一个子程序被执行时,传递的参数数量被压入BASH_ARGC 仅当处于扩展调试模式时,shell才会设置BASH_ARGC(参见The Shopt 内建命令shopt内建命令extdebug选项的描述)。

BASH_ARGV

包含当前bash执行调用堆栈中所有参数的数组变量。 最后一个子程序调用的最后一个参数位于堆栈顶部。初始调用的第一个参数在底部。 执行子程序时,所提供的参数被压入BASH_ARGV 仅当处于扩展调试模式时,shell才会设置BASH_ARGV(参见 The Shopt Builtinshopt内建命令extdebug选项的描述)。

BASH_CMDS

一个关联数组变量,其成员对应于由hash内置维护的命令的内部哈希表(参见Bourne Shell Builtins)。 添加到此数组的元素出现在散列表中;但是,当前未设置数组元素不会导致从哈希表中删除命令名称。 如果BASH_CMDS未被设置,即使随后被重置,它也会失去其特殊属性。

BASH_COMMAND

当前正在执行或即将执行的命令,除非shell正在执行命令作为陷阱的结果,在这种情况下,它是执行陷阱时的命令。

BASH_COMPAT

该值用于设置外壳的兼容性级别。 参见Shopt Builtin,了解各种兼容级别及其效果的描述。 该值可以是对应于期望的兼容性等级的十进制数(例如4.2)或整数(例如,42)。 如果BASH_COMPAT未设置或设置为空字符串,则将兼容级别设置为当前版本的默认级别。 如果将BASH_COMPAT设置为不是有效兼容级别之一的值,则shell将打印一条错误消息,并将兼容级别设置为当前版本的默认级别。 有效的兼容性级别对应于上面描述的shopt内置的兼容性选项(例如,compat42表示4.2和42是有效的值)。 当前版本也是一个有效的值。

BASH_ENV

如果在调用Bash来执行shell脚本时设置此变量,则在执行脚本之前将其值扩展并用作要读取的启动文件的名称。 请参阅Bash启动文件

BASH_EXECUTION_STRING

-c调用选项的命令参数。

BASH_LINENO

一个数组变量,其成员是调用FUNCNAME中每个相应成员的源文件中的行号。 ${BASH_LINENO[$i]}是在源文件(${BASH_SOURCE[$i+1]})中${FUNCNAME[$i]}被调用的地方的行号,(或者是在另一个shell中引用的 ${BASH_LINENO[$i-1]})。 使用LINENO获取当前行号。

BASH_LOADABLES_PATH

一个以冒号分隔的目录列表,其中shell查找由enable命令指定的可动态装入的内建文件。

BASH_REMATCH

一个数组变量,其成员由“=〜”二元运算符分配给[[条件命令(参见条件构造))。 索引为0的元素是匹配整个正则表达式的字符串部分。 索引n的元素是匹配第n个括号的子表达式的字符串部分。 这个变量是只读的。

BASH_SOURCE

一个数组变量,其成员是定义FUNCNAME数组变量中相应shell函数名称的源文件名。 shell函数${FUNCNAME[$i]}在文件${BASH_SOURCE[$i]}中定义,并从${BASH_SOURCE[$i+1]}中调用。

BASH_SUBSHELL

在每个子shell或子shell环境中,当一个shell开始执行时,该变量的值增加一。 初始值是0。

BASH_VERSINFO

一个只读数组变量(见Arrays),其成员持有Bash实例的版本信息。 分配给数组成员的值如下所示:

BASH_VERSINFO[0]

主版本号(版本)。

BASH_VERSINFO[1]

小版本号(版本)。

BASH_VERSINFO[2]

补丁级别。

BASH_VERSINFO[3]

构建版本。

BASH_VERSINFO[4]

发布状态(例如,beta1)。

BASH_VERSINFO[5]

MACHTYPE的值。

BASH_VERSION

Bash的当前实例的版本号。

BASH_XTRACEFD

如果设置为一个对应于有效文件描述符的整数,Bash将把启用'set -x'时生成的跟踪输出写入该文件描述符。 这允许跟踪输出与诊断和错误消息分离。 BASH_XTRACEFD未设置或分配新值时,文件描述符关闭。 取消设置BASH_XTRACEFD或为其分配空字符串会导致将跟踪输出发送到标准错误。 请注意,将BASH_XTRACEFD设置为2(标准错误文件描述符),然后取消设置将导致标准错误被关闭。

CHILD_MAX

设置shell记录的退出子状态值的数量。 Bash不允许这个值降低到POSIX授予的最小值以下,并且有一个不能超过的最大值(现在是8192)。 最小值取决于系统。

COLUMNS

select命令用于确定打印选择列表时的终端宽度。 自动设置是否启用了checkwinsize选项(参见The Shopt Builtin),或者在收到SIGWINCH时在交互式shell中自动设置。

COMP_CWORD

包含当前光标位置的单词的索引${COMP_WORDS} 该变量仅在可编程完成工具调用的shell函数中可用(请参阅可编程完成)。

COMP_LINE

当前的命令行 该变量仅在可编程完成工具调用的shell函数和外部命令中可用(请参见可编程完成)。

COMP_POINT

当前光标位置相对于当前命令开始的索引。 如果当前光标位置在当前命令的末尾,则该变量的值等于${#COMP_LINE} 该变量仅在可编程完成工具调用的shell函数和外部命令中可用(请参见可编程完成)。

COMP_TYPE

设置为与导致完成函数被调用的尝试完成类型对应的整数值:TAB,对于正常完成,?',在连续标签后列出完成,'!',用于在部分单词完成时列出替代项“@”,以列出完成项(如果该单词不是未修改的),或者,以完成菜单。 该变量仅在可编程完成工具调用的shell函数和外部命令中可用(请参见可编程完成)。

COMP_KEY

用于调用当前完成功能的键(或按键顺序的最后一个键)。

COMP_WORDBREAKS

Readline库在执行单词完成时将其视为字词分隔符的一组字符。 如果未设置COMP_WORDBREAKS,则即使随后重置,也会失去其特殊属性。

COMP_WORDS

一个数组变量,由当前命令行中的各个单词组成。 该行被分割为单词,因为Readline会将其拆分,如上所述使用COMP_WORDBREAKS 该变量仅在可编程完成工具调用的shell函数中可用(请参阅可编程完成)。

COMPREPLY

一个数组变量,Bash从中读取由可编程完成工具调用的shell函数生成的可能完成(参见可编程完成)。 每个数组元素包含一个可能的完成。

COPROC

创建一个数组变量,用于保存文件描述符,以输出和输入到未命名的协处理(请参见Coprocesses)。

DIRSTACK

包含目录堆栈当前内容的数组变量。 目录按照它们由内置的dirs显示的顺序出现在堆栈中。 分配给这个数组变量的成员可以用来修改已经在栈中的目录,但是必须使用pushdpopd内建的目录来添加和删除目录。 赋值给这个变量不会改变当前目录。 如果DIRSTACK未设置,即使后来重置,它也会失去其特殊属性。

EMACS

如果Bash在shell以t开始的环境中找到这个变量,它假定shell运行在一个Emacs shell缓冲区中并禁用行编辑。

ENV

类似于BASH_ENV;当在POSIX模式下调用shell时使用(参见Bash POSIX模式)。

EUID

当前用户的数字有效用户标识。 这个变量是只读的。

EXECIGNORE

一个以冒号分隔的shell模式列表(参见模式匹配),用于定义要使用PATH命令搜索忽略的文件名列表。 完整路径名匹配这些模式之一的文件不会被认为是可执行文件,用于通过PATH查找完成和执行命令。 这不会影响[test,和[[ 命令)的行为。 命令散列表中的完整路径名不受EXECIGNORE的限制。 使用此变量忽略具有可执行位设置但不是可执行文件的共享库文件。 模式匹配符合extglob shell选项的设置。

FCEDIT

内置命令fc-e选项指定编辑器用作默认编辑器。

FIGNORE

执行文件名完成时忽略冒号分隔的后缀列表。 文件名后缀匹配FIGNORE中的一个条目的文件名被排除在匹配的文件名列表之外。 样本值是‘.o:~'

FUNCNAME

包含当前执行调用堆栈中所有shell函数名称的数组变量。 索引为0的元素是任何当前正在执行的shell函数的名称。 最底部的元素(索引最高的元素)是“main” 这个变量只有在shell函数执行时才存在。 FUNCNAME的分配不起作用。 如果FUNCNAME未被设置,即使随后被重置,它也会失去其特殊属性。

这个变量可以和BASH_LINENOBASH_SOURCE一起使用。 FUNCNAME中的每个元素在BASH_LINENOBASH_SOURCE中都有对应的元素来描述调用堆栈。 例如,${FUNCNAME[$i]}从文件${BASH_SOURCE[$i+1]}中第${BASH_LINENO[$i]}行调用。 caller内建命令使用此信息显示当前的调用堆栈。

FUNCNEST

如果设置为大于0的数值,则定义最大函数嵌套级别。 超过此嵌套级别的函数调用将导致当前命令中止。

GLOBIGNORE

一个以冒号分隔的模式列表,用于定义由文件名扩展忽略的一组文件名。 如果文件名扩展模式匹配的文件名也与GLOBIGNORE中的一个模式相匹配,则将从匹配列表中删除。 模式匹配符合extglob shell选项的设置。

GROUPS

包含当前用户所属的组的列表的数组变量。 分配给GROUPS不起作用。 如果GROUPS未设置,即使随后重置,它也会失去其特殊属性。

histchars

最多可控制三个字符,控制历史扩展,快速替换和标记(请参阅历史记录交互)。 第一个字符是历史扩展字符,即表示历史扩展开始的字符,通常是“!”。 第二个字符是当作为一行上的第一个字符(通常是“^”)时表示“快速替换”的字符。 可选的第三个字符是当字符的第一个字符(通常是“”)时,表示该行的其余部分是注释的字符。 历史注释字符导致历史替换被跳过,用于行上的其余单词。 这不是导致shell解析器将该行的其余部分视为注释所必需的。

HISTCMD

当前命令的历史记录号或历史记录列表中的索引。 如果HISTCMD未被设置,即使随后被重置,它也会失去其特殊属性。

HISTCONTROL

一个以冒号分隔的值列表,控制如何将命令保存在历史列表中。 如果值列表包含“ignorespace”,则以空格字符开头的行不会保存在历史记录列表中。 ignoredups”的值会导致与以前的历史记录条目匹配的行不被保存。 'ignoreboth'的值是'ignorespace'和'ignoredups'的缩写。 值为'erasedups'会导致在保存该行之前,所有与当前行相匹配的行都将从历史列表中删除。 不在以上列表中的任何值都将被忽略。 如果未设置HISTCONTROL或未包含有效值,则shell解析器读取的所有行将保存在历史记录列表中,并受到HISTIGNORE值的限制。 多行复合命令的第二行和后续行不会被测试,并且不管HISTCONTROL的值如何都被添加到历史记录中。

HISTFILE

保存命令历史的文件的名称。 默认值是 ~/.bash_history

HISTFILESIZE

历史文件中包含的最大行数。 当这个变量被分配一个值时,如果需要,历史文件被截断,通过移除最旧的条目来包含不超过该行数。 在shell退出时,历史文件也被截断为这个大小。 如果值为0,则历史文件将被截断为零大小。 非数字值和小于零的数值会禁止截断。 读取任何启动文件后,shell将默认值设置为HISTSIZE的值。

HISTIGNORE

以冒号分隔的模式列表,用于决定哪些命令行应保存在历史列表中。 每个模式都固定在行的开头,并且必须匹配完整的行(不附加隐式的“*”)。 在应用HISTCONTROL指定的检查之后,每个模式都将根据该行进行测试。 除了正常的shell模式匹配字符之外,“&”与之前的历史记录行相匹配。 '&'可以使用反斜线进行转义;在尝试匹配之前,反斜杠被删除。 多行复合命令的第二行和后续行不会被测试,并被添加到历史记录中,而不管HISTIGNORE的值如何。 模式匹配符合extglob shell选项的设置。

HISTIGNORE包含HISTCONTROL的功能。 '&'的模式与ignoredups完全相同,而[]*的模式与ignorespace 完全相同。 将这两个模式组合在一起,用冒号分隔,提供了ignoreboth的功能。

HISTSIZE

在历史列表中记录的最大命令数。 如果该值为0,则命令不会保存在历史列表中。 小于零的数值会导致每个命令都被保存在历史列表中(没有限制)。 读取任何启动文件后,shell将缺省值设置为500。

HISTTIMEFORMAT

如果此变量设置为非空值,则将其值用作strftime的格式字符串,以打印与由history显示的每个历史记录条目相关联的时间戳记。 如果设置了这个变量,时间戳记将被写入到历史文件中,以便它们可以保留在shell会话中。 这使用历史注释字符来区分其他历史行的时间戳。

HOSTFILE

包含与/etc/hosts相同格式的文件名,当shell需要完成主机名时应读取该文件。 在shell运行时,可能的主机名完成列表可能会改变;下一次在值更改后尝试主机名完成,Bash将新文件的内容添加到现有列表中。 如果设置了HOSTFILE,但没有值,或者没有命名可读文件,Bash将尝试读取/etc/hosts以获取可能的主机名完成列表。 HOSTFILE未设置时,主机名列表被清除。

HOSTNAME

当前主机的名称。

HOSTTYPE

对Bash运行所在机器的描述。

IGNOREEOF

将收到EOF字符时的shell操作作为唯一的输入。 如果设置,则表示连续的EOF个字符的数量,这些字符可以在shell将退出之前作为输入行中的第一个字符读取。 如果变量存在但没有数字值(或没有值),则默认值为10。 如果该变量不存在,那么EOF表示输入到shell的结束。 这只对交互式shell有效。

INPUTRC

Readline初始化文件的名称,覆盖~/.inputrc的默认值。

LANG

用于确定任何类别的区域设置类别,这些类别不是以LC_开头的变量专门选择的。

LC_ALL

该变量覆盖LANG和指定语言环境类别的任何其他LC_变量的值。

LC_COLLATE

此变量确定文件扩展结果排序时使用的排序顺序,并确定文件名扩展和模式匹配(请参阅文件名扩展)中的范围表达式,等价类和排序序列的行为。

LC_CTYPE

这个变量决定了文件扩展和模式匹配中字符的解释和字符类的行为(参见文件名扩展)。

LC_MESSAGES

该变量确定用于翻译以“$”开头的双引号字符串的区域设置(请参阅Locale Translation)。

LC_NUMERIC

此变量确定用于数字格式的区域设置类别。

LC_TIME

此变量确定用于数据和时间格式的区域设置类别。

LINENO

当前正在执行的脚本或shell函数中的行号。

LINES

select命令使用,以确定打印选择列表的列长度。 自动设置是否启用了checkwinsize选项(参见The Shopt Builtin),或者在收到SIGWINCH时在交互式shell中自动设置。

MACHTYPE

以标准GNU cpu-company-system格式完整描述Bash执行的系统类型的字符串。

MAILCHECK

shell以多少次(以秒为单位)检查MAILPATHMAIL变量中指定的文件中的邮件。 默认值是60秒。 在检查邮件的时候,shell会在显示主提示符之前进行检查。 如果此变量未设置,或者设置为不是大于或等于零的值,则shell将禁用邮件检查。

MAPFILE

创建一个数组变量,用于保存在未提供变量名称的情况下内置的由mapfile读取的文本。

OLDPWD

上一个工作目录由cd内置命令设定。

OPTERR

如果设置为值1,Bash将显示getopts内置命令生成的错误消息。

OSTYPE

对Bash正在运行的系统的描述。

PIPESTATUS

一个数组变量(参见Arrays),其中包含最近执行的前台管道(可能只包含一个命令)中的进程的退出状态值列表。

POSIXLY_CORRECT

如果这个变量在Bash启动时在环境中,那么在读取启动文件之前,shell会进入POSIX模式(参见Bash POSIX Mode),就好像已经提供了--posix调用选项。 如果在shell运行时设置,Bash启用POSIX模式,就像命令一样

set -o posix

已被执行。

PPID

shell的父进程的进程ID 这个变量是只读的。

PROMPT_COMMAND

如果设置,则将该值解释为在打印每个主要提示($PS1)之前执行的命令。

PROMPT_DIRTRIM

如果设置为大于零的数字,则将该值用作扩展\w\W字符串转义时要保留的尾随目录组件的数量(请参阅控制提示)。 删除的字符被替换为省略号。

PS0

这个参数的值被扩展为像PS1,并且在读命令之后以及在命令执行之前由交互式shell显示。

PS3

该变量的值用作select命令的提示。 如果这个变量没有设置,select 命令会提示'#?

PS4

该值是在设置-x选项时回显命令行之前打印的提示(请参见The Set Builtin)。 根据需要,将PS4的第一个字符复制多次,以指示多个间接级别。 默认是'+ ”。

PWD

当前工作目录由cd内置命令设定。

RANDOM

每次引用此参数时,都会生成0到32767之间的随机整数。 给这个变量赋值一个随机数发生器。

READLINE_LINE

Readline行缓冲区的内容,用于'bind -x'(参见 Bash Builtins)。

READLINE_POINT

插入点在Readline行缓冲区中的位置,用于'bind -x'(请参阅 Bash Builtins)。

REPLY

内置的read 的默认变量。

SECONDS

这个变量扩展到shell启动以来的秒数。 赋值给该变量将把计数值重新设置为赋值的值,并且扩展值变为赋值的值加上赋值后的秒数。

SHELL

shell的完整路径名保存在这个环境变量中。 如果shell在启动时没有设置,Bash会为其分配当前用户登录shell的完整路径名。

SHELLOPTS

启用shell选项的冒号分隔列表。 列表中的每个单词都是set内置命令的-o选项的有效参数(参见Set Builtin)。 出现在SHELLOPTS中的选项是通过set -o报告为“on”的选项。 如果此变量在Bash启动时处于环境中,则在读取任何启动文件之前将启用列表中的每个shell选项。 这个变量是只读的。

SHLVL

每次开始一个新的Bash实例时增加一个。 这是为了计算Bash shell的嵌套深度。

TIMEFORMAT

该参数的值用作格式字符串,指定如何显示以time 为前缀的管道的时间信息。 ''字符引入了一个扩展为时间值或其他信息的转义序列。 转义序列及其含义如下:大括号表示可选部分。

%%

一个字面“”。

%[p][l]R

经过的时间以秒为单位。

%[p][l]U

在用户模式下花费的CPU秒数。

%[p][l]S

在系统模式下花费的CPU秒数。

%P

CPU百分比,按(%U + %S) / %R计算。

可选的p是指定精度的数字,小数点后的小数位数。 值为0不会导致输出小数点或分数。 最多可以指定小数点后三位;大于3的p的值被改为3。 如果未指定p,则使用值3。

可选的l指定格式为MMmSS.FF更长格式,包括分钟。 p的值确定是否包含分数。

如果这个变量没有设置,Bash的行为就好像它有值:

$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'

如果该值为空,则不显示定时信息。 显示格式字符串时会添加尾随的换行符。

TMOUT

如果设置为大于零的值,则TMOUT将被视为内置的read的默认超时值(请参阅Bash Builtins)。 当输入来自终端时,如果输入未在TMOUT秒后到达,则select命令(参见条件构造)终止。

在交互式shell中,该值被解释为在发出主要提示后等待输入行的秒数。 如果完整的输入行没有到达,Bash在等待这个秒数后终止。

TMPDIR

如果设置,Bash将其值用作Bash为shell使用创建临时文件的目录的名称。

UID

当前用户的数字真实用户标识。 这个变量是只读的。


下一页:,上一页:,上一节:top [目录][索引]

6 Bash功能

本章介绍Bash特有的功能。


下一页: , 上一节: Bash特性 [目录][索引]

6.1 调用Bash

bash [long-opt] [-ir] [-abefhkmnptuvxdBCDHP] [-o option] [-O shopt_option] [argument …]
bash [long-opt] [-abefhkmnptuvxdBCDHP] [-o option] [-O shopt_option] -c string [argument …]
bash [long-opt] -s [-abefhkmnptuvxdBCDHP] [-o option] [-O shopt_option] [argument …]

所有用于set内建命令的单字符选项(参见The Set Builtin)都可以在调用shell时用作选项。 另外,还有几个可以使用的多字符选项。 这些选项必须在命令行上出现在要识别的单字符选项之前。

--debugger

安排调试器配置文件在shell启动之前执行。 打开扩展调试模式(参见Shopt Builtin获取shopt内建的extdebug选项的说明)。

--dump-po-strings

GNU gettext PO(便携式对象)文件中的标准输出上打印所有以“$”开头的双引号字符串的列表格式。 除输出格式外,相当于-D

--dump-strings

相当于-D

--help

在标准输出上显示使用消息并成功退出。

--init-file filename
--rcfile filename

在交互式shell中从filename(而不是~/.bashrc)执行命令。

--login

等同于-l

--noediting

当shell是交互式时,不要使用GNU Readline库(参见命令行编辑)来读取命令行。

--noprofile

不要加载系统范围的启动文件/etc/profile或任何个人初始化文件~/.bash_profile, ~/.bash_login~/.profile当Bash作为登录shell调用时。

--norc

不要在交互式shell中读取~/.bashrc初始化文件。 如果shell被调用为sh,默认情况下是打开的。

--posix

更改默认操作与POSIX标准不同的行为,以符合标准。 这是为了使Bash表现为该标准的严格超集。 有关Bash POSIX模式的描述,请参见Bash POSIX Mode

--restricted

使shell成为受限制的shell(请参阅受限Shell)。

--verbose

相当于-v。在读取时打印shell输入行。

--version

在标准输出中显示此Bash实例的版本信息并成功退出。

有几个单字符选项可能在调用时提供,而set内建不可用。

-c

从第一个非选项参数command_string中读取并执行命令,然后退出。 如果command_string后面有参数,则将第一个参数分配给$0,并将剩余的参数分配给位置参数。 $0的分配设置了shell的名称,它在警告和错误消息中使用。

-i

强制shell以交互方式运行。 交互式shell在Interactive Shells中有描述。

-l

使这个shell的行为,就好像它已经被登录直接调用。 当shell是交互式的,这相当于用'exec -l bash'启动登录shell。 当shell不交互时,登录shell启动文件将被执行。 'exec bash -l'或'exec bash --login'将用Bash登录shell替换当前shell。 有关登录shell的特殊行为的描述,请参阅Bash Startup Files

-r

使shell成为受限制的shell(请参阅受限Shell)。

-s

如果该选项存在,或者在选项处理后没有参数,则从标准输入中读取命令。 该选项允许在调用交互式shell时设置位置参数。

-D

在标准输出上打印所有以“$”开头的双引号字符串的列表。 当前语言环境不是CPOSIX(请参阅语言环境翻译)时,这些字符串可以进行语言翻译。 这意味着-n选项;没有命令将被执行。

[-+]O [shopt_option]

shopt_optionshopt内置命令的shell选项之一(参见The Shopt Builtin)。 如果存在shopt_option,则-O设置该选项的值; +O取消它。 如果未提供shopt_option,则shopt接受的shell选项的名称和值将打印在标准输出中。 如果调用选项是+O,则输出将以可作为输入重用的格式显示。

--

一个 --信号表示选项结束并禁用进一步的选项处理。 --之后的任何参数都被视为文件名和参数。

一个login shell是其参数零的第一个字符是“-”的shell,或者是一个使用-login选项调用的shell。

一个交互式shell是一个启动时没有非选项参数,除非指定-s,没有指定-c选项,其输入和输出都连接到终端(由isatty(3确定),或者以-i选项开始。 有关更多信息,请参见交互式shell

如果参数在选项处理后仍然存在,并且既没有提供-c也没有-s选项,则第一个参数被假定为包含shell命令的文件的名称(请参阅Shell脚本)。 当Bash以这种方式被调用时,$0被设置为文件的名字,位置参数被设置为其余的参数。 Bash从这个文件读取和执行命令,然后退出。 Bash的退出状态是在脚本中执行的最后一个命令的退出状态。 如果没有执行任何命令,则退出状态为0。


下一页:,上一页:,上一节:Bash特性 [目录][索引]

6.2 Bash启动文件

本节介绍Bash如何执行其启动文件。 如果有存在任何文件无法读取,Bash将报告错误。 如上面在Tilde Expansion中所述(参见Tilde扩展),Tildes被扩展为文件名。

交互式shell在Interactive Shells中有描述。

作为交互式登录shell或--login调用

当Bash作为交互式登录shell或者作为具有--login选项的非交互式shell运行时,它首先从文件/etc/profile执行命令,如果该文件存在。 读取该文件后,按照该顺序查找~/.bash_profile~/.bash_login~/.profile,读取并执行第一个存在且可读的命令。 当shell开始启动时禁止这种行为,可以使用--noprofile选项。

当交互式登录shell退出或非交互式登录shell执行exit内置命令时,Bash将读取并执行文件 ~/.bash_logout中的命令(如果存在) 。

调用为交互式非登录shell

当一个不是登录shell的交互式shell被启动时,Bash从~/.bashrc中读取和执行命令,如果该文件存在的话。 这可以通过使用--norc选项来禁止。 --rcfile file 选项将强制Bash从file读取并执行命令,而不是~/.bashrc

所以,通常你的~/.bash_profile 包含该行

if [ -f ~/.bashrc ]; then . ~/.bashrc; fi

之后(或之前)任何登录特定的初始化。

非交互式调用

当Bash以非交互方式启动时,为了运行一个shell脚本,例如,它在环境中查找变量BASH_ENV,如果在那里出现扩展的值,并且使用扩展值作为名字一个文件的读取和执行。 Bash的行为就像下面的命令被执行一样:

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

但是PATH变量​​的值不用于搜索文件名。

如上所述,如果使用--login选项调用非交互式shell,Bash将尝试从登录shell启动文件读取并执行命令。

用名称sh调用

如果Bash被调用的名字是sh,它会尽可能地模仿sh历史版本的启动行为,同时符合POSIX标准。

当作为交互式登录shell或作为具有--login选项的非交互式shell调用时,它首先尝试从/etc/profile~/.profile读取和执行命令。 --noprofile选项可以用来抑制这种行为。 当作为名称为sh的交互式shell进行调用时,Bash将查找变量ENV,如果已定义,则展开它的值,并使用展开后的值作为文件来读取和执行。 由于作为sh调用的shell不会尝试从任何其他启动文件读取和执行命令,因此--rcfile 选项不起作用。 使用名称sh调用的非交互式shell不会尝试读取任何其他启动文件。

当作为sh调用时,Bash在读取启动文件后进入POSIX模式。

POSIX模式调用

当Bash以POSIX模式启动时,与--posix命令行选项一样,它遵循启动文件的POSIX标准。 在这种模式下,交互式shell扩展了ENV变量​​,命令从名称为扩展值的文件中读取并执行。 没有其他启动文件被读取。

由远程shell守护进程调用

Bash试图确定何时运行它的标准输入连接到一个网络连接,就像由远程shell守护进程(通常是rshd或安全shell守护进程sshd 如果Bash确定以这种方式运行,它将读取并执行来自 ~/.bashrc的命令,如果该文件存在且可读的话。 如果作为sh调用,则不会执行此操作。 --norc 选项可用于禁止此行为,--rcfile选项可用于强制读取其他文件,但rshdsshd通常使用这些选项调用shell,或者允许指定它们。

有效和真实的UID/GID不相同时调用。

如果Bash以有效的用户(组)id不等于真实的用户(组)id而启动,并且没有提供-p选项,则不会读取启动文件,shell功能不会被继承如果环境中出现SHELLOPTSBASHOPTSCDPATHGLOBIGNORE被忽略,并且有效的用户ID被设置为真实的用户ID。 如果在调用时提供了-p选项,则启动行为是相同的,但不会重置有效的用户标识。


下一页:,上一页:,上一节:Bash特性 [目录][索引]

6.3 交互式shell


下一页: ,上一节:交互式shell [目录] [索引]

6.3.1 什么是交互式Shell?

交互式shell是启动时没有非选项参数,除非指定-s选项,没有指定-c选项,并且其输入和错误输出都连接到终端,否则交互式shell是启动时没有非选项参数(由isatty(3)决定),或者以-i选项启动的shell。

交互式shell通常从用户的终端读取和写入。

当启动交互式shell时,-s调用选项可用于设置位置参数。


下一页:,上一页: ,上一节:交互式shell [目录] [索引]

6.3.2 这个shell是交互的吗?

要在启动脚本中确定Bash是否以交互方式运行,请测试'-'特殊参数的值。 当shell是交互式时,它包含i 例如:

case "$-" in
*i*)	echo This shell is interactive ;;
*)	echo This shell is not interactive ;;
esac

或者,启动脚本可以检查变量PS1;它在非交互式shell中未设置,并在交互式shell中设置。 从而:

if [ -z "$PS1" ]; then
        echo This shell is not interactive
else
        echo This shell is interactive
fi

上一页: ,上一节:交互式shell [目录] [索引]

6.3.3 交互式Shell行为

当shell以交互方式运行时,它以多种方式改变其行为。

  1. 根据Bash 启动文件中的描述读取和执行启动文件。
  2. 作业控制(请参阅作业控制)默认启用。 当作业控制生效时,Bash将忽略键盘生成的作业控制信号SIGTTINSIGTTOUSIGTSTP
  3. 在读取命令的第一行之前,Bash展开并显示PS1,并在读取多行命令的第二行和后续行之前展开并显示PS2 Bash在读取命令之后但在执行之前显示PS0
  4. 在打印主要提示符$PS1(参见Bash变量)之前,Bash会执行PROMPT_COMMAND变量​​的值作为命令。
  5. Readline(参见命令行编辑)用于从用户终端读取命令。
  6. 当读取一个命令时,Bash将ignoreeof选项的值检查为set -o,而不是在其标准输入接收到EOF时立即退出(见Set Builtin)。
  7. 命令历史记录(参见Bash History Facilities)和历史扩展(请参阅历史记录交互)默认情况下处于启用状态。 当启用了历史记录的shell退出时,Bash会将命令历史保存到由$HISTFILE命名的文件中。
  8. 别名扩展(请参阅别名)是默认执行的。
  9. 在没有任何陷阱的情况下,Bash忽略SIGTERM(参见Signals)。
  10. 在没有任何陷阱的情况下,捕获并处理SIGINT((请参阅Signals)。 SIGINT会中断一些shell内建命令。
  11. 如果启用了huponexit shell选项(请参阅Signals),则交互式登录shell将在退出时向所有作业发送SIGHUP
  12. -n调用选项被忽略,'set -n'不起作用(参见The Set Builtin)。
  13. Bash将定期检查邮件,具体取决于MAILMAILPATHMAILCHECK shell变量的值(请参阅Bash变量)。
  14. 在启用'set -u'后引用未绑定的shell变量导致的扩展错误不会导致shell退出(请参见Set Builtin)。
  15. ${var:?word}扩展中,var未被设置或为null导致的扩展错误,shell不会退出(参见Shell参数扩展)。
  16. shell 内建命令遇到的重定向错误不会导致shell退出。
  17. POSIX模式下运行时,一个返回错误状态的特殊内建命令不会导致shell退出(参见Bash POSIX Mode)。
  18. 失败的exec不会导致shell退出(请参阅Bourne Shell Builtins)。
  19. 解析器语法错误不会导致shell退出。
  20. 默认启用cd内建命令的目录参数的简单拼写校正(请参阅shopt中的cdspell选项的说明 The Shopt Builtin)。
  21. 如果在打印$PS1之后指定的秒数内没有读取到命令,shell将检查TMOUT变量​​的值并退出(参见Bash变量)。

下一页:,上一页:,上一节:Bash特性 [目录] [索引]

6.4 Bash条件表达式

条件表达式由[[复合命令和test[内置命令使用)

表达式可能是一元或二元的。 一元表达式通常用于检查文件的状态。 还有字符串运算符和数字比较运算符。 Bash在表达式中使用时特别处理几个文件名。 如果Bash运行的操作系统提供这些特殊文件,Bash将使用它们;否则它将在内部使用以下行为来模拟它们:如果其中一个初始参数的file参数的形式为/dev/fd/N ,然后检查文件描述符N 如果其中一个初始参数的file参数是/dev/stdin/dev/stdout/dev/stderr,分别检查文件描述符0,1或2。

当与[[一起使用时,<>运算符按照字典顺序使用当前语言环境进行排序。 test命令使用ASCII排序。

除非另有说明,否则对文件进行操作的元素遵循符号链接,并对链接的目标进行操作,而不是链接本身。

-a file

如果file存在,则为真。

-b file

如果file存在,并且是块专用文件,则为真。

-c file

如果file存在,且为字符特殊文件,则为真。

-d file

如果file存在并且是一个目录,则为真。

-e file

如果file存在,则为真。

-f file

如果file存在且为常规文件,则为真。

-g file

如果file存在且其set-group-id位设置,则为真。

-h file

如果file存在并且是符号链接,则为真。

-k file

如果file存在且其“sticky”位置设置,则为真。

-p file

如果file存在并且是命名管道(FIFO),则为真。

-r file

如果file存在且可读,则为真。

-s file

如果file存在且大小大于零,则为真。

-t fd

如果文件描述符fd打开并且引用终端,则为真。

-u file

如果file存在且其set-user-id位设置,则为真。

-w file

如果file存在且可写,则为真。

-x file

如果file存在且可执行,则为真。

-G file

如果file 存在且属于有效组标识,则为真。

-L file

如果file存在并且是符号链接,则为真。

-N file

如果file存在并且自上次读取以来已被修改,则为真。

-O file

如果file存在且属于有效用户标识,则为真。

-S file

如果file存在并且是套接字,则为真。

file1 -ef file2

如果file1file2指向相同的设备和索引节点编号,则为真。

file1 -nt file2

如果file1file2更新(根据修改日期),或者file1存在且file2不存在,则为真。

file1 -ot file2

如果file1file2更旧,或者file2存在且file1不存在,则为真。

-o optname

如果启用了shell选项optname,则为真。 选项列表出现在set内建命令的-o选项的描述中(参见The Set Builtin)。

-v varname

如果shell变量varname已设置(已被赋值),则为真。

-R varname

如果设置shell变量varname并且是名称引用,则为真。

-z string

如果string的长度为零,则为真。

-n string
string

如果string的长度不为零,则为真。

string1 == string2
string1 = string2

如果字符串相等,则为真。 当与[[命令一起使用时,这将执行如上所述的模式匹配(请参阅条件构造))。

=’应与POSIX一致性的test命令一起使用。

string1 != string2

如果字符串不相等,则为真。

string1 < string2

如果string1按字典顺序排列在string2之前,则为真。

string1 > string2

如果字符串1按照字典顺序排序在字符串2之后,则为真。

arg1 OP arg2

OP是‘-eq’, ‘-ne’, ‘-lt’, ‘-le’, ‘-gt’,或 ‘-ge’之一。 如果arg1分别等于,不等于,小于,小于或等于,大于或大于或等于arg2,则这些算术二元运算符返回真。 Arg1arg2可以是正整数或负整数。


下一页:,上一页:,上一节:Bash特性 [目录] [索引]

6.5 Shell算法

shell允许计算表达式扩展被计算,作为shell扩展之一,或者通过使用((复合命令,let内建命令或 -i 选项添加到声明declare 内置命令。

运算是以固定宽度的整数完成的,没有检查溢出,虽然除0被捕获并标记为错误。 运算符及其优先级,关联性和值与C语言中的相同。 下面的运算符列表被分组为相等优先级运算符的级别。 级别按照优先级递减的顺序列出。

id++ id--

可变后期增量和后期减少

++id --id

可变的预增量和预减量

- +

一元减号和加号

! ~

逻辑和按位否定

**

* / %

乘法,除法,余数

+ -

加法,减法

<< >>

左右位移

<= >= < >

比较

== !=

相等和不相等

&

按位与

^

按位异或

|

按位或

&&

逻辑与

||

逻辑或

expr ? expr : expr

条件运算符

= *= /= %= += -= <<= >>= &= ^= |=

分配

expr1 , expr2

逗号

允许Shell变量作为操作数;在运算表达式之前执行参数展开。 在表达式中,shell变量也可以通过名称来引用,而不使用参数扩展语法。 当使用名称引用而不使用参数扩展语法时,null或unset的shell变量的计算结果为0。 变量的值在被引用时被作为算术表达式运算,或者当一个变量被使用declare -i赋予了integer属性,指定的值。 空值计算为0。 一个shell变量不需要打开integer属性在表达式中使用。

前导0的常量被解释为八进制数字。 前导“0x”或“0X”表示十六进制。 否则,数字形式为[base#]n,可选的base是十进制数2到64,被表示为算术计数,n是在此基数上的数。 如果省略base#,则使用基数10。 当指定n时,大于9的数字由小写字母,大写字母'@'和'_以该顺序表示。 如果base小于或等于36,小写字母和大写字母可以互换使用,表示10到35之间的数字。

运算符按优先顺序进行运算。 括号中的子表达式首先被评估,并且可以覆盖上面的优先规则。


下一页: , 上一页: , 上一节: Bash 特性 [目录][索引]

6.6 别名

当用作简单命令的第一个单词时,Aliases允许一个字符串替换一个单词。 shell维护一个别名列表,可以使用aliasunalias内置命令设置和取消设置。

每个简单的命令的第一个单词,如果没有引用,检查是否有别名。 如果是这样的话,那么这个单词被别名的文本替换。 字符 ‘/’, ‘$’, ‘`’, ‘=’和任何shell元字符或引用上面列出的字符可能不会出现在别名中。 替换文本可能包含任何有效的shell输入,包括shell元字符。 替换文本的第一个单词是针对别名进行测试的,但是与正在展开的别名相同的单词不会再次展开。 这意味着,例如,可以别名ls“ls -F”,而Bash不会试图递归地展开替换文本。 如果别名值的最后一个字符是blank,则别名后面的下一个命令字也将被检查以进行别名扩展。

使用alias命令创建并列出别名,并使用unalias命令删除别名。

在替换文本中没有使用参数的机制,如csh中所示。 如果需要参数,应该使用shell函数(请参阅Shell函数)。

除非使用shopt设置expand_aliases shell选项(请参阅The Shopt Builtin),否则别名不会展开。

关于别名的定义和使用的规则有些混乱。 在执行该行的任何命令之前,Bash总是读取至少一个完整的输入行。 读取命令时会扩展别名,而不是在执行时。 因此,在读取下一行输入之前,与另一个命令出现在同一行的别名定义才会生效。 该行别名定义之后的命令不受新别名的影响。 这种行为在执行函数时也是一个问题。 当读取函数定义时扩展别名,而不是在执行函数时扩展别名,因为函数定义本身就是一个命令。 因此,函数中定义的别名在该函数执行之后才可用。 为了安全起见,请始终将别名定义放在单独的行中,并且不要在复合命令中使用alias

对于几乎所有的用途,shell函数都优于别名。


下一页:,上一页:,上一节:Bash特性 [目录] [索引]

6.7 数组

Bash提供了一维索引和关联数组变量。 任何变量都可以用作索引数组;内置的declare命令将显式声明一个数组。 对数组的大小没有最大限制,也没有任何成员被索引或连续分配的要求。 索引数组使用整数(包括算术表达式(参见Shell算术))引用,并且是从零开始的;关联数组使用任意字符串。 除非另有说明,索引数组索引必须是非负整数。

如果使用语法分配了任何变量,则会自动创建索引数组

name[subscript]=value

下标被视为必须计算为数字的算术表达式。 要显式声明一个数组,请使用

declare -a name

语法

declare -a name[subscript]

也被接受; subscript被忽略。

创建关联数组是使用

declare -A name

可以使用declarereadonly 内建命令为数组变量指定属性。 每个属性都适用于数组的所有成员。

数组被赋值为使用表单的复合赋值

name=(value1 value2 … )

其中每个value的形式为[subscript]=string 索引数组赋值除了string以外不需要任何内容​​。 在分配给索引数组时,如果提供了可选的下标,则将该索引分配给指定的值;否则分配的元素的索引是由语句加上1的最后一个索引。 索引从零开始。

分配给关联数组时,下标是必需的。

这个语法也被内置的命令declare所接受。 可以使用上面介绍的name[subscript]=value语法来指定单独的数组元素。

当赋值给一个索引数组时,如果name下标为负数,则该数字被解释为大于最大索引name从数组末尾返回,索引-1引用最后一个元素。

数组中的任何元素都可以使用${name[subscript]}来引用。 大括号是为了避免与shell的文件名扩展操作符冲突。 如果subscript@*,则该单词扩展为数组name的所有成员。 这些下标仅在出现在双引号内时才有所不同。 如果这个单词是双引号,那么${name[*]}将扩展为一个单词,每个数组成员的值由IFS变量,并且${name[@]}name的每个元素展开为一个单独的单词。 当没有数组成员时,${name[@]}展开为空。 如果双引号扩展出现在一个单词中,则第一个参数的扩展与原始单词的开始部分连接,最后一个参数的扩展连接到原始单词的最后部分。 这类似于特殊参数“@”和“*”的扩展。 ${#name[subscript]}扩展为数组${name[subscript]}的元素个数,长度. 如果subscript为“@”或“*”,则展开是数组中元素的数量。 如果用于引用索引数组的元素的subscript的计算结果为小于零的数字,则将其解释为相对于大于数组最大索引的值,因此负指数将从数组的末尾,索引-1指向最后一个元素。

引用不带下标的数组变量等同于引用下标0。 任何对使用有效下标的变量的引用都是合法的,如果需要,bash将会创建一个数组。

如果下标已被赋值,则认为数组变量。 空字符串是一个有效的值。

可以获得数组的键(索引)以及值。 ${!name[@]}}和${!name[*]}扩展为数组变量name中的索引。 双引号内的处理与特殊参数“@”和“*”在双引号内的扩展类似。

内置的unset命令用于销毁数组。 unset name[subscript]销毁索引subscript处的数组元素。 如上所述解释索引数组的负下标。 必须小心避免文件扩展引起的不必要的副作用。 unset name,其中name是一个数组,将删除整个数组。 '*'或'@'的下标也会删除整个数组。

内置的declarelocalreadonly命令每个接受一个-a选项来指定一个索引数组和一个-A选项来指定一个关联数组。 如果提供了这两个选项,那么-A优先。 内置的read接受一个-a选项来将从标准输入中读取的单词列表分配给一个数组,并且可以从标准输入中读取单个数组元素的值。 setdeclare以一种允许将其重新用作输入的方式构建显示数组值。


下一页:,上一页:,上一节:Bash特性 [目录] [索引]

6.8 目录堆栈

目录堆栈是最近访问的目录的列表。 pushd内建命令将目录添加到堆栈,因为它改变了当前目录,popd内建命令从堆栈中删除指定的目录,并将当前目录改变为被删除的目录。 内置的dirs命令显示目录堆栈的内容。 当前目录始终是目录堆栈的“顶部”。

目录堆栈的内容也可以作为DIRSTACK shell变量的值显示。


上一节: 目录堆栈   [目录][索引]

6.8.1 目录堆栈内置命令

dirs
dirs [-clpv] [+N | -N]

显示当前记住的目录的列表。 目录通过pushd命令添加到列表中;popd命令从列表中删除目录。 当前目录始终是堆栈中的第一个目录。

-c

通过删除所有元素来清除目录堆栈。

-l

使用完整路径名生成列表;默认的列表格式使用波浪字符来表示主目录。

-p

使dirs每行打印一个条目的目录堆栈。

-v

使dirs每行打印一个条目的目录堆栈,每个条目的索引在堆栈中作为前缀。

+N

显示N目录(从dirs打印的列表的左侧从无选项调用时开始计数),从0开始。

-N

显示N目录(从dirs打印的列表的右侧从无选项调用时开始计数),从0开始。

popd
popd [-n] [+N | -N]

当没有给出参数时,popd从栈中删除顶层目录,并执行一个cd到新的顶层目录。 这些元素从0开始编号,从用dirs命令列出的第一个目录开始;即popd相当于popd +0

-n

从堆栈中删除目录时禁止正常更改目录,以便仅操作堆栈。

+N

从零开始,删除N目录(从dirs打印的列表的左侧计数)。

-N

从零开始,删除N目录(从dirs打印的列表的右侧计数)。

pushd
pushd [-n] [+N | -N | dir]

将当前目录保存在目录堆栈顶部,然后将cd保存到dir 在没有参数的情况下,pushd交换最上面的两个目录,并将新的目录作为当前目录。

-n

禁止在将目录旋转或添加到堆栈时正常更改目录,以便只操作堆栈。

+N

通过旋转堆栈,将N目录(从dirs打印的列表的左侧从零开始计数)移动到列表顶部。

-N

通过旋转堆栈,将N目录(从dirs打印的列表右侧的计数,从零开始)移动到列表顶部。

dir

使dir成为堆栈的顶部,使其成为新的当前目录,就好像它已经作为参数提供给cd内建命令。


下一页:,上一页:,上一节:Bash功能 [目录] [索引]

6.9 控制提示符

在Bash打印每个主要提示之前检查变量PROMPT_COMMAND的值。 如果PROMPT_COMMAND被设置并且具有非空值,那么该值就像在命令行上键入一样执行。

另外,下表描述了可能出现在提示变量PS1PS4中的特殊字符:

\a

一个钟声字符。

\d

日期以“周月份日期”格式(例如,“5月26日星期二”)。

\D{format}

format传递给strftime(3),并将结果插入到提示字符串中;一个空的format会产生一个特定于语言环境的时间表示。 大括号是必需的。

\e

转义字符。

\h

主机名,直到第一个“.”。

\H

主机名

shell当前管理的作业数量。

\l

shell的终端设备名称的基本名称。

\n

换行符

\r

回车

\s

shell的名称,$0的基本名称(最后一个斜杠后面的部分)。

\t

时间,以24小时HH:MM:SS格式。

\T

时间为12小时HH:MM:SS格式。

\@

时间,以12小时上午/下午格式。

\A

时间,以24小时HH:MM格式。

\u

当前用户的用户名。

\v

Bash的版本(例如2.00)

\V

Bash版本+ 补丁号(例如2.00.0)的发布,

\w

当前工作目录,$HOME用波浪符号缩写(使用$PROMPT_DIRTRIM变量)。

\W

$PWD的基名,$HOME缩写为波浪符号。

\!

该命令的历史编号。

\#

该命令的命令号。

\$

如果有效的uid是0,那么,否则是$

\nnn

ASCII码是八进制值的字符nnn

\\

反斜杠

\[

开始一系列非打印字符。 这可以用来将终端控制序列嵌入到提示中。

\]

结束一系列非打印字符。

命令编号和历史编号通常是不同的:命令的历史编号是其在历史列表中的位置,其可以包括从历史文件恢复的命令(参见Bash History Facilities),而命令号是在当前shell会话期间执行的命令序列中的位置。

字符串被解码后,通过参数扩展,命令替换,算术扩展和引用移除来扩展,取决于promptvars shell选项的值(参见Bash Builtins )。


下一页:,上一页:,上一节:Bash功能 [目录] [索引]

6.10 受限shell

如果Bash以rbash名称开头,或者在调用时提供了--restricted-r选项,则shell将受到限制。 受限制的shell用于设置比标准外壳更受控制的环境。 受限shell的行为与bash的行为相同,不同之处在于不允许或不执行以下操作:

任何启动文件读取后,这些限制都会强制执行。

当一个被发现是shell脚本的命令被执行(参见Shell脚本)时,rbash将关闭在shell中产生的任何执行脚本的限制。


上一页:,上一节:Bash 特性 [目录][索引]

6.11 Bash POSIX模式

当Bash运行时,用--posix命令行选项启动Bash,或者执行'set -o posix'会导致Bash更贴近POSIX标准,方法是在Bash默认值不同的区域更改行为以匹配由POSIX指定的行为。

当作为sh调用时,Bash在读取启动文件后进入 POSIX模式。

以下列表是'POSIX模式有效时更改的内容:

  1. 当散列表中的命令不再存在时,Bash将重新搜索$PATH来查找新的位置。 这也适用于'shopt -s checkhash'。
  2. 作业控制代码打印的消息以非零状态退出时的内容为“完成(状态)”。
  3. 当一个作业停止时,由作业控制代码打印并内置的消息是'Stopped(signame)',其中signame例如是SIGTSTP
  4. 始终启用别名扩展,即使在非交互式shell中也是如此。
  5. 出现在保留字被识别的上下文中的保留字不会经过别名扩展。
  6. POSIX PS1PS2扩展了'!“到历史数字和”!!' 至 '!'被启用,参数扩展在PS1PS2的值上执行,而不管promptvars选项的设置如何。
  7. 执行POSIX启动文件($ENV)而不是普通的Bash文件。
  8. 波浪号扩展仅在命令名前的赋值而不是行上的所有赋值语句上执行。
  9. 默认历史文件是〜/.sh_history(这是$HISTFILE的缺省值)。
  10. 除非shell是交互式的,否则重定向操作符不会对重定向中的单词执行文件名扩展。
  11. 重定向操作符不会在重定向中对单词执行分词。
  12. 函数名称必须是有效的shell names。也就是说,它们不能包含字母,数字和下划线以外的字符,也不能以数字开始。 声明具有无效名称的函数会在非交互式shell中导致致命的语法错误。
  13. 函数名称可能与POSIX特殊内置函数名称中的某一个不一样。
  14. 在命令查找期间,在shell函数之前找到了POSIX特殊的内建函数。
  15. 当打印shell函数定义(例如,通过type)时,Bash不会打印function关键字。
  16. PATH变量​​的元素中出现的第一个字符的字面符号不像上面在波浪扩展中所述的那样展开。
  17. time保留字可以被自己用作命令。 以这种方式使用时,它将显示shell及其已完成子项的计时统计信息。 TIMEFORMAT变量​​控制时间信息的格式。
  18. 解析和展开出现在双引号内的${...}扩展时,单引号不再是特殊的,不能用于引用大括号或其他特殊字符,除非运算符是定义执行模式删除的操作符之一。 在这种情况下,它们不必显示为匹配的对。
  19. 如果下一个标记以-开始,则解析器不会将time识别为保留字。
  20. !'字符不会在双引号字符串中引入历史扩展,即使启用了histexpand选项。
  21. 如果POSIX特殊内建命令返回错误状态,则会退出非交互式shell。 致命错误是POSIX标准中列出的错误,包括传递不正确的选项,重定向错误,命令名前的赋值变量赋值错误等等。
  22. 如果在赋值语句之后没有命令名称,则发生变量赋值错误,则非交互式shell将以错误状态退出。 例如,尝试将值分配给只读变量时发生变量赋值错误。
  23. 如果在特殊内建命令之前的赋值语句中发生变量赋值错误,而非任何其他简单命令,则非交互式shell将以错误状态退出。
  24. 如果for语句中的迭代变量或select语句中的选择变量是只读变量,则非交互式shell将以错误状态退出。
  25. 如果filename . filename没有找到,则非交互shell退出。
  26. 如果算术扩展中的语法错误导致无效表达式,则非交互式shell将退出。
  27. 如果发生参数扩展错误,非交互式shell会退出。
  28. 如果以下脚本读取时出现语法错误,非交互式Shell将退出 . 或者source内置命令或者由eval内置命令的字符串程序。
  29. 进程替换不可用。
  30. 尽管变量间接可用,但它可能不适用于''和'?'特殊参数。
  31. 在扩展双引号的模式上下文中扩展“*”特殊参数时,不会将$*视为在双引号内。
  32. 内置命令完成后,POSIX特殊构建内容之前的分配语句会在shell环境中保留。
  33. 在函数返回之后,shell函数调用之前的赋值语句会在shell环境中保留,就像执行了POSIX特殊的内建命令一样。
  34. 内置的command不会阻止将赋值语句作为参数的内建函数将它们扩展为赋值语句;当不在POSIX模式下时,赋值内建函数在以command开头时将失去它们的赋值语句扩展属性。
  35. 内置的bg使用所需的格式来描述放置在后台的每个作业,其中不包括作业是当前作业还是先前作业的指示。
  36. kill -l的输出在单行上打印所有的信号名称,用空格分隔,而不用SIG前缀。
  37. 内建的kill不接受以SIG为前缀的信号名称。
  38. exportreadonly内置命令以POSIX所需的格式显示其输出。
  39. 内建的trap内容显示信号名称,而不包含前导的SIG
  40. 内建的trap不检查可能的信号规格的第一个参数,如果是,则将信号处理恢复到原来的配置,除非该参数只包含数字并且是有效的信号编号。 如果用户想要将给定信号的处理程序重置为原来的处理方式,则应该使用' - '作为第一个参数。
  41. . source内建命令不搜索当前目录中的文件名参数,如果通过搜索PATH找不到时。
  42. 启用POSIX模式具有设置inherit_errexit选项的效果,因此生成的执行命令替换的子shell将继承-e选项的值父shell。 inherit_errexit选项未启用时,Bash将清除此类子套件中的-e选项。
  43. alias内置显示别名定义时,它不显示它们,‘alias ',除非提供-p选项。
  44. set内建命令在没有选项的情况下调用时,它不会显示shell函数名称和定义。
  45. set内建在没有选项的情况下调用时,它将显示不带引号的变量值,除非它们包含shell元字符,即使结果包含非打印字符。
  46. 当以logical模式调用cd内建命令时,$PWD构造的路径名称和作为参数提供的目录名称不会引用一个现有的目录,cd会失败,而不会返回到physical模式。
  47. 即使不要求使用-P选项检查文件系统,内置的pwd命令验证了它打印的值是否与当前目录相同。
  48. 当列出历史记录时,内建的fc不包含历史记录条目是否已被修改的指示。
  49. fc使用的默认编辑器是ed
  50. 内建的typecommand 命令将不会报告找不到的不可执行文件,尽管shell会尝试执行这样一个文件,如果它是唯一命名的在$PATH中找到的文件。
  51. vi命令运行时,vi编辑模式将直接调用vi编辑器,而不是检查$VISUAL$EDITOR
  52. 当启用xpg_echo选项时,Bash不会尝试将echo的任何参数解释为选项。 转义字符转换后显示每个参数。
  53. ulimit内建命令为-c-f选项使用512字节的块大小。
  54. SIGCHLD上设置陷阱时,SIGCHLD的到来不会中断wait内建命令,并使其立即返回。 对于退出的每个子shell,trap命令都会运行一次。
  55. 内置read命令可能被设置了陷阱的信号中断。 如果Bash在执行read时收到一个捕获信号,则陷阱处理程序执行并且read返回大于128的退出状态。
  56. 在使用wait内建函数获取它之后,Bash从这些状态列表中删除一个退出的后台进程的状态。

即使在POSIX模式下,Bash也不会默认实现其他的POSIX行为。 特别:

  1. 如果FCEDIT未被设置,则fc内建将$EDITOR检查为编辑历史记录的程序,而不是直接对ed检查。 如果未设置EDITORfc使用ed
  2. 如上所述,Bash要求xpg_echo选项为echo内置命令启用完全符合。

Bash默认配置为POSIX-conformant,在构建时通过指定--enable-strict-posix-defaultconfigure请参阅可选功能)。


下一页:,上一页:,上一节:Top [目录] [索引]

7 工作控制

本章讨论什么是作业控制,工作原理以及Bash如何让您访问这个工具。


下一页:,上一页:作业控制 [目录] [索引]

7.1 作业控制基础

作业控制是指有选择地停止(挂起)进程的执行并在稍后继续(恢复)其执行的能力。 用户通常通过由操作系统内核的终端驱动程序和Bash共同提供的交互式界面来使用该工具。

shell将一个job关联到每个管道。 它保留一个当前正在执行的作业的表格,这些表格可以用jobs命令列出。 当Bash异步启动一个工作时,它会打印一个如下所示的行:

[1] 25647

表示该作业是作业编号1,并且与该作业关联的最后一个进程的进程ID是25647。 单个管道中的所有进程都是同一个作业的成员。 Bash使用job抽象作为作业控制的基础。

为了方便用户界面执行作业控制,操作系统维护当前终端进程组ID的概念。 该进程组的成员(进程组ID等于当前终端进程组ID的进程)接收键盘生成的信号,例如SIGINT 据说这些进程处于前台。 后台进程是那些进程组ID不同于终端的进程;这样的过程不受键盘产生的信号的影响。 只有前台进程被允许读取,或者如果用户用stty tostop指定,写入终端。 后台进程尝试读取来自(写入生效的stty tostop)终端由内核终端驱动发送的SIGTTIN (SIGTTOU)信号,除非被捕获,否则会终止进程。

如果运行Bash的操作系统支持作业控制,则Bash包含使用它的工具。 在进程运行时输入suspend字符(通常为‘^Z’,Control-Z)会导致进程停止并将控制权返回给Bash。 键入delayed suspend字符(通常是^Y,Control-Y)会导致进程在尝试从终端读取输入时停止,并控制为回到Bash。 然后,用户使用bg命令在后台继续它,fg命令在前台继续它,或kill命令杀死它。 ^Z立即生效,并且具有导致待处理的输出和打头的废弃的附加副作用。

有很多方法可以在shell中引用作业。 字符“”引入了作业规范(jobspec)。

工作号码n可以被称为“%n”。 符号'%%'和'%+指的是shell对当前作业的shell的概念,这是最后一个作业在前台停止或者在后台开始。 单个“”(没有附带的作业规范)符号,也指当前作业。 以前的作业可以使用'%-'来引用。 如果只有一个作业,则可以使用“%+”和“%-”来引用该作业。 在与作业相关的输出中(例如jobs命令的输出),当前作业始终标记为“+”,而前一个作业为“-”。

作业也可以使用用于启动它的名称的前缀或使用出现在其命令行中的子字符串来引用。 例如,'%ce'是指停止的ce作业。 另一方面,使用'%?ce'是指在其命令行中包含字符串'ce'的任何作业。 如果前缀或子字符串匹配多个作业,Bash将报告错误。

简单地命名一个工作可以用来把它放在前台:'%1'是 ‘fg %1’的同义词,将作业1从后台带入前台。 类似地,'‘%1 &'在后台恢复作业1,相当于'bg %1'

每当作业改变状态时,shell都会立即得知。 通常情况下,Bash在报告作业状态更改之前等待直到打印提示符,以便不中断任何其他输出。 如果set内置命令的-b选项被启用,Bash立即报告这样的改变(参见Set Builtin)。 针对退出的每个子进程执行SIGCHLD上的任何陷阱。

如果尝试退出Bash是在作业停止时(或者在运行时,如果启用了checkjobs选项,请参阅The Shopt Builtin),shell会打印一条警告消息,如果启用checkjobs选项,则列出作业及其状态。 然后可以使用jobs命令来检查其状态。 如果第二次尝试退出没有中间命令,Bash不会打印另一个警告,并且任何停止的作业都将被终止。


下一页:,上一页:,上一节:作业控制 [目录] [索引]

7.2 作业控制内置命令

bg
bg [jobspec …]

在后台恢复每个挂起的作业jobspec,就好像它已经以‘&’开始。 如果jobspec未提供,则使用当前作业。 除非在未启用作业控制的情况下运行,否则返回状态为零,或者在启用作业控制的情况下运行时,找不到任何jobspec或指定在没有作业控制的情况下启动的作业。

fg
fg [jobspec]

在前台恢复作业jobspec并将其作为当前作业。 如果jobspec未提供,则使用当前作业。 返回状态是放置在前台的命令的状态,如果在禁用了作业控制的情况下运行,或者在启用作业控制的情况下运行时,jobspec不指定有效作业或jobspec指定在没有作业控制的情况下启动的作业。

jobs
jobs [-lnprs] [jobspec]
jobs -x command [arguments]

第一种形式列出活动作业。 选项具有以下含义:

-l

除正常信息之外,列出进程ID

-n

仅显示自用户上次通知其状态后状态已更改的作业的信息。

-p

仅列出作业进程组组长的进程ID

-r

只显示正在运行的作业

-s

仅显示停止的作业。

如果给出jobspec,则输出被限制为关于该作业的信息。 如果未提供jobspec,则会列出所有作业的状态。

如果启用了-x选项,jobs替代任一从command 或者 arguments,中找到的jobspec,相应进程的组 ID,和通过argument执行的command,返回其退出状态。

kill
kill [-s sigspec] [-n signum] [-sigspec] jobspec or pid
kill -l|-L [exit_status]

将由sigspecsignum指定的信号发送到由作业规范命名的jobspec或进程ID pid的进程。 sigspec是不区分大小写的信号名称,如SIGINT (带或不带SIG前缀)或信号编号。signum是一个信号编号。 如果sigspecsignum不存在,则使用SIGTERM -l选项列出信号名称。 如果在给出-l时提供了任何参数,则会列出与参数相对应的信号的名称,返回状态为零。 exit_status是一个数字,指定信号编号或信号终止的进程的退出状态。 -L选项相当于-l 。如果至少有一个信号成功发送,则返回状态为零;如果发生错误或遇到无效选项,返回状态为非零。

wait
wait [-n] [jobspec or pid …]

等到每个进程ID pid或作业规范jobspec指定的子进程退出并返回最后一个等待的命令的退出状态。 如果给出了作业规范,则等待作业中的所有进程。 如果没有给出参数,则等待所有当前活动的子进程,返回状态为零。 如果提供-n选项,则wait等待任何作业终止并返回其退出状态。 如果jobspecpid都不指定shell的活动子进程,则返回状态为127。

disown
disown [-ar] [-h] [jobspec … | pid … ]

如果没有选项,从活动作业表中删除每个jobspec 如果给出-h选项,那么作业不会从表中删除,而是被标记,使得SIGHUP信号不会被发送到一个作业,如果shell收到SIGHUP 如果jobspec不存在,并且提供了-a或者-r选项,则使用当前作业。 如果没有jobspec提供,-a选项意味着删除或标记所有作业;没有jobspec参数的-r选项将操作限制为正在运行的作业。

suspend
suspend [-f]

挂起这个shell的执行,直到它收到一个SIGCONT信号。 登录shell不能被挂起;可以使用-f选项覆盖此选项并强制暂停。

当作业控制不活动时,killwait内置参数不接受jobspec参数。 他们必须提供进程IDs。


上一页:,上一节:作业控制 [目录] [索引]

7.3 作业控制变量

auto_resume

该变量控制shell如何与用户和作业控制交互。 如果这个变量存在,那么没有重定向的单个单词简单命令将被视为用于恢复现有作业的候选。 没有歧义,如果以键入的字符串开头的作业有多个作业,则选择最近访问的作业。 在这种情况下,停止的作业的名称是命令行用于启动它。 如果此变量设置为“exact”的值,则提供的字符串必须完全匹配停止的作业的名称;如果设置为'substring',则提供的字符串需要匹配已停止作业名称的子字符串。 substring”值提供了类似于“%?'作业 ID(参见作业控制基础)。 如果设置为任何其他值,则提供的字符串必须是已停止作业名称的前缀;这提供了类似于“%”作业ID的功能。


下一页:,上一页:,上一节:Top [目录] [索引]

8 命令行编辑

本章介绍GNU命令行编辑界面的基本功能。 命令行编辑由Readline库提供,由几个不同的程序(包括Bash)使用。 除非在shell调用中提供了-noediting选项,否则在使用交互式shell时默认启用命令行编辑。 read内置命令中使用-e选项时也使用了行编辑(请参阅Bash内建命令)。 默认情况下,行编辑命令与Emacs类似。 vi风格的行编辑界面也是可用的。 可以在set内置命令中使用-o emacs-o vi选项随时启用行编辑(请参阅set Builtin),或者使用+o emacs+o vi选项来禁用set


Next:,上一节:命令行编辑 [目录] [索引]

8.1 行编辑简介

以下段落描述了用于表示击键的符号。

文本C-k读作“Control-K”,描述按下Control键时按下k键时产生的字符。

文本M-k被读作'Meta-K',描述当Meta键(如果有的话)按下时产生的字符,并按下k键。 Meta键在许多键盘上被标记为ALT 在带有两个键标记为ALT的键盘上(通常在空格键的任一侧),左侧的ALT通常被设置为Meta键。 ALT右侧键也可以被配置为Meta键工作或可被配置为某些其他改性剂,例如用于输入重音字符一个书写键。

如果您没有Meta或ALT键或另一个作为Meta键的键,则可通过首先键入ESCfirst来生成相同的键击,然后输入k。任何一个过程都被称为metafying k键。

文本M-C-k读作'Meta-Control-k',描述由metafying C-k产生的字符。

另外,几个键有自己的名字。 特别地,DEL, ESC, LFD, SPC, RET,和TAB在本文中或在init文件中(参见Readline Init File)都可以代表自己。 如果您的键盘没有LFD键,输入C-j将产生所需的字符。 某些键盘上的RET键可能标记为ReturnEnter


下一页:,上一页:,上一节:命令行编辑 [目录][索引]

8.2 Readline 交互

在交互式会话中,您经常会输入一长串文本,只能注意到行中的第一个单词拼写错误。 Readline库为您提供了一组用于在输入文本时操作文本的命令,从而使您能够修复拼写错误,而不是强制重新键入大部分行。 使用这些编辑命令,将光标移动到需要更正的位置,然后删除或插入更正的文本。 然后,当您对行感到满意时,只需按RET即可。 您不必在行尾按RET;不管光标在行内的位置是哪,整行都被接受。


下一页:,Up:Readline Interaction [内容] [索引]

8.2.1 Readline 基本要素

为了输入字符,只需键入它们。 键入的字符出现在光标所在的位置,然后光标向右移动一个空格。 如果您错误键入字符,则可以使用删除字符来备份和删除错字字符。

有时候你可能会错误地输入一个字符,而且在输入其他几个字符之前不会注意到错误。 在这种情况下,您可以键入C-b将光标移动到左侧,然后更正您的错误。 之后,您可以使用C-f将光标向右移动。

当您在一行的中间添加文本时,您会注意到光标右侧的字符被“推倒”以为您插入的文本留出空间。 同样,当删除光标后面的文本时,光标右侧的字符将被“拉回”以填充删除文本所创建的空白区域。 下面是编辑输入行文本的基本要素列表。

C-b

向后移动一个字符。

C-f

前进一个字符。

DEL 或者 Backspace

删除光标左边的字符。

C-d

删除光标下方的字符。

Printing characters

将该字符插入光标处的行中。

C-_ or C-x C-u

撤消上一个编辑命令。 您可以撤消一直回到空行。

(根据您的配置,Backspace键删除光标左侧的字符,设置DEL键删除光标下方的字符,如C-d,而不是光标左边的字符。)


下一页:,上一页:,上一节:Readline 交互 [目录] [索引]

8.2.2 Readline 移动命令

上表描述了编辑输入行所需的最基本的按键。 为了方便起见,除了C-bC-fC-dDEL外,还添加了许多其他命令。 这里有一些关于在行上更快速移动的命令。

C-a

移动到行的开始。

C-e

移动到行的末尾。

M-f

向前移动一个单词,一个单词由字母和数字组成。

M-b

向后移动一个单词。

C-l

清除屏幕,重新打印顶部的当前行。

请注意C-f是如何前进一个字符的,而M-f则是前进一个字。 控制击键操作字符,而元击键操作字时,这是一个松散的惯例。


下一页:,上一页:,上一节:Readline 交互 [目录][索引]

8.2.3 Readline Killing命令

Killing 文本意味着从行中删除文本,但通常通过yanking(重新插入)将文本保存起来以备后用。 (‘Cut’和‘paste’”是‘kill’和‘yank’的更近的术语。)

如果一个命令的描述说‘kills’了文本,那么你可以确定以后可以把文本放回到不同的(或相同的)地方。

当使用kill命令时,文本保存在kill-ring中。 任何数量的连续杀死将所有杀死的文本保存在一起,这样,当你将它们撤回时,就可以完成所有的事情。 kill ring不是行特定的;当您输入另一行时,您在以前输入的行上杀死的文本可以稍后被提取。

这是用于查kill文本的命令列表。

C-k

将当前光标位置的文本杀死到行尾。

M-d

从光标到当前单词的结尾,或者如果在单词之间,则结束到下一个单词的结尾。 字边界与M-f 使用的边界相同。

M-DEL

从光标处杀死当前单词的开始,或者如果在单词之间,则杀死前一个单词的开始。 字边界与M-b 使用的边界相同。

C-w

从光标删除前一个空格。 这与M-DEL不同,因为单词边界不同。

这里是如何yank将文本放回到行中。 Yanking意味着从kill buffer中复制最近被删除的文本。

C-y

将最近被删除的文本提取到光标处的缓冲区中。

M-y

回转kill-ring,并提取新的顶部。 如果前面的命令是C-yM-y,那么只能这样做。


下一页:,上一页:,上一节:Readline 交互 [目录] [索引]

8.2.4 Readline 参数

您可以将数字参数传递给Readline命令。 有时候这个参数就像重复计数一样,其他时候这是重要参数的sign 如果你将一个否定的参数传递给一个通常作用于正向的命令,那么这个命令将作用于反向。 例如,要将文本消除回行首,可以键入'M-C-k'。

将数字参数传递给命令的一般方法是在命令之前输入元数字。 如果输入的第一个“数字”是一个减号(' - '),那么参数的符号将是负数。 一旦你输入了一个元数字来获得参数开始,你可以键入其余的数字,然后命令。 例如,要给C-d命令一个10的参数,可以键入'M-10 C-d',这将删除输入行中的下十个字符。


上一页:,上一节:Readline 交互 [目录] [索引]

8.2.5 在历史中搜索命令

Readline提供了用于搜索包含指定字符串的行的命令历史命令的命令(参见Bash History Facilities)。 有两种搜索模式:incrementalnon-incremental

增量搜索在用户输入搜索字符串之前开始。 由于搜索字符串的每个字符都是键入的,所以Readline会显示匹配到目前为止输入的字符串的历史记录中的下一个条目。 增量搜索只需要找到所需的历史条目所需的字符数。 要在特定字符串的历史记录中向后搜索,请键入C-r。键入C-s通过历史记录向前搜索。 存在于isearch-terminators变量​​值中的字符用于终止增量搜索。 如果该变量未被赋值,则ESCC-J字符将终止增量搜索。 C-g将中止增量搜索并恢复原始行。 搜索结束后,包含搜索字符串的历史记录将成为当前行。

要在历史记录列表中找到其他匹配条目,请根据需要键入C-rC-s 这将在历史记录中向后或向前搜索匹配到目前为止输入的搜索字符串的下一个条目。 绑定到Readline命令的任何其他键序列将终止搜索并执行该命令。 例如,一个RET将终止搜索并接受该行,从而执行历史列表中的命令。 移动命令将终止搜索,使最后一行找到当前行,并开始编辑。

Readline会记住最后一个增量搜索字符串。 如果在没有任何中间字符定义新的搜索字符串的情况下输入两个C-r,则使用任何记忆的搜索字符串。

在开始搜索匹配的历史记录行之前,非增量搜索会读取整个搜索字符串。 搜索字符串可以由用户输入,也可以是当前行内容的一部分。


下一页: , 上一页: , 上一节: 命令行编辑   [目录][索引]

8.3 Readline 初始化文件

虽然Readline库带有一组默认安装的Emacs类型的键绑定,但是可以使用不同的键绑定集。 任何用户都可以通过将命令放在inputrc文件中,自定义使用Readline的程序,通常在他的主目录中。 该文件的名称取自shell变量INPUTRC的值。 如果该变量未设置,则默认为〜/.inputrc 如果该文件不存在或无法读取,则最终默认为/ete/inputrc

当使用Readline库的程序启动时,读取init文件,并设置密钥绑定。

另外,C-x C-r命令会重新读取此init文件,从而将您可能对其进行的任何更改合并到一起。


下一页:,上一节:Readline初始化文件 [目录] [索引]

8.3.1 Readline 初始化文件语法

Readline初始化文件只允许有几个基本的构造。 空白行被忽略。 #开头的行是注释。 $开头的行表示条件结构(参见条件初始结构)。 其他行代表变量设置和键绑定。

变量设置

通过在init文件中使用set命令更改Readline中变量的值,可以修改Readline的运行时行为。 语法很简单:

set variable value

这里举个例子,如何从默认的Emacs-like键绑定改为使用vi行编辑命令:

set editing-mode vi

在适当的情况下,可以识别变量名称和值,而不考虑大小写。 无法识别的变量名称被忽略。

如果值为null或空,on(不区分大小写)或1,则布尔变量(可设置为打开或关闭的变量)设置为on。 任何其他值都会导致变量被设置为关闭。

bind -V 命令列出当前的Readline变量名称和值。 参见Bash Builtins

下面的变量可以改变大量的运行时行为。

bell-style

控制Readline想要打开终端响铃时发生的事情。 如果设置为“none”,则Readline不会响铃。 如果设置为“visible”,则Readline将使用可见铃声(如果有)。 如果设置为“audible”(默认),Readline尝试响铃终端。

bind-tty-special-chars

如果设置为on(缺省值),Readline将尝试将内核终端驱动程序专门处理的控制字符绑定到它们的Readline等效项。

blink-matching-paren

如果在上设置为“on”,则在插入右括号时,Readline会尝试短暂地将光标移到左括号。 默认值是“off”。

colored-completion-prefix

如果设置为on,列表完成时,Readline将使用不同的颜色显示可能完成集的公共前缀。 颜色定义取自LS_COLORS环境变量的值。 默认值是“off”。

colored-stats

如果设置为“on”,则Readline将使用不同的颜色显示可能的完成项,以指示其文件类型。 颜色定义取自LS_COLORS环境变量的值。 默认值是“off”。

comment-begin

在执行insert-comment命令时在行首插入的字符串。 默认值是“#”

completion-display-width

执行完成时用于显示可能匹配的屏幕列数。 如果小于0或大于终端屏幕宽度,则忽略该值。 值为0将导致每行显示一个匹配项。 默认值是-1。

completion-ignore-case

如果在上设置为‘on’,则Readline以不区分大小写的方式执行文件名匹配和完成。 默认值是'off'。

completion-map-case

如果设置为on,并且启用了completion-ignore-case,则Readline会使用连字符('-')和下划线_)作为等效的时候执行不区分大小写的文件名匹配和完成。

completion-prefix-display-length

可能完成列表的公共前缀的字符长度,不加修改地显示。 当设置为大于零的值时,在显示可能的完成时,比这个值更长的公共前缀将被替换为省略号。

completion-query-items

确定何时询问用户是否应显示可能性列表的可能完成次数。 如果可能的完成次数大于这个值,Readline将询问用户是否希望查看它们;否则,他们只是简单列出。 该变量必须设置为大于或等于0的整数值。 负值意味着Readline不会询问。 默认限制是100

convert-meta

如果设置为on,则Readline将通过去除第八位并将ESC前缀转换为第八位设置为ASCII字符,将它们转换为元前缀的键序列。 默认值是on,但是如果语言环境是包含8位字符的语言环境,则会将其设置为“off”。

disable-completion

如果设置为On,Readline将禁止单词完成。 完成字符将被插入到行中,就好像它们已被映射到self-insert一样。 默认值是“off”。

echo-control-characters

当设置on时,在表示支持它的操作系统上,readline回显对应于键盘生成的信号的字符。 默认是“on”。

editing-mode

editing-mode变量​​控制使用哪一组默认的键绑定。 默认情况下,Readline以Emacs编辑模式启动,其中按键与Emacs最为相似。 这个变量可以设置为'emacs'或'vi'。

emacs-mode-string

当emacs编辑模式处于活动状态时,该字符串紧接在主提示符的最后一行之前显示。 该值被扩展为一个键绑定,所以标准的元和前缀和反斜杠转义序列是可用的。 使用“\1”和“\2”转义来开始和结束非打印字符序列,可用于将终端控制序列嵌入模式串。 默认值是“@”。

enable-bracketed-paste

当设置为“On”时,Readline将配置终端,使其能够将每个粘贴插入到编辑缓冲区中作为单个字符串,而不是像处理每个字符一样从键盘上读取。 这可以防止粘贴的字符被解释为编辑命令。 默认值是“off”。

enable-keypad

当设置为on时,Readline将尝试在应用程序键盘被调用时启用。 有些系统需要这个来启用箭头键。 默认值是“off”。

enable-meta-key

当设置为on时,Readline将尝试启用终端声称在调用时支持的任何元修饰键。 在许多终端上,元密钥用于发送八位字符。 默认是“on”。

expand-tilde

如果在上设置为“on”,则当Readline尝试完成单词时,会执行波形扩展。 默认值是“off”。

history-preserve-point

如果设置为on,则历史代码尝试将点(当前光标位置)放置在通过previous-historynext-history 默认值是“off”。

history-size

设置保存在历史记录列表中的历史记录条目的最大数目。 如果设置为零,则删除任何现有的历史记录条目并且不保存新的条目。 如果设置为小于零的值,则历史条目的数量不受限制。 缺省情况下,历史表项的个数不受限制。 如果尝试将history-size设置为非数字值,则最大历史记录数将被设置为500。

horizontal-scroll-mode

这个变量可以设置为'on'或'off'。 将它设置为on意味着正在编辑的行的文本将在一个屏幕行上水平滚动,当它们长于屏幕宽度时,而不是包装到新的屏幕行上。 默认情况下,这个变量被设置为'off'。

input-meta

如果设置为on,Readline将启用8位输入(它不会清除所读取字符的第8位),无论终端声称它可以支持什么。 默认值是'off',但是如果区域设置包含八位字符,则Readline会将它设置为'on'。 名字meta-flag是这个变量的同义词。

isearch-terminators

应该终止增量搜索的字符串,不会随后将该字符作为命令执行(请参阅搜索)。 如果这个变量没有被赋值,那么字符ESCC-J将终止增量搜索。

keymap

设置Readline关于键绑定命令的当前键映射的想法。 可接受的keymap名称是emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move, vi-command,和vi-insert vivi-command等价(vi-move也是同义词)。 emacs等同于emacs-standard 默认值是emacs editing-mode变量​​的值也影响默认的键盘映射。

keyseq-timeout

指定Readline在读取不明确的键序列(可以使用迄今为止的输入读取形成完整的键序列,或者可以采取额外的输入来完成更长的键序列)时等待字符的持续时间。 如果在超时时间内没有收到任何输入,Readline将使用较短但完整的密钥序列。 Readline使用此值来确定当前输入源是否有输入(缺省情况下rl_instream)。 该值以毫秒为单位指定,因此值为1000表示Readline将等待一秒钟以获取更多输入。 如果此变量设置为小于或等于零的值或非数字值,则Readline将等待,直到按下另一个键来决定完成哪个键序列。 默认值是500

mark-directories

如果设置为“on”,则完成的目录名称会附加一个斜杠。 默认是“on”。

mark-modified-lines

该变量设置为on时,会导致Readline在已修改的历史记录行的起始处显示星号(“*')。 这个变量默认是'off'。

mark-symlinked-directories

如果设置为'on',那么作为符号连接到目录的已完成名称将附加一个斜杠(取决于mark-directories的值)。 默认值是“off”。

match-hidden-files

这个变量在上设置为'on'时,会导致Readline匹配名称以'.'(隐藏文件)执行文件名完成时。 如果设置为“off”,.必须由用户在文件名中提供完成。 这个变量默认是'on'。

menu-complete-display-prefix

如果在上设置为“”,则菜单完成将在循环显示列表之前显示可能完成列表(可能为空)的公共前缀。 默认值是“off”。

output-meta

如果设置为on,Readline将直接显示第八位字符,而不是作为元前缀转义序列。 默认值是'off',但如果区域设置包含8位字符,则Readline会将其设置为on

page-completions

如果设置为on,Readline使用一个内部的more-的寻呼机来一次显示可能的完成情况。 这个变量默认是'on'。

print-completions-horizontally

如果在上设置为on,则Readline将显示按字母顺序水平排序的完成项,而不是在屏幕下方。 默认值是“off”。

revert-all-at-newline

如果设置为on,则在执行​​accept-line时,Readline将返回所有对历史行的更改。 默认情况下,可以修改历史记录行,并在跨readline的调用之间保留个别撤消列表。 默认值是“off”。

show-all-if-ambiguous

这改变了完成功能的默认行为。 如果在上设置为“on”,则具有多个可能的完成的单词将立即被列出,而不是响铃。 默认值是'off'。

show-all-if-unmodified

这会以类似于show-all-if-ambiguous的方式改变完成函数的默认行为。 如果在上设置为on,则具有多个可能的完成而没有任何可能的部分完成的词(可能的完成不共享前缀)导致匹配被立即列出而不是响铃钟。 默认值是'off'。

show-mode-in-prompt

如果设置为“on”,则在提示的开头添加一个字符,指示编辑模式:emacs,vi命令或vi插入。 模式字符串是用户可设置的。 默认值是'off'。

skip-completed-text

如果设置为“on”,则在将单个匹配插入行时,这会改变默认的完成行为。 只有在一个字中间完成时才会激活。 如果启用,readline不会插入字符完成后的匹配字符的完成字符,因此光标后面的字的部分不会被重复。 例如,如果启用了这个功能,当Makefile中的光标在'e'之后尝试完成时,将产生'Makefile'而不是“Makefilefile”,假设有一个可能的完成。 默认值是'off'。

vi-cmd-mode-string

当vi编辑模式处于活动状态并处于命令模式时,此字符串紧挨着主提示的最后一行显示。 该值被扩展为一个键绑定,所以标准的元和前缀和反斜杠转义序列是可用的。 使用“\1”和“\2”转义来开始和结束非打印字符序列,可用于将终端控制序列嵌入模式串。 默认值是“(cmd)”。

vi-ins-mode-string

当vi编辑模式处于活动状态并处于插入模式时,此字符串紧靠主要提示的最后一行之前显示。 该值被扩展为一个键绑定,所以标准的元和前缀和反斜杠转义序列是可用的。 使用“\1”和“\2”转义来开始和结束非打印字符序列,可用于将终端控制序列嵌入模式串。 默认值是“(ins)”。

visible-stats

如果设置为on,当列出可能的完成时,表示文件类型的字符会附加到文件名中。 默认值是“off”。

Key Bindings

在init文件中控制键绑定的语法很简单。 首先,您需要找到您想要更改的命令的名称。 以下部分包含命令名称表,缺省键绑定表(如果有的话)以及命令所做的简短描述。

一旦知道了命令的名称,只需在init文件的一行中放置要绑定该命令的键的名称,冒号,然后是命令的名称即可。 密钥名称和冒号之间不能有空格 - 这将被解释为密钥名称的一部分。 密钥的名称可以用不同的方式表示,具体取决于你觉得最舒服的方式。

除了命令名,readline还允许将键绑定到按下键时插入的字符串(macro)。

bind -p 命令以可直接放入初始化文件的格式显示Readline函数名称和绑定。 参见Bash Builtins

keynamefunction-name or macro

keyname是英文拼写的关键字的名称。 例如:

Control-u: universal-argument
Meta-Rubout: backward-kill-word
Control-o: "> output"

在上例中,C-u被绑定到函数universal-argumentM-DEL被绑定到函数backward-kill-word,和C-o绑定运行在右侧表示的宏(也就是插入文本> output到行中)。

处理此键绑定语法时会识别许多符号字符名称:DEL, ESC, ESCAPE, LFD, NEWLINE, RET, RETURN, RUBOUT, SPACE, SPC, 和TAB

"keyseq": function-name or macro

keyseq不同于上面的keyname,因为可以通过将键序列放在双引号中来指定表示整个键序列的字符串。 可以使用一些GNU Emacs样式的键转义符,如下例所示,但不能识别特殊字符名称。

"\C-u": universal-argument
"\C-x\C-r": re-read-init-file
"\e[11~": "Function Key 1"

在上面的例子中,C-u 再次被绑定到函数universal-argument上(就像它在第一个例子中一样),C-x C-r绑定到函数re-read-init-fileESC [ 1 1 ~被绑定到Function Key 1

指定键序列时,可以使用以下GNU Emacs样式转义序列:

\C-

控制前缀

\M-

元前缀

\e

转义字符

\\

反斜线

\"

",双引号

\'

',单引号或撇号

除了GNU Emacs风格转义序列之外,第二组反斜杠转义是可用的:

\a

警报(钟)

\b

退格

\d

删除

\f

换页

\n

新行

\r

回车

\t

水平制表符

\v

垂直制表符

\nnn

八位数值的八位字符nnn(一至三位数字)

\xHH

八位字符,其值是十六进制值HH (一个或两个十六进制数字)

输入宏的文本时,必须使用单引号或双引号来表示宏定义。 未加引号的文本被假定为一个函数名称。 在宏体中,上面描述的反斜杠转义扩展了。 反斜杠会引用宏文本中的任何其他字符,包括‘"’ and ‘'’。 例如,下面的绑定将使C-x \插入一行:\

"\C-x\\": "\\"

下一页:,上一页:,上一节:Readline初始化文件 [目录] [索引 ]

8.3.2 条件的初始结构

Readline实现了一个类似于C预处理器的条件编译特性的工具,它允许按照测试结果执行键绑定和变量设置。 有四个解析器指令使用。

$if

$if结构允许基于编辑模式,正在使用的终端或使用Readline的应用程序进行绑定。 测试的文本延伸到行的末尾;不需要字符来隔离它。

mode

$if指令的mode=形式用于测试Readline是否处于emacsvi模式。 这可以与'set keymap'命令结合使用,例如,在emacs-standardemacs-ctlx只有当Readline以emacs模式启动时才能使用键盘映射。

term

可以使用term=形式来包含特定于终端的密钥绑定,也许是为了绑定由终端的功能密钥输出的密钥序列。 在'='右侧的单词将在第一个'-'之前针对终端的全名和终端名称的部分进行测试。 这允许sun匹配sunsun-cmd

application

application结构用于包含应用程序特定的设置。 每个使用Readline库的程序都会设置application name,您可以测试一个特定的值。 这可以用来将键序列绑定到对特定程序有用的函数。 例如,下面的命令添加一个在Bash中引用当前或前一个字的键序列:

$if Bash
# Quote the current or previous word
"\C-xq": "\eb\"\ef\""
$endif
$endif

这个命令,如前面的例子所示,终止一个$if命令。

$else

如果$if测试失败,则执行的这个分支中的命令。

$include

该指令采用单个文件名作为参数,并从该文件读取命令和绑定。 例如,以下指令从/etc/inputrc中读取:

$include /etc/inputrc

上一页:,上一节:Readline 初始文档 [目录] [索引]

8.3.3 初始化文件示例

这是一个inputrc文件的例子。 这说明了键绑定,变量赋值和条件语法。

# This file controls the behaviour of line input editing for
# programs that use the GNU Readline library.  Existing
# programs include FTP, Bash, and GDB.
#
# You can re-read the inputrc file with C-x C-r.
# Lines beginning with '#' are comments.
#
# First, include any system-wide bindings and variable
# assignments from /etc/Inputrc
$include /etc/Inputrc

#
# Set various bindings for emacs mode.

set editing-mode emacs 

$if mode=emacs

Meta-Control-h:	backward-kill-word	Text after the function name is ignored

#
# Arrow keys in keypad mode
#
#"\M-OD":        backward-char
#"\M-OC":        forward-char
#"\M-OA":        previous-history
#"\M-OB":        next-history
#
# Arrow keys in ANSI mode
#
"\M-[D":        backward-char
"\M-[C":        forward-char
"\M-[A":        previous-history
"\M-[B":        next-history
#
# Arrow keys in 8 bit keypad mode
#
#"\M-\C-OD":       backward-char
#"\M-\C-OC":       forward-char
#"\M-\C-OA":       previous-history
#"\M-\C-OB":       next-history
#
# Arrow keys in 8 bit ANSI mode
#
#"\M-\C-[D":       backward-char
#"\M-\C-[C":       forward-char
#"\M-\C-[A":       previous-history
#"\M-\C-[B":       next-history

C-q: quoted-insert

$endif

# An old-style binding.  This happens to be the default.
TAB: complete

# Macros that are convenient for shell interaction
$if Bash
# edit the path
"\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
# prepare to type a quoted word --
# insert open and close double quotes
# and move to just after the open quote
"\C-x\"": "\"\"\C-b"
# insert a backslash (testing backslash escapes
# in sequences and macros)
"\C-x\\": "\\"
# Quote the current or previous word
"\C-xq": "\eb\"\ef\""
# Add a binding to refresh the line, which is unbound
"\C-xr": redraw-current-line
# Edit variable on current line.
"\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
$endif

# use a visible bell if one is available
set bell-style visible

# don't strip characters to 7 bits when reading
set input-meta on

# allow iso-latin1 characters to be inserted rather
# than converted to prefix-meta sequences
set convert-meta off

# display characters with the eighth bit set directly
# rather than as meta-prefixed characters
set output-meta on

# if there are more than 150 possible completions for
# a word, ask the user if he wants to see all of them
set completion-query-items 150

# For FTP
$if Ftp
"\C-xg": "get \M-?"
"\C-xt": "put \M-?"
"\M-.": yank-last-arg
$endif

下一页: , 上一页: , 上一节: Command Line Editing   [目录][索引]

8.4 可绑定的Readline命令

本节介绍可能绑定到键序列的Readline命令。 您可以通过执行bind -P来列出您的密钥绑定 或者,对于更简洁的格式,适用于inputrc文件,bind -p. (见Bash Builtins。) 没有附带键序列的命令名默认是未绑定的。

在下面的描述中,point表示当前的光标位置,mark表示由set-mark命令保存的光标位置。 点和标记之间的文本被称为region


下一页:,上一节:可绑定的Readline 命令 [目录] [索引]

8.4.1 移动命令

beginning-of-line (C-a)

移到当前行的开始处。

end-of-line (C-e)

移动到行的末尾。

forward-char (C-f)

前进一个角色。

backward-char (C-b)

移回一个字符。

forward-word (M-f)

前进到下一个单词的末尾。 单词由字母和数字组成。

backward-word (M-b)

返回到当前或前一个单词的开头。 单词由字母和数字组成。

shell-forward-word ()

前进到下一个单词的末尾。 单词由非引用的shell元字符分隔。

shell-backward-word ()

返回到当前或前一个单词的开头。 单词由非引用的shell元字符分隔。

clear-screen (C-l)

清除屏幕并重画当前行,将当前行留在屏幕的顶部。

redraw-current-line ()

刷新当前行。 默认情况下,这是解除绑定。


下一页: , 前一页: , 上一节: 绑定 Readline 命令   [目录][索引]

8.4.2 操纵历史的命令

accept-line (Newline or Return)

无论光标位于何处,都接受该行。 如果该行不为空,则根据HISTCONTROLHISTIGNORE变量的设置将其添加到历史记录列表中。 如果这行是修改的历史行,则将历史行恢复到其原始状态。

previous-history (C-p)

通过历史列表移回“后退”,获取前一个命令。

next-history (C-n)

通过历史列表向前移动,获取下一个命令。

beginning-of-history (M-<)

移至历史记录的第一行。

end-of-history (M->)

移到输入历史的末尾,即当前正在输入的行。

reverse-search-history (C-r)

从当前行开始向后搜索,并根据需要在历史记录中向上移动。 这是一个增量搜索。

forward-search-history (C-s)

从当前行开始向前搜索,并根据需要在历史记录中向下移动。 这是一个增量搜索。

non-incremental-reverse-search-history (M-p)

从当前行开始向后搜索,并根据需要通过历史记录向上移动,使用非递增搜索由用户提供的字符串。 搜索字符串可以匹配历史行中的任何地方。

non-incremental-forward-search-history (M-n)

从当前行开始向前搜索,并根据需要使用历史记录向下移动,使用非递增搜索由用户提供的字符串。 搜索字符串可以匹配历史行中的任何地方。

history-search-forward ()

在当前行的起点和点之间搜索字符串的历史记录。 搜索字符串必须匹配历史行的开头。 这是一个非增量搜索。 默认情况下,该命令是未绑定的。

history-search-backward ()

向后搜索历史记录,查看当前行与起始点之间的字符串。 搜索字符串必须匹配历史行的开头。 这是一个非增量搜索。 默认情况下,该命令是未绑定的。

history-substr-search-forward ()

在当前行的起点和点之间搜索字符串的历史记录。 搜索字符串可以匹配历史行中的任何地方。 这是一个非增量搜索。 默认情况下,该命令是未绑定的。

history-substr-search-backward ()

向后搜索历史记录,查看当前行与起始点之间的字符串。 搜索字符串可以匹配历史行中的任何地方。 这是一个非增量搜索。 默认情况下,该命令是未绑定的。

yank-nth-arg (M-C-y)

将第一个参数插入到前一个命令(通常是前一行中的第二个单词)。 使用参数n,插入前一个命令中的n个单词(前一个命令中的单词以单词0开头)。 负参数从前一个命令的末尾插入n个字。 一旦计算了参数n,参数就被提取,就像指定了!n历史扩展一样。

yank-last-arg (M-. 或者 M-_)

将上一个参数插入前一个命令(前一个历史记录的最后一个单词)。 使用数字参数,其行为与yank-nth-arg完全相同。 yank-last-arg的连续调用通过历史列表返回,将每行的最后一个单词(或由参数指定的单词)依次插入。 提供给这些连续调用的任何数字参数都将决定在历史记录中移动的方向。 负参数将切换历史方向(后退或前进)。 历史扩展设施用于提取最后一个参数,就好像指定了“!$”历史扩展一样。


下一页: , 上一页: , 上一节: 绑定 Readline 命令   [目录][索引]

8.4.3 改变文字的命令

end-of-file (usually C-d)

表示文件结束符的字符,例如stty 如果在该行上没有字符时读取此字符,并且点在行的开始处,则Readline将其解释为输入的结束并返回 EOF

delete-char (C-d)

删除点上的字符。 如果这个函数和tty EOF字符绑定的字符相同,就像C-d通常一样,见上面的效果。

backward-delete-char (Rubout)

删除光标后面的字符。 数字参数意味着删除字符而不是删除它们。

forward-backward-delete-char ()

删除光标下的字符,除非光标在行的末尾,在这种情况下光标后面的字符被删除。 默认情况下,这不是绑定到一个键。

quoted-insert (C-q or C-v)

逐字添加下一个输入的字符。 例如,这是如何插入密钥序列,如C-q

self-insert (a, b, A, 1, !, …)

插入自身。

bracketed-paste-begin ()

这个功能是绑定到某些终端发送的“括号内粘贴”转义序列,这种绑定是默认分配的。 它允许Readline将粘贴的文本作为一个单元插入,而不用将每个字符看作是从键盘读取的。 插入的字符好像每个字符都被绑定到self-insert),而不是执行任何编辑命令。

transpose-chars (C-t)

将光标前面的字符拖到光标处的字符上,同时向前移动光标。 如果插入点位于该行的末尾,则会转换该行的最后两个字符。 否定参数不起作用。

transpose-words (M-t)

在点之前拖动单词,将点移动到该单词之后。 如果插入点位于行的末尾,则会移动行上的最后两个单词。

upcase-word (M-u)

大写当前(或下一个)字。 用负的参数,大写前面的单词,但不要移动光标。

downcase-word (M-l)

小写当前(或下一个)字。 用负的参数,小写前面的单词,但不要移动光标。

capitalize-word (M-c)

大写当前(或下一个)字。 用一个负的参数,把前面的单词大写,但不要移动光标。

overwrite-mode ()

切换覆盖模式。 用明确的正数值参数,切换到覆盖模式。 用明确的非正数字参数,切换到插入模式。 这个命令只影响emacs模式; vi 模式覆盖不同。 每次调用readline()都以插入模式启动。

在覆盖模式下,绑定到自插入的字符将替换文本,而不是将文本向右推。 绑定到后向删除字符的字符用空格替换点之前的字符。

默认情况下,该命令是未绑定的。


下一页:,上一个:,上一节:可绑定的Readline命令 [目录] [索引]

8.4.4 删除和粘贴

kill-line (C-k)

将文本从点删除到行尾。

backward-kill-line (C-x Rubout)

从光标后退到当前行的开头。

unix-line-discard (C-u)

从光标后退到当前行的开头。

kill-whole-line ()

杀死当前行上的所有字符,不管在哪里。 默认情况下,这是解除绑定。

kill-word (M-d)

从当前单词的结尾,或者单词之间,到下一个单词的结尾处终止。 字边界与forward-word相同。

backward-kill-word (M-DEL)

删除这个词。 字边界与backward-word相同。

shell-kill-word ()

从当前单词的结尾,或者单词之间,到下一个单词的结尾处终止。 字边界与shell-forward-word相同。

shell-backward-kill-word ()

删除这个词。 字边界与shell-backward-word相同。

unix-word-rubout (C-w)

把这个词删除,用空格作为单词边界。 删除的文本保存在kill-ring上。

unix-filename-rubout ()

把这个词删除,使用空格和斜杠作为单词边界。 删除的文本保存在kill-ring上。

delete-horizontal-space ()

删除点的所有空格和制表符。 默认情况下,这是解除绑定。

kill-region ()

删除当前区域中的文本。 默认情况下,该命令是未绑定的。

copy-region-as-kill ()

将区域中的文本复制到删除缓冲区,这样就可以立即跳过。 默认情况下,该命令是未绑定的。

copy-backward-word ()

将点前的单词复制到kill buffer。 字边界与backward-word相同。 默认情况下,该命令是未绑定的。

copy-forward-word ()

将单词的下一个点复制到kill buffer。 字边界与forward-word相同。 默认情况下,该命令是未绑定的。

yank (C-y)

粘贴 kill ring顶部的缓冲区。

yank-pop (M-y)

回转kill-ring,并提取新的顶部。 如果前面的命令是yankyank-pop,那么只能这样做。


下一页: , 前一页: , 上一节: 绑定 Readline 命令   [目录][索引]

8.4.5 指定数字参数

digit-argument (M-0, M-1, … M--)

把这个数字加到已经积累的参数上,或者开始一个新的参数。 M--开始一个否定的参数。

universal-argument ()

这是指定参数的另一种方法。 如果此命令后跟一个或多个数字(可选带有前导减号),则这些数字将定义参数。 如果该命令之后是数字,则执行universal-argument将再次结束数字参数,否则将被忽略。 作为一种特殊情况,如果该命令之后紧跟着一个既不是数字也不是减号的字符,则下一个命令的参数计数乘以4。 参数计数最初是一个,因此第一次执行此函数会使参数计数为四,第二次使参数计数为十六,依此类推。 默认情况下,这不是绑定到一个键。


下一页:,上一页:,上一节:可绑定的Readline命令 [目录] [索引]

8.4.6 为您设置Readline类型

complete (TAB)

尝试在点之前对文本执行补全。 执行的实际完成是应用程序特定的。 如果文本以'$'开始,用户名(如果文本以''开头),主机名(如果文本以'@'开始)或命令(包​​括别名和函数)。 如果这些都不匹配,则尝试文件名完成。

possible-completions (M-?)

在点之前列出可能的文本补全。 当显示完成时,Readline将用于显示的列数设置为completion-display-width的值,环境变量COLUMNS的值或者屏幕宽度,以该顺序。

insert-completions (M-*)

在由possible-completions生成的点之前插入文本的所有补全。

menu-complete()

complete类似,但用可能补全列表中的单个匹配代替要补全的单词。 重复执行menu-complete步骤,遍历可能的补全列表,依次插入每个匹配项。 在补全列表的末尾,铃声响起(按照bell-style的设置),原始文本被恢复。 n的参数在匹配列表中向前移动n负面的参数可能会被用来在列表中向后移动。 此命令旨在绑定到TAB,但默认情况下未绑定。

menu-complete-backward ()

menu-complete完全相同,但是在整个可能的完成列表中向后移动,就好像menu-complete被赋予了一个负面的参数。

delete-char-or-list ()

删除光标下的字符,如果不在行的开头或末尾(如delete-char)。 如果在行的末尾,行为与possible-completions相同。 该命令默认是未绑定的。

complete-filename (M-/)

尝试文件名补全前的文本点。

possible-filename-completions (C-x /)

在点之前列出可能的文本补全,将其视为文件名。

complete-username (M-~)

尝试在点之前的文本补全,将其视为用户名。

possible-username-completions (C-x ~)

在点之前列出可能的文本补全,将其视为用户名。

complete-variable (M-$)

尝试在点之前的文本补全,将其视为一个shell变量。

possible-variable-completions (C-x $)

在点之前列出可能的文本补全,将其视为一个shell变量。

complete-hostname (M-@)

尝试在点之前补全文本,将其视为主机名。

possible-hostname-completions (C-x @)

在点之前列出可能的文本补全,将其视为主机名。

complete-command (M-!)

尝试补全之前的文字,将其视为一个命令名称。 命令补全尝试按照该顺序将文本与别名,保留字,shell函数,shell内置函数以及最终的可执行文件名进行匹配。

possible-command-completions (C-x !)

在点之前列出可能的文本补全,将其视为命令名称。

dynamic-complete-history (M-TAB)

尝试补全点之前的文本,比较文本与历史列表中可能的完成匹配的行。

dabbrev-expand ()

尝试在点之前的文本上补全菜单,将文本与历史列表中的行进行比较,以获得可能的完成匹配。

complete-into-braces (M-{)

执行文件名完成并插入大括号内的可能补全列表,以便列表可用于shell(请参阅Brace Expansion)。


下一页:,上一页:,上一节:可绑定的 Readline 命令 [目录] [索引]

8.4.7 键盘宏

start-kbd-macro (C-x ()

开始保存输入到当前键盘宏的字符。

end-kbd-macro (C-x ))

停止将键入的字符保存到当前键盘宏并保存定义。

call-last-kbd-macro (C-x e)

重新执行最后定义的键盘宏,使宏中的字符看起来好像在键盘上输入一样。

print-last-kbd-macro ()

打印以适合inputrc文件格式定义的最后一个键盘宏。


前一页: , 上一节: 绑定 Readline命令   [目录][索引]

8.4.8 一些杂项命令

re-read-init-file (C-x C-r)

读入inputrc文件的内容,并将其中的任何绑定或变量赋值合并到一起。

abort (C-g)

中止当前的编辑命令并响铃终端(以bell-style设置为准)。

do-uppercase-version (M-a, M-b, M-x, …)

如果元字符x是小写字母,则运行绑定到相应大写字符的命令。

prefix-meta (ESC)

Metafy键入下一个字符。 这是没有元键的键盘。 输入'ESC f'相当于输入M-f

undo (C-_ or C-x C-u)

增量撤消,分别记住每一行。

revert-line (M-r)

撤消对此行的所有更改。 这就像执行undo命令足够多次以回到开始。

tilde-expand (M-&)

在当前单词上进行波浪扩展。

set-mark (C-@)

将标记设置为点。 如果提供数字参数,则标记将设置为该位置。

exchange-point-and-mark (C-x C-x)

用标记交换点。 当前光标位置设置为保存位置,旧光标位置保存为标记。

character-search (C-])

一个字符被读取,并且点被移动到该字符的下一个出现处。 负数会搜索以前的事件。

character-search-backward (M-C-])

一个字符被读取并且点被移动到该字符的前一次出现处。 负数会搜索后续的事件。

skip-csi-sequence ()

读取足够多的字符以使用多键序列,例如为Home和End等键定义的字符。 这样的序列以控制序列指示符(CSI)开始,通常是ESC-[。 如果这个序列绑定到“\e[”,那么产生这样的序列的键将不起作用,除非明确地绑定到readline命令,而不是将杂散字符插入到编辑缓冲器中。 这在默认情况下是未绑定的,但通常绑定到ESC-[。

insert-comment (M-#)

没有数字参数,comment-begin变量​​的值插入到当前行的开头。 如果提供数字参数,则该命令作为切换开关:如果行首的字符与comment-begin的值不匹配,则插入该值,否则将在comment-begin从行首开始删除。 在任何一种情况下,该行都被接受,就像换行符一样。 comment-begin的默认值将导致此命令将当前行作为shell注释。 如果数字参数导致注释字符被删除,则该行将由shell执行。

dump-functions ()

将所有的函数及其键绑定到Readline输出流。 如果提供了一个数字参数,则输出格式可以作为inputrc文件的一部分。 该命令默认是未绑定的。

dump-variables ()

将所有可设置的变量及其值输出到Readline输出流。 如果提供了一个数字参数,则输出格式可以作为inputrc文件的一部分。 该命令默认是未绑定的。

dump-macros ()

打印所有绑定到宏的Readline键序列及其输出的字符串。 如果提供了一个数字参数,则输出格式可以作为inputrc文件的一部分。 该命令默认是未绑定的。

glob-complete-word (M-g)

点之前的单词被视为路径名扩展的模式,并附有星号。 该模式用于生成可能完成的匹配文件名列表。

glob-expand-word (C-x *)

点之前的单词被视为路径名扩展的模式,插入匹配文件名的列表,替换单词。 如果提供数字参数,则在路径名扩展之前附加“*”。

glob-list-expansions (C-x g)

显示由glob-expand-word生成的扩展列表,并重绘该行。 如果提供数字参数,则在路径名扩展之前附加“*”。

display-shell-version (C-x C-v)

显示有关当前Bash实例的版本信息。

shell-expand-line (M-C-e)

像shell一样展开该行。 这将执行别名和历史扩展以及所有的shell扩展(参见Shell Expansions)。

history-expand-line (M-^)

在当前行上执行历史扩展。

magic-space ()

在当前行上执行历史扩展并插入一个空格(请参阅历史记录交互)。

alias-expand-line ()

在当前行上执行别名扩展(请参阅别名)。

history-and-alias-expand-line ()

在当前行上执行历史和别名扩展。

insert-last-argument (M-. 或M-)

yank-last-arg的同义词。

operate-and-get-next (C-o)

接受当前行执行,并从历史记录中获取相对于当前行的下一行以进行编辑。 任何参数都被忽略。

edit-and-execute-command (C-xC-e)

在当前命令行上调用编辑器,并将结果作为shell命令执行。 Bash试图依次调用$VISUAL$EDITORemacs作为编辑器。


下一页:,上一页:,上一节:命令行编辑 [目录][索引]

8.5 readline vi模式

虽然Readline库没有一套完整的vi编辑功能,但它包含的内容足以允许对该行进行简单的编辑。 Readline vi模式的行为与POSIX标准中的规定相同。

要在emacsvi编辑模式之间进行交互切换,请使用'set -o emacs'和'set -o vi '命令(参见Set Builtin)。 Readline默认是emacs模式。

当你在vi模式下输入一行时,你已经被置于'插入'模式,就像你输入了'i'一样。 按下ESC切换到“命令”模式,您可以使用标准的vi运动键编辑该文本,使用k'和随后的'j'行等等。


下一页:,上一页:,上一节:命令行编辑 [目录][索引]

8.6 可编程补全

当对补全规范(a compspec)已经用complete内建命令定义的命令尝试完成单词完成时(参见可编程补全内建命令),则调用可编程完成设备。

首先,识别命令名称。 如果已经为该命令定义了compspec,则使用compspec来生成单词的可能补全列表。 如果命令字是空字符串(在空行开始时尝试完成),则使用complete-E选项定义的任何compspec。 如果命令字是完整路径名,则首先搜索完整路径名的compspec。 如果没有找到完整路径名的compspec,则试图找到最后一个斜杠后面部分的compspec。 如果这些搜索没有compspec结果,则使用complete-D选项定义的任何compspec用作默认值。

一旦找到了compspec,它就会被用来生成匹配的单词列表。 如果找不到compspec,则执行上述默认Bash完成(请参阅补全命令)。

首先,使用compspec指定的操作。 只有以正在完成的单词为前缀的匹配被返回。 -f-d选项用于文件名或目录名完成时,shell变量FIGNORE用于过滤匹配项。 请参阅Bash 变量,了解FIGNORE的说明。

接下来产生由文件名扩展模式指定给-G选项的任何完成。 模式生成的单词不需要匹配正在完成的单词。 GLOBIGNORE shell变量不用于过滤匹配,但使用FIGNORE shell变量。

接下来,将考虑指定为-W选项参数的字符串。 该字符串首先使用IFS特殊变量中的字符作为分隔符。 shell引用被声明。 然后使用大括号扩展,波浪符扩展,参数和变量扩展,命令替换和算术扩展(如上所述)(参见Shell扩展)展开每个单词。 使用上述规则拆分结果(请参阅分词)。 扩展的结果与正在完成的单词前缀匹配,并且匹配的单词成为可能的完成。

在生成这些匹配之后,将调用任何使用-F-C选项指定的shell函数或命令。 当命令或函数被调用时,COMP_LINECOMP_POINTCOMP_KEYCOMP_TYPE 变量被指派值作为上述的描述(见Bash变量)。 如果正在调用shell函数,还会设置COMP_WORDSCOMP_CWORD变量。 当调用函数或命令时,第一个参数($1)是其参数正在完成的命令的名称,第二个参数($2)是正在完成的单词,第三个参数($3)是字在当前的命令行上完成。 不执行针对正在完成的单词的生成的完成的过滤;该功能或命令具有完全自由的生成匹配。

首先调用-F指定的任何函数。 该函数可以使用任何shell工具,包括下面描述的compgencompopt内建函数(参见可编程补全内建命令)来生成匹配。 它必须把可能的完成放在COMPREPLY数组变量中,每个数组元素一个。

接下来,在与命令替换等价的环境中调用用-C选项指定的任何命令。 它应该打印完成列表,每行一个标准输出。 如有必要,可使用反斜杠来转义换行符。

在所有可能的完成生成后,用-X选项指定的过滤器将应用于列表。 过滤器是用于路径名扩展的模式;模式中的“&”被替换为正在完成的单词的文本。 字面上的&可能被反斜线转义,在尝试匹配前移除反斜线。 任何符合模式的补全都将从列表中删除。 前导的“!“否定模式;在这种情况下,任何不匹配模式的补全都将被删除。 如果启用了nocasematch shell选项(参见The Shopt Builtinshopt的描述),则不考虑字母字符大小写。

最后,将-P-S选项指定的任何前缀和后缀添加到完成列表的每个成员,并将结果返回到Readline完成代码可能的补全列表。

如果先前应用的操作没有生成任何匹配,并且在定义compspec时已经为complete提供了-o dirnames选项,则尝试完成目录名称的补全。

如果在定义compspec时将-o plusdirs选项提供给complete,则尝试补全目录名称并将任何匹配项添加到其他操作的结果中。

默认情况下,如果找到了一个compspec,那么它所生成的任何东西都将返回到补全代码,作为完整的可能补全集。 不会尝试默认Bash补全,并且禁用文件名补全的Readline默认值。 如果在定义compspec时将-o bashdefault选项提供给complete,则如果compspec不生成匹配项,则尝试默认Bash补全。 如果在定义了compspec时将-o default选项提供给complete,则如果compspec(以及如果尝试的话,默认Bash补全)不生成匹配。

当compspec指出需要目录名补全时,可编程补全函数强制Readline追加一个斜杠到已补全的名字,这些名字是目录的符号链接,取决于mark-directories Readline变量的值,不管 mark-symlinked-directories Readline变量的设置如何。

有一些动态修改补全的支持。 当与-D指定的缺省补全结合使用时,这是非常有用的。作为补全处理程序执行的shell函数有可能通过返回退出状态124来指示应该重试补全。 如果shell函数返回124,并更改与正在尝试补全的命令相关联的compspec(在执行该函数时作为第一个参数提供),则可编程补全将从头重新开始,尝试查找新的compspec那个命令。 这样可以在完成尝试时动态构建一组补全,而不是一次加载补全。

例如,假设有一个compspecs库,每个compspecs都保存在一个对应于该命令名的文件中,下面的默认补全函数将动态加载补全:

_completion_loader()
{
    . "/etc/bash_completion.d/$1.sh" >/dev/null 2>&1 && return 124
}
complete -D -F _completion_loader -o bashdefault -o default

下一页: , 上一页: , 上一节: 命令行编辑   [目录][索引]

8.7 可编程补全内置命令

三个内建命令可用于操作可编程补全工具:一个用于指定如何完成特定命令的参数,另一个用于修改正在发生的补全。

compgen
compgen [option] [word]

根据option生成word可能的补全匹配项,该选项可以是complete内置命令接受的任何选项,但-p-r,并将匹配写入标准输出。 当使用-F-C选项时,可编程补全工具设置的各种shell变量将不会有用。

如同可编程补全代码直接从具有相同标志的补全规范生成它们一样,匹配将以相同的方式生成。 如果指定word,则只显示匹配word的补全。

除非提供了无效的选项,否则返回值为真,或者没有生成匹配项。

complete
complete [-abcdefgjksuv] [-o comp-option] [-DE] [-A action] [-G globpat] [-W wordlist]
[-F function] [-C command] [-X filterpat]
[-P prefix] [-S suffix] name [name …]
complete -pr [-DE] [name …]

指定应如何补全每个name的参数。 如果提供了-p选项,或者没有提供任何选项,现有的补全规范将以允许它们重新用作输入的方式打印。 -r选项为每个name删除补全规范,或者如果没有提供name,则为所有补全规范。 -D选项指示其余的选项和操作应该适用于“默认”命令补全;也就是说,对之前未定义补全的命令尝试补全。 -E选项指示其余的选项和操作应该适用于“空”命令完成;即尝试在空白行上补全。

上面描述了当补全字完成时应用这些补全规范的过程(参见可编程补全)。 -D选项优先于-E选项。

其他选项(如果指定)具有以下含义。 -G-W-X选项的参数(以及必要时的-P-S 选项)应该在引用complete之前保护它们不被扩展。

-o comp-option

comp-option控制compspec行为的几个方面,超越了简单的补全生成。 comp-option 是下列之一:

bashdefault

如果compspec不产生匹配,则执行其余的默认Bash补全。

default

如果compspec生成不匹配,请使用Readline的默认文件名补全。

dirnames

如果compspec生成不匹配,则执行目录名称补全。

filenames

告诉Readline,compspec生成文件名,所以它可以执行任何文件名特定的处理(比如为引用特殊字符的目录名添加斜线,或者抑制尾随空格)。 此选项旨在与-F指定的shell函数一起使用。

noquote

告诉Readline不要引用完整的单词,如果它们是文件名(引用文件名是默认的)。

nosort

告诉Readline不要按字母顺序排列可能的补全列表。

nospace

告诉Readline不要在行尾添加空格(缺省值)。

plusdirs

在生成了由compspec定义的任何匹配之后,将尝试补全目录名称,并将所有匹配项添加到其他操作的结果中。

-A action

action可以是下列之一来生成可能的补全列表:

alias

别名。 也可以指定为-a

arrayvar

数组变量名称。

binding

Readline键绑定名称(请参见可绑定的Readline命令)。

builtin

shell内建命令的名称。 也可以指定为-b

command

命令名称。 也可以指定为-c

directory

目录名称。 也可以指定为-d

disabled

已禁用的shell的内部名称。

enabled

启用的shell的内部名称。

export

导出的shell变量的名称。 也可以指定为-e

file

文件名称。 也可以指定为-f

function

shell函数的名称。

group

组名称。 也可以指定为-g

helptopic

help内建命令所接受的帮助主题(请参阅Bash Builtins)。

hostname

主机名,取自HOSTFILE shell变量指定的文件(参见Bash Variables)。

job

作业名称,如果作业控制处于活动状态。 也可以指定为-j

keyword

shell保留字。 也可以指定为-k

running

正在运行的作业名称,如果作业控制处于活动状态

service

服务名称。 也可以指定为-s

setopt

set内建命令的-o选项的有效参数(请参阅The Set Builtin)。

shopt

Shell内建命令shopt的选项名称(见Bash Builtins)。

signal

信号名称。

stopped

如果作业控制处于活动状态,则停止作业的名称。

user

用户名称。 也可以指定为-u

variable

所有shell变量的名称。 也可以指定为-v

-C command

command在子shell环境中执行,其输出被用作可能的补全。

-F function

shell函数function在当前shell环境中执行。 执行时,$1是参数补全的命令的名称,$2是正在补全的单词,$3是正在补全的单词之前的单词,如上所述(参见可编程补全 )。 补全后,可能的补全将从COMPREPLY数组变量的值中检索。

-G globpat

扩展文件名扩展模式globpat以生成可能的补全项。

-P prefix

在应用了所有其他选项后,在每个可能的补全开始时添加prefix

-S suffix

在应用了所有其他选项后,每个可能的补全都会附加suffix

-W wordlist

使用IFS特殊变量中的字符作为分隔符分割wordlist,每个结果字都被展开。 可能的补全项是与正在补全的单词匹配的结果列表的成员。

-X filterpat

filterpat 被用作文件名称扩展模式. 它应用于由前面的选项和参数生成的可能补全列表,并且从列表中删除每个匹配filterpat的补全匹配项。 前导的“!'在 filterpat中的否定模式;在这种情况下,任何不匹配filterpat的完成都将被删除。

返回值是true,除非提供了一个无效的选项,否则-p-r以外的选项没有提供name参数,尝试删除没有规范的name的补全规范,或者添加补全规范时发生错误。

compopt
compopt [-o option] [-DE] [+o option] [name]

根据option修改每个name的补全选项,如果没有提供name,则修改当前正在执行的完成选项。 如果没有给出option,则显示每个name 的补全选项或当前补全。 option 的可能值是对上面描述的complete内建命令有效的值。 -D选项指示其余选项应该适用于“默认”命令补全;也就是说,对之前未定义补全的命令尝试补全。 -E选项指示其余选项应该适用于“空”命令补全;即尝试在空白行上补全。

-D选项优先于-E选项。

返回值为真,除非提供了无效的选项,则尝试修改name的选项,该名称不存在补全规范或发生输出错误。


上一页:,上一节:命令行编辑 [目录] [索引]

8.8 可编程补全示例

获取超出默认动作completecompgen的附加补全功能的最常用方式是使用shell函数并使用将其绑定到特定的complete -F

以下函数为cd内建提供了补全。 这是shell函数补全时必须执行的一个合理的例子。 这个函数使用passsed作为$2来确定补全的目录名称。 您也可以使用COMP_WORDS数组变量;当前单词由COMP_CWORD变量索引。

这个函数依赖于completecompgen来完成大部分的工作,仅仅添加Bash cd所做的事情,而不是接受基本的目录名字:波浪扩展(参见Tilde Expansion),搜索$CDPATH中的目录(参见Bourne Shell Builtins支持cdable_vars shell选项(参见Shopt Builtin)。 _comp_cd修改IFS的值,以便它只包含一个换行符以容纳包含空格和制表符的文件名 - compgen打印它生成的可能补全每行一个。

可能的补全进入COMPREPLY数组变量,每个数组元素补全一次。 可编程补全系统在函数返回时从那里检索补全。

# A completion function for the cd builtin
# based on the cd completion function from the bash_completion package
_comp_cd()
{
    local IFS=$' \t\n'    # normalize IFS
    local cur _skipdot _cdpath
    local i j k

    # Tilde expansion, with side effect of expanding tilde to full pathname
    case "$2" in
    \~*)    eval cur="$2" ;;
    *)      cur=$2 ;;
    esac

    # no cdpath or absolute pathname -- straight directory completion
    if [[ -z "${CDPATH:-}" ]] || [[ "$cur" == @(./*|../*|/*) ]]; then
        # compgen prints paths one per line; could also use while loop
        IFS=$'\n'
        COMPREPLY=( $(compgen -d -- "$cur") )
        IFS=$' \t\n'
    # CDPATH+directories in the current directory if not in CDPATH
    else
        IFS=$'\n'
        _skipdot=false
        # preprocess CDPATH to convert null directory names to .
        _cdpath=${CDPATH/#:/.:}
        _cdpath=${_cdpath//::/:.:}
        _cdpath=${_cdpath/%:/:.}
        for i in ${_cdpath//:/$'\n'}; do
            if [[ $i -ef . ]]; then _skipdot=true; fi
            k="${#COMPREPLY[@]}"
            for j in $( compgen -d -- "$i/$cur" ); do
                COMPREPLY[k++]=${j#$i/}        # cut off directory
            done
        done
        $_skipdot || COMPREPLY+=( $(compgen -d -- "$cur") )
        IFS=$' \t\n'
    fi

    # variable names if appropriate shell option set and no completions
    if shopt -q cdable_vars && [[ ${#COMPREPLY[@]} -eq 0 ]]; then
        COMPREPLY=( $(compgen -v -- "$cur") )
    fi

    return 0
}

我们使用-F选项安装完成功能complete

# Tell readline to quote appropriate and append slashes to directories;
# use the bash default completion for other arguments
complete -o filenames -o nospace -o bashdefault -F _comp_cd cd

既然我们希望Bash和Readline为我们处理一些其他细节,我们使用其他几个选项来告诉Bash和Readline要做什么。 -o filenames选项告诉Readline可能的完成应该被视为文件名,并被适当引用。 这个选项也会使Readline追加一个斜杠到它可以确定的目录的文件名(这就是为什么我们可能想要扩展_comp_cd来附加一个斜杠,如果我们使用通过CDPATH找到的目录:Readline不能告诉那些补全是目录)。 -o nospace选项告诉Readline不要将空格字符添加到目录名称中,以防我们要附加到它。 -o bashdefault选项引入了“Bash默认”补全的其余部分 - Bash添加到默认Readline集的可能补全。 这些包括命令名称补全,以{开头的单词的变量补全,包含路径名展开模式的补全(请参阅Filename Expansion)等等。

一旦使用complete安装,每当我们尝试补全cd命令的字符时,就会调用_comp_cd

还有更多的例子 - 大部分常见的GNU,Unix和Linux命令的完整集合 - 都是bash_completion项目的一部分。 这是在许多GNU/Linux发行版上默认安装的。 该项目最初由伊恩·麦克唐纳(Ian Macdonald)撰写,现在位于http://bash-completion.alioth.debian.org/ 有其他系统的端口,如Solaris和Mac OS X.

旧版本的bash_completion包在bash中分布在examples/complete子目录中。


下一页:,上一页:,上一节:Top [目录] [索引]

9 交互使用历史记录

本章从用户的角度描述了如何以交互方式使用GNU历史库。 这应该被视为用户指南。 有关在其他程序中使用GNU历史记录库的信息,请参阅GNU Readline库手册。


下一页: , 上一节: 交互使用历史命令记录   [目录][索引]

9.1 Bash历史命令设备

当启用set内建命令的-o history选项时(参见Set Builtin),shell可以访问命令历史,以前键入的命令列表。 HISTSIZE shell变量的值用作保存在历史列表中的命令的数量。 最后的$HISTSIZE命令的文本(缺省值500)被保存。 在参数和变量扩展之前,shell将每个命令存储在历史列表中,但是在执行历史扩展之后,受shell变量HISTIGNOREHISTCONTROL的值限制。

当shell启动时,历史记录将从HISTFILE变量​​(默认~/.bash_history)命名的文件初始化。 如果需要,由HISTFILE的值命名的文件将被截断,以包含不超过由HISTFILESIZE变量的值指定的行数。 当启用历史记录的shell退出时,最后一行$HISTSIZE行记录将从历史列表复制到由$HISTFILE命名的文件中。 如果设置了histappend shell选项(请参阅Bash Builtins),则会将这些行追加到历史记录文件中,否则将覆盖历史记录文件。 如果HISTFILE未设置,或者历史文件不可写入,则不保存历史记录。 保存历史记录后,历史文件将被截断为不超过$HISTFILESIZE行。 如果HISTFILESIZE未设置,或者设置为null,非数字值或小于零的数字值,则历史文件不会被截断。

如果设置了HISTTIMEFORMAT,则将与每个历史记录条目相关联的时间戳记信息写入历史文件,并用历史注释字符标记。 当读取历史文件时,以历史注释字符开头的行紧跟一个数字被解释为下一个历史记录的时间戳。

内建命令fc可用于列出或编辑并重新执行历史列表的一部分。 内置的history命令可用于显示或修改历史列表并操作历史文件。 使用命令行编辑时,每个编辑模式下都可以使用搜索命令来访问历史列表(请参阅历史命令)。

shell允许控制哪些命令保存在历史列表中。 可以设置HISTCONTROLHISTIGNORE变量来使shell仅保存输入命令的子集。 cmdhist shell选项(如果启用)会使shell尝试将多行命令的每一行保存在同一个历史记录条目中,并在必要时添加分号以保留语法正确性。 lithist shell选项会导致shell使用嵌入的换行符而不是分号保存该命令。 内置的shopt命令用于设置这些选项。 请参阅Bash Builtins,了解shopt的说明。


下一页: , 上一页: , 上一节: 交互使用历史记录   [目录][索引]

9.2 Bash历史内建命令

Bash提供了两个内置命令来操作历史列表和历史文件。

fc
fc [-e ename] [-lnr] [first] [last]
fc -s [pat=rep] [command]

第一种形式从历史列表中选择firstlast的一系列命令,并显示或编辑并重新执行它们。 可以将firstlast指定为一个字符串(以查找以该字符串开头的最近命令)或者作为一个数字(历史列表中的一个索引,负数用作当前命令号的偏移量)。 如果未指定last,则将其设置为first 如果没有指定first,则将其设置为上一个编辑命令,对于列表则设置为-16。 如果给出了-l标志,那么命令列在标准输出上。 列表中的-n标志禁止命令编号。 -r标志颠倒了列表的顺序。 否则,在包含这些命令的文件上调用由ename给出的编辑器。 如果未给出ename,则使用以下变量扩展的值:${FCEDIT:-${EDITOR:-vi}} 这表示如果设置了FCEDIT变量​​的值,或者设置EDITOR变量的值,否则vi被设置。 编辑完成后,编辑后的命令被回显并执行。

在第二种形式中,在所选命令中的每个pat实例被rep替换后,command被重新执行。 command的解释与上面的first相同。

fc命令一起使用的别名是r='fc -s',因此键入r cc将运行最后的命令以cc开头,然后输入“r”重新执行最后一个命令(参见Aliases)。

history
history [n]
history -c
history -d offset
history [-anrw] [filename]
history -ps arg

没有选项,用行号显示历史列表。 以'*'为前缀的行已被修改。 n选项的参数仅列出最后​​n行。 如果shell变量HISTTIMEFORMAT设置为非空值,则将其用作strftime的格式字符串,以显示与每个显示的历史记录条目关联的时间戳记。 格式化的时间戳和历史记录行之间不会打印中间的空白。

选项(如果提供)具有以下含义:

-c

清除历史列表。 这可以与其他选项结合来完全替换历史列表。

-d offset

删除offset位置的历史记录。 应该指定offset,因为它显示历史记录时显示。

-a

将新的历史记录行添加到历史记录文件中。 这些是自当前Bash会话开始以来输入的历史记录,但并未附加到历史记录文件中。

-n

将尚未从历史文件中读取的历史行添加到当前历史列表中。 这些是自当前Bash会话开始以来追加到历史文件的行。

-r

阅读历史文件并将其内容追加到历史记录列表中。

-w

把当前历史列表写出到历史文件中。

-p

arg上执行历史替换,并将结果显示在标准输出上,而不将结果存储在历史列表中。

-s

arg作为单个条目添加到历史记录列表的末尾。

当使用-w-r-a-n选项中的任何一个时,如果给定了filename,则将其作为历史文件。 如果没有给出,则使用HISTFILE变量​​的值。


上一页: , 上一节: Using History Interactively   [目录][索引]

9.3 历史记录扩展

历史记录库提供了一个与csh提供的历史扩展类似的历史扩展功能。 本节介绍用于处理历史记录的语法。

历史扩展将历史列表中的单词引入到输入流中,使得重复命令变得容易,将参数插入到当前输入行中,或者快速修复以前命令中的错误。

在完整的行被读取之后,在Shell将其分解为单词之前立即执行历史扩展。

历史扩张分两部分进行。 首先是确定替代时应使用历史列表中的哪一行。 第二个是选择那一行的部分加入到当前行中。 从历史记录中选择的行被称为event,该行的作用部分称为words 各种modifiers可用于操纵选定的单词。 这行被与Bash相同的方式进行分词,所以被引号包围的几个单词被认为是一个单词。 历史扩展是由历史扩展特征的出现引入的,即“!” 默认。 只有'\'和'可以用于转义历史扩展字符,但是历史扩展字符仍被视为被引用,如果其紧接在双引号的前面在一个双引号的字符串中。

可以使用内置的shopt命令的几个shell选项(请参阅Bash Builtins)来调整历史扩展的行为。 如果启用了histverify shell选项,并且正在使用Readline,则历史替换不会立即传递给shell解析器。 相反,展开后的行会重新加载到Readline编辑缓冲区中,以供进一步修改。 如果正在使用Readline,并且启用了histreedit shell选项,那么失败的历史扩展将重新加载到Readline编辑缓冲区中进行更正。 使用history内置命令的-p选项可用于查看历史扩展在使用之前将执行的操作。 history内建命令的-s选项可以用来将命令添加到历史记录列表的末尾,而不用实际执行它们,以便它们可用于随后的调用。 这与Readline一起使用是最有用的。

如上所述(参见Bash变量),shell允许使用histchars变量​​控制历史扩展机制使用的各种字符。 编写历史文件时,shell使用历史注释字符来标记历史时间戳。


下一页:,上一节:历史交互 [目录] [索引]

9.3.1 事件指示符

事件指示符是历史列表中对命令行条目的引用。 除非参考是绝对的,否则事件是相对于历史列表中的当前位置的。

!

开始一个历史替换,除了当后面跟一个空格,制表符,行结尾,‘=’ 或 ‘(’ (当extglobshell选项使用内置的shopt 启用)。

!n

请参阅命令行n

!-n

请参阅命令n行回转。

!!

参考前面的命令。 是‘!-1’的同义词。

!string

string开始的历史列表中的当前位置前面的最近命令。

!?string[?]

请参阅包含 string的历史列表中当前位置之前的最新命令。 尾随的'?如果string后面跟着一个换行符,则可以省略。

^string1^string2^

快速替换。 重复上一个命令,用string2替换string1 相当于 !!:s/string1/string2/.

!#

整个命令行输入到目前为止。


下一页: , 上一页: , 上一节: 历史记录交互   [目录][索引]

9.3.2 文字指示符

文字指示符用于从事件中选择所需的单词。 一个:将事件说明与词汇指示符分开。 如果单词标识符以‘^’, ‘$’, ‘*’, ‘-’, 或者‘%’开始,将被忽略。 单词从行首开始编号,第一个单词用0(零)表示。 单词被插入到由单个空格分隔的当前行中。

例如,

!!

指定前面的命令。 当你输入这个命令时,上面的命令会重复执行。

!!:$

指定前一个命令的最后一个参数。 可以简写为 !$.

!fi:2

指定以字母fi开头的最近命令的第二个参数。

文字指示符:

0 (zero)

0个单词. 对于许多应用程序来说,这是命令单词。

n

n个单词。

^

第一个参数;即单词1。

$

最后一个参数。

%

这个单词匹配与最近的“?string?”搜索。

x-y

一系列的单词;-y缩写为 ‘0-y’。

*

除了0之外的所有单词。 这是“1-$”的同义词。 如果事件中只有一个单词,则使用“*”并不是错误;在这种情况下返回空字符串。

x*

缩写'x-$'

x-

缩写'x-$',如'x*',但省略了最后一个单词。

如果在没有事件说明的情况下提供单词指示符,则使用先前的命令作为事件。


上一页:,上一节:历史交互 [目录] [索引]

9.3.3 修饰符

在可选的单词指定符之后,可以添加一个或多个以下修饰符的序列,每个修饰符前面都有一个“:”。

h

删除一个尾随路径名组件,只留下头部。

t

删除所有主要的路径名组件,留下尾巴。

r

删除形式为“.suffix”的尾随后缀,保留基本名称。

e

删除尾部后缀。

p

打印新的命令,但不要执行它。

q

引用替代的词,逃避进一步的替代。

x

用“q”引用替换的单词,但在空格,制表符和换行符中分解为单词。

s/old/new/

替换new作为事件行中第一个出现的old 任何分隔符都可以用来代替'/'。 分隔符可以在oldnew 中用单个反斜杠引用。 如果&出现在new中,则会被替换为old 一个反斜杠将引用“&”。 如果它是输入行中的最后一个字符,则最后的分隔符是可选的。

&

重复前面的替换。

g
a

使在整个事件行上应用更改。 s结合使用,如gs/old/new/,或与&

G

对事件中的每个单词应用以下“s”修饰符一次。


下一页:,上一页:,上一节:Top [目录] [索引]

10 安装Bash

本章提供了在各种支持的平台上安装Bash的基本说明。 该发行版支持几乎所有GNU 版本的GNU操作系统,以及一些非Unix系统,如BeOS和Interix。 其他独立的系统有MS-DOSOS/2和Windows平台。


下一页:,上一节:安装Bash [目录] [索引]

10.1 基本安装

这些是Bash的安装说明。

编译Bash最简单的方法是:

  1. cd到包含源代码的目录,然后输入'./configure'为你的系统配置Bash。 如果您在旧版本的System V上使用csh,则可能需要键入sh ./configure而不是csh尝试执行configure本身。

    运行configure需要一些时间。 在运行时,它会输出消息,告诉它正在检查哪些功能。

  2. 输入'make'来编译Bash并生成bashbug bug报告脚本。
  3. 或者,键入“make tests”来运行Bash测试套件。
  4. 输入“make install”来安装bashbashbug 这也将安装手册页和信息文件。

configure shell脚本尝试猜测编译期间使用的各种与系统相关的变量的正确值。 它使用这些值在包的每个目录中创建一个Makefile(根目录,builtinsdocsupport目录,lib下的每个目录以及其他几个目录)。 它还创建一个包含系统相关定义的config.h文件。 最后,它会创建一个名为config.status的shell脚本,您可以在将来运行该脚本来重新创建当前配置,保存其测试结果的文件config.cache以加速重新配置,以及包含编译器输出(主要用于调试configure)的文件config.log 如果在config.cache中包含不想保留的结果,则可以删除或编辑它。

要详细了解configure脚本的选项和参数不懂之处,请输入

bash-2.04$ ./configure --help

在Bash源代码目录下的Bash提示符下。

如果您需要编写Bash,请尝试了解configure如何检查是否执行这些操作,并将差异或指令邮寄到bash-maintainers@gnu.org ,由此他们可以考虑下一个版本。

文件configure.ac用于由Autoconf程序创建configure 如果您想使用较新版本的Autoconf来更改或重新生成configure,则只需要configure.ac 如果你这样做,确保你使用Autoconf版本为2.50或更新。

您可以通过输入“make clean”从源代码目录中删除程序二进制文件和目标文件。 要删除configure创建的文件(这样你就可以为另一种计算机编译Bash),输入'make distclean'。


下一页:,上一页:,上一节:安装Bash [目录] [索引]

10.2 编译器和选项

configure脚本不知道的,某些系统需要不寻常的编译或链接选项。 通过在环境变量中设置变量,可以给configure 初始值。 使用Bourne兼容的shell,你可以在命令行上这样做:

CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure

在具有env程序的系统上,可以这样做:

env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure

如果可用,配置过程使用GCC构建Bash。


下一页:,上一页:,上一节:安装Bash [目录] [索引]

10.3 编译多个体系结构

您可以同时编译多个计算机的Bash,方法是将每个体系结构的目标文件放在各自的目录中。 为此,您必须使用支持VPATH变量(如GNU make)的make版本。 cd到目标文件和可执行文件所在的目录,然后从源目录运行configure脚本。 您可能需要提供--srcdir=PATH参数来告诉configure源文件在哪里。 configure自动检查configure所在目录和在“..”目录中的源代码。

如果您必须使用不支持VPATH变量的make,则可以在源代码目录中一次编译一个体系结构的Bash。 为一个体系结构安装了Bash之后,在重新配置其他体系结构之前,请使用“make distclean”。

或者,如果您的系统支持符号链接,则可以使用support/mkclone脚本创建一个构建树,该树具有指向源目录中每个文件的符号链接。 下面是一个例子,在源目录/usr/gnu/src/bash-2.0中的当前目录中创建一个构建目录:

bash /usr/gnu/src/bash-2.0/support/mkclone -s /usr/gnu/src/bash-2.0 .

mkclone脚本需要Bash,因此您必须已经为至少一个体系结构构建了Bash,然后才能为其他体系结构创建构建目录。


下一页:,上一页:,上:安装Bash [目录 索引]

10.4 安装名称

默认情况下,“make install”会安装到/usr/local/bin/usr/local/man等。通过给configure选项--prefix=PATH,或者指定DESTDIRmake’一个值,在运行make install时,来替换默认的 /usr/local位置。

您可以为特定于体系结构的文件和独立于体系结构的文件指定单独的安装前缀。 如果你给 configure 选项--exec-prefix=PATH,那么make install将使用PATH作为安装程序和库的前缀。 文档和其他数据文件仍将使用常规前缀。


下一页:,上一页:,上一节:安装Bash [目录] [索引]

10.5 指定系统类型

可能有一些功能configure不能自动计算出来,但需要根据主机Bash的类型来确定运行。 通常configure可以计算出来,但是如果输出消息说不能猜测主机类型,就给它一个-host=TYPE选项。 'TYPE'可以是系统类型的短名称,比如'sun4',或者是带有3个字段的规范名称:'CPU-COMPANY-SYSTEM“(例如i386-unknown-freebsd4.2)。

请参阅文件support/config.sub了解每个字段的可能值。


下一页:,上一页:,上一节:安装Bash [目录] [索引]

10.6 共享默认值

如果要为要共享的configure脚本设置默认值,可以创建一个名为config.site的站点shell脚本,该脚本为 CCcache_fileprefix configure先查找PREFIX/share/config.site如果它存在的话,然后查找PREFIX/etc/config.site如果存在的话, 或者,您可以将CONFIG_SITE环境变量设置为站点脚本的位置。 警告:Bash configure查找一个站点脚本,但不是所有的configure脚本都可以。


下一页:,上一页:,上一节:安装Bash [目录] [索引]

10.7 操作控制

configure识别以下选项以控制其操作方式。

--cache-file=file

file中使用并保存测试结果,而不是./config.cache file设置为/dev/null以禁用缓存,以便调试configure

--help

打印configure选项的摘要,然后退出。

--quiet
--silent
-q

不要打印正在进行检查的信息。

--srcdir=dir

在目录dir中查找Bash源代码。 通常configure可以自动确定该目录。

--version

打印用于生成configure脚本的Autoconf版本,然后退出。

configure也可以接受其他一些不被广泛使用的样板选项。 configure --help’ 打印完整的列表.


上一页:,上一节:安装Bash [目录] [索引]

10.8 可选功能

Bash configure有一些--enable-feature选项,其中feature表示Bash的可选部分。 还有一些--with-package 选项,其中package类似于bash-mallocpurify 要关闭程序包的默认使用,请使用--without-package 要配置没有默认启用的功能的Bash,请使用--disable-feature

以下是Bash configure识别的--enable---with-选项的完整列表。

--with-afs

定义您是否使用Transarc的Andrew文件系统。

--with-bash-malloc

在目录lib/malloc中使用malloc 的Bash版本。 这与GNU libc中出现的malloc不同,但是旧一点的版本最初由4.2 BSD malloc 驱动。 这个malloc非常快,但是在每个分配上浪费了一些空间。 该选项默认启用。 NOTES文件包含应关闭的系统列表,configure为多个系统自动禁用此选项。

--with-curses

使用curses库而不是termcap库。 如果你的系统的termcap数据库不足或不完整,应该提供这个。

--with-gnu-malloc

--with-bash-malloc的统一词.

--with-installed-readline[=PREFIX]

将其定义为使用本地安装版本的Readline而不是lib/readline中的版本进行Bash链接。 这只适用于Readline 5.0和更高版本。 如果PREFIXyes或未提供,configure使用make 变量includedirlibdir的值,默认使用prefix子目录保存,寻找Readline的安装版本,如果在标准的系统中不存在include 和 library 目录。 如果PREFIXno,则Bash与lib/readline中的版本链接。 如果PREFIX设置为任何其他值,configure将其视为目录路径名,并在该目录的子目录中查找已安装的Readline版本(PREFIX/include目录中的include文件和PREFIX/lib中的library文件)。

--with-purify

将其定义为使用Rational软件的Purify内存分配检查器。

--enable-minimal-config

这产生了一个具有最小功能的shell,靠近历史的Bourneshell。

有几个--enable-选项可以改变Bash编译和链接的方式,而不是改变运行时功能。

--enable-largefile

如果操作系统需要特殊的编译器选项来构建可以访问大文件的程序,请启用对large files的支持。 如果操作系统提供大文件支持,则这是默认启用的。

--enable-profiling

这会生成一个Bash二进制文件,每次执行时都会生成由gprof处理的分析信息。

--enable-static-link

如果使用gcc,则会导致Bash静态链接。 这可以用来构建一个版本来作为root的shell使用。

'minimal-config'选项可用于禁用以下所有选项,但是它会首先处理,因此可以使用enable-feature

除'disabled-builtins','direxpand-default和'xpg-echo-default以外,所有以下选项均被启用,默认情况下,除非操作系统不提供必要的支持。

--enable-alias

允许别名扩展,并包含aliasunalias builtins(参见别名)。

--enable-arith-for-command

包含对for命令的替代形式的支持,该命令的行为与C语言for语句相同(请参阅Looping Constructs)。

--enable-array-variables

包括对一维数组shell变量的支持(请参阅Arrays)。

--enable-bang-history

包含对csh式历史替换的支持(请参阅历史记录交互)。

--enable-brace-expansion

包括csh式的大括号扩展(b{a,b}cbac bbc)。 请参阅Brace Expansion以获得完整的说明。

--enable-casemod-attributes

declare内置命令语句和赋值语句中包含对大小写修改属性的支持。 例如,带有大写uppercase属性的变量在赋值时将其值转换为大写。

--enable-casemod-expansion

包括支持修饰字扩展的情况。

--enable-command-timing

包括支持将time识别为保留字,并在time之后显示管道的时序统计信息(请参阅Pipelines)。 这允许管道以及shell内置函数和定时功能。

--enable-cond-command

包含对[[条件命令的支持)。 (请参阅条件构造)。

--enable-cond-regexp

[[条件命令中包含对使用=~二元运算符匹配POSIX正则表达式的支持。 (请参阅条件构造)。

--enable-coprocesses

包含对coprocesses和coproc保留字的支持(请参阅Pipelines)。

--enable-debugger

包含对bash调试器的支持(分开分发)。

--enable-direxpand-default

导致在shell启动时默认启用direxpand shell选项(请参阅The Shopt Builtin)。 通常默认情况下是禁用的。

--enable-directory-stack

包含对csh类目录堆栈和pushdpopddirs builtins的支持(请参阅目录栈)。

--enable-disabled-builtins

即使在使用enable -n xxx禁用了xxx之后,也允许通过“builtin xxx”调用内置命令。 有关builtinenable内建命令的详细信息,请参见Bash Builtins

--enable-dparen-arithmetic

包含对((…))命令的支持(请参阅条件构造)。

--enable-extended-glob

包括对Pattern Matching中描述的扩展模式匹配功能的支持。

--enable-extended-glob-default

The Shopt Builtinextglob shell选项的默认值设置为启用。

--enable-function-import

包括从环境中导入由另一个shell实例导出的函数定义的支持。 该选项默认启用。

--enable-glob-asciirange-default

The Shopt Builtin中的globasciiranges shell选项的默认值设置为启用。 这将控制在模式匹配括号表达式中使用的字符范围的行为。

--enable-help-builtin

包含help内置函数,该函数显示shell内置函数和变量的帮助(请参阅Bash Builtins)。

--enable-history

包含命令历史和fc历史内置命令(参见Bash历史设施)。

--enable-job-control

如果操作系统支持,则启用作业控制功能(请参阅作业控制)。

--enable-multibyte

如果操作系统提供了必要的支持,则可以支持多字节字符。

--enable-net-redirections

这使得能够特殊处理/dev/tcp/host/port/dev/udp/host/port在重定向中使用时(请参阅重定向)。

--enable-process-substitution

如果操作系统提供了必要的支持,这将启用进程替换(请参阅进程替代)。

--enable-progcomp

启用可编程补全设施(请参阅可编程补全)。 如果Readline没有启用,这个选项不起作用。

--enable-prompt-string-decoding

打开$PS1, $PS2, $PS3,和$PS4中一些反斜线转义字符的解释提示字符串。 请参阅控制提示,以获得提示字符串转义序列的完整列表。

--enable-readline

包括支持命令行编辑和历史与Readline库的Bash版本(参见命令行编辑)。

--enable-restricted

包含对受限shell的支持。 如果启用了这个功能,当Bash被称为rbash时,进入受限模式。 有关限制模式的说明,请参见受限Shell

--enable-select

包含select复合命令,它允许生成简单的菜单(请参阅条件构造)。

--enable-separate-helpfiles

使用外部文件作为help内置命令文件显示的文档,而不是在内部存储文本。

--enable-single-help-strings

将由help内置显示的文本存储为每个帮助主题的单个字符串。 这有助于将文本翻译成不同的语言。 如果编译器无法处理非常长的字符串文字,则可能需要禁用此功能。

--enable-strict-posix-default

默认情况下使Bash POSIX-conformant(见Bash POSIX Mode)。

--enable-usg-echo-default

--enable-xpg-echo-default的同义词.

--enable-xpg-echo-default

使内置的echo默认扩展反斜杠转义字符,而不需要-e选项。 这将xpg_echo shell选项的默认值设置为on,这使得Bash echo 的行为更像“Single Unix Specification ,版本3。 有关echo识别的转义序列的描述,请参阅Bash Builtins

文件config-top.h包含C预处理程序'#define'语句,用于从configure不可设置的选项。 其中一些并不意味着要改变;如果你这样做,小心后果。 阅读与每个定义相关的注释以获取更多关于其效果的信息。


下一页:,上一页:,上一节:Top [目录][索引]

附录A 错误反馈

请报告您在Bash中找到的所有错误。 但首先,你应该确保它确实是一个错误,并且它出现在最新版本的Bash中。 Bash的最新版本总是可用,从ftp://ftp.gnu.org/pub/gnu/bash/获取。

一旦确定了实际存在的错误,使用bashbug命令提交错误报告。 如果你有一个修补程序,你也被鼓励邮件,以及! 建议和“哲学”错误报告可能会邮寄到bug-bash@gnu.org或发布到Usenet新闻组gnu.bash.bug

所有错误报告应该包括:

bashbug将前三个项目自动插入到提供错误报告的模板中。

请将所有有关本手册的报告发送至bug-bash@gnu.org


下一页:,上一页:,上一节:Top [目录][索引]

附录B 与Bourne Shell的主要区别

Bash实现与Bourne Shell基本相同的语法,参数和变量扩展,重定向和引用。 Bash使用POSIX标准作为如何实现这些功能的规范。 传统的Bourne shell和Bash有一些区别,这部分很快就详细说明了意义的差异。 前面几节将对这些差异进行更深入的解释。 本节使用SVR4.2(历史Bourne shell的最新版本)中包含的sh版本作为基准参考。

More features unique to Bash may be found in Bash Features.

B.1实现与SVR4.2 Shell的区别

由于Bash是一个全新的实现,它并没有受到SVR4.2 shell的许多限制。 例如:


下一页:,上一页:,上一节:Top [目录][索引]

附录C GNU自由文档许可证

版本1.3,2008年11月3日
Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
http://fsf.org/

Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
  1. 前言

    The purpose of this License is to make a manual, textbook, or other functional and useful document free in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. 其次,本许可证为作者和出版商保留了获得工作信誉的方式,而不被认为是由他人修改的责任。

    本许可证是一种“copyleft”,这意味着文档的衍生作品必须在同一意义上是自由的。 它补充了GNU通用公共许可证,这是一个为自由软件设计的copyleft许可证。

    我们设计了这个许可证,以便将其用于免费软件的手册,因为免费软件需要免费的文档:免费的程序应该附带提供与软件相同的自由的手册。 但是,本许可不限于软件手册;它可以用于任何文本工作,不管主题或是否作为印刷书出版。 我们建议本许可证主要用于指导或参考的作品。

  2. 适用性和定义

    本许可证适用于任何手册或其他任何媒体上的作品,其中包含版权所有者声明可以根据本许可证的条款分发的通知。 该通知授予世界范围的免版税许可证,持续时间无限制,可在此处所述条件下使用该作品。 下面的“文件”是指任何这样的手册或工作。 任何公众都是被许可人,被称为“你”。 如果您以需要版权法许可的方式复制,修改或分发作品,则您接受许可。

    文件的“修改版本”是指包含文件或其一部分的任何工作,不论是逐字复制还是修改和/或翻译成另一种语言。

    “次要部分”是文件的命名附录或前端部分,专门处理文件的出版者或作者与文件的整体主题(或相关事项)的关系,并且不包含任何可能直接掉落在整个主题内。 (因此,如果文件部分是数学教科书,则次要部分可能不解释任何数学。) 这种关系可能是与主体或相关事务有关的历史联系,也可能是与其有关的法律,商业,哲学,伦理或政治立场。

    “不变部分”是在标题被指定的某些次要部分,作为不变部分的那些部分,在通知中表示文档是根据本许可证发布的。 如果一个部分不符合上述定义,则不允许指定为不变。 该文档可能包含零不变章节。 如果文档没有标识任何不变章节,那么没有。

    “封面文本”是指在本许可证下发布文档的通知中列出的某些短文本的封面文本或封底文本。 封面文本最多5个单词,封底文本最多25个单词。

    文档的“透明”副本是指机器可读的副本,以规范可供公众获取的格式表示,适合用通用文本编辑器或(对于由像素组成的图像)​​通用绘图直接修改文档程序或(用于绘图)一些广泛可用的绘图编辑器,并且适用于输入到文本格式器或自动翻译成适合于输入到文本格式器的各种格式。 以其他透明文件格式制作的复制品,其标记或缺少标记,已被安排阻止或阻止读者随后的修改,这是不透明的。 如果用于任何大量的文本,则图像格式不是透明的。 不是“透明”的副本被称为“不透明”。

    Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only.

    “标题页面”是指印刷书籍的标题页面本身,以及随后需要的页面,以便清楚地显示本许可证要求在标题页面上显示的材料。 对于没有任何标题页的格式的作品,“标题页”是指文本正文开始前的作品标题最显着的文字。

    “出版者”是指向公众发放该文件副本的任何个人或实体。

    “命名为XYZ”部分表示文档的命名子单元,其标题或者精确地为XYZ,或者包含XYZ,后面的文字用另一种语言翻译XYZ。 (这里的XYZ表示下面提到的特定部分名称,如“致谢”,“奉献”,“认可”或“历史”)。 在修改文档时,“保留标题”意味着根据此定义,它仍然是“标题为XYZ”的部分。

    该文档可能包括声明旁边的保修免责声明,声明本许可证适用于该文档。 这些保修免责声明被认为是包含在本许可证中的参考,但仅限于免责保证:这些保修免责声明可能具有的任何其他含义是无效的,并且不影响本许可证的含义。

  3. VERBATIM复制

    只要本许可证,版权声明以及本许可证适用于本文档的许可声明在所有副本中复制,并且您不添加任何其他条件,您可以以任何方式复制和分发本文档,无论是商业还是非商业版本。到这个许可证的那些。 您不得使用技术手段阻挡或控制您制作或发行的副本的阅读或进一步复制。 但是,您可以接受报酬以换取复印件。 如果您分发的副本数量足够多,则还必须遵守第3节中的条件。

    您也可以在上述相同条件下出借副本,并可以公开显示副本。

  4. 以数量复制

    如果您出版的文件的印刷副本(或通常有印刷封面的媒体中的副本),编号超过100,并且文件的许可证通知要求封面文本,则必须将这些副本盖在清晰明了地包含所有这些封面文本:封面上的封面文本和封底上的封底文本。 这两个封面也必须清楚明确地标识你作为这些副本的出版者。 封面必须提供完整的标题,标题的所有单词同样突出和可见。 此外,您还可以在封面上添加其他材料。 复制仅限于封面的更改,只要保留文档的标题并满足这些条件,就可以在其他方面作为逐字复制处理。

    如果任何一个封面所需的文字太多,以致不能容易地阅读,你应该把第一封的封面合理地放在实际的封面上,并将其余的放在相邻的页面上。

    如果您发布或分发的文档编号超过100的不透明副本,则必须包含机器可读透明副本以及每个不透明副本,或者在每个不透明副本中或每个不透明副本中陈述一个计算机网络位置,使用公众可以使用公共标准网络协议下载文档的完整透明副本,无需添加材料。 如果您使用后一种选项,则在开始分发不透明拷贝时,您必须采取合理谨慎的步骤,以确保此透明拷贝在指定位置保持可访问状态,直到最后一次分发后的至少一年该版本的不透明副本(直接或通过您的代理商或零售商)向公众发布。

    在重新分发任何大量副本之前,要求(但不是必需的)您联系文档的作者,让他们有机会为您提供文档的更新版本。

  5. MODIFICATIONS

    您可以在上述第2节和第3节的条件下复制和分发本文档的修改版本,前提是您在本许可证下正确发布修改版本,修改版本填写文档的角色,修改版本给谁拥有它的副本。 另外,你必须在修改版本中做这些事情:

    1. 在标题页(和封面,如果有的话)中使用与文档标题不同的标题,以及以前版本(如果有的话,应在文档的历史部分中列出)。 如果该版本的原始发布者给予许可,则可以使用与以前版本相同的标题。
    2. 在标题页上作为作者列出在修改版本中负责修改作者的一个或多个个人或实体,以及文档的至少五个主要作者(所有主要作者,如果它少于五),除非他们释放你这个要求。
    3. 在“标题”页面上显示修改版本的发布者的名称,作为发布者。
    4. 保留文档的所有版权声明。
    5. 在其他版权声明附近添加适当的版权声明以进行修改。
    6. 在版权声明之后立即包含许可证通知,允许公众按照本许可证的条款使用修改后的版本,格式如下面的附录所示。
    7. 在许可证通知中保留不变章节的完整列表,并在文档的许可证通知中提供所需的封面文本。
    8. 包括本许可证的未经更改的副本。
    9. 保留标题为“历史”的章节,保留其标题,并在标题页上添加至少标题,年份,新作者和修改版本的发布者的项目。 如果文档中没有标题为“历史”的部分,则创建一个标题,年份,作者和出版商,在其标题页上给出该文档,然后添加描述前一句中所述修改版本的项目。
    10. 保留文档中给出的网络位置(如果有的话)以公开访问文档的透明副本,以及文档中针对之前版本所给出的网络位置。 这些可能被放置在“历史”部分。 您可以省略在文档本身至少四年前发布的作品的网络位置,或者它所引用的版本的原始发布者提供了许可。
    11. 对于标题为“致谢”或“奉献”的章节,保留章节的标题,并在章节中保留每个贡献者的确认和/或奉献的所有内容和语气。
    12. 保留文档中的所有不变部分,文字和标题保持不变。 部分编号或等同编号不被视为部分标题的一部分。
    13. 删除标题为“认可”的任何部分。 修改后的版本中可能不包含这样的部分。
    14. 不要将任何现有部分重新命名为“背书”或与任何不变部分发生冲突。
    15. 保留任何免责声明。

    如果修改后的版本包含新的前端部分或附录,这些部分或附录有资格作为次要部分,且不包含从文档复制的材料,您可以选择将这些部分中的一部分或全部指定为不变。 为此,请将其标题添加到修改版本的许可声明中的不变章节列表中。 这些标题必须与其他栏目标题不同。

    您可以添加一个标题为“认可”的部分,前提是它仅包含各方对您的修改版本的认可,例如同行评议声明或文本已被组织批准为权威标准定义。

    您可以在修改版本的封面文本列表末尾添加最多五个单词的封面作为封面文本,以及最多25个单词作为封底文本。 前封面文本和后封面文本之一只能通过任何一个实体添加(或通过安排)。 如果文件已经包含了同一个封面的封面文本,这个封面文本是由您先前添加的,或者是由您代表的同一个实体所做的安排添加的,则您不得添加另一个;但是您可以在旧版发行商的明确许可的情况下更换旧版发行版。

    文件的作者和出版者不得通过本许可使用他们的名字进行宣传,或者断言或暗示认可任何修改版本。

  6. 合并文件

    您可以将本文档与根据本许可证发布的其他文档相结合,根据上述第4节中定义的修改版本的条款,只要您将所有原始文档的所有不变部分包括在组合中,并且将其全部列出作为您的许可声明中的组合工作的不可变部分,并保留其所有免责声明。

    合并后的工作只需要包含一份本许可证,多个相同的不变章节可以替换为一份。 如果有多个名称相同但内容不同的不变部分,则通过在该部分的末尾添加该部分的标题,在括号中添加该部分的原始作者或出版者的名称(如果已知),或者唯一的号码。 对组合作品的许可声明中不变部分列表中的部分标题进行相同的调整。

    在这个组合中,你必须在各种原始文件中组合任何标题为“历史”的部分,形成一个标题为“历史”的部分;同样可以将名为“致谢”的任何部分和名为“奉献”的任何部分结合起来。 您必须删除标题为“认可”的所有部分。

  7. 文件的收集

    您可以制作一个由本许可证下发布的文档和其他文档组成的集合,并且在您遵循本许可证的规则的前提下,将本许可证的各个副本替换为集合中包含的单个副本。在所有其他方面逐字复制每份文件。

    您可以从这样的集合中提取单个文档,并在本许可证下单独分发,只要您将本许可证的副本插入提取的文档中,并在所有其他方面关于逐字复制该文档的内容遵循本许可证。

  8. 与独立作品聚集

    如果汇编所产生的版权不被用于限制合法权利,那么将文档或其衍生作品与其他单独和独立的文档或作品汇编在一个存储或分发介质中或其上,称为“汇总”编辑的用户超出了个人工作许可的范围。 当文档被包含在一个聚合中时,本许可不适用于本身不属于本文档衍生作品的其他作品。

    如果第3节的封面文字要求适用于这些文档的副本,那么如果文档少于整个总数的一半,则文档的封面文本可以放在封闭文档的封面上,或者如果文件是电子形式,则电子等同于封面。 否则,他们必须出现在支撑整个骨料的印刷封面上。

  9. 翻译

    翻译被认为是一种修改,所以您可以根据第4节的条款分发文档的翻译。 使用翻译替换不变部分需要版权所有者的特别许可,但是除了这些不变部分的原始版本之外,您还可以包含部分或全部不变部分的翻译。 如果您还包括本许可证的原始英文版本以及这些声明和免责声明的原始版本,您可以包括本许可证的翻译和文档中的所有许可证声明以及任何免责声明。 如果翻译与本许可的原始版本或通知或声明不一致,则以原始版本为准。

    如果文件中的章节标题为“鸣谢”,“奉献”或“历史”,则保留其标题(第1节)的要求(第4节)通常需要更改实际标题。

  10. 终止

    您不得复制,修改,再许可或分发本文档,除非本许可证明确规定。 任何以其他方式复制,修改,再许可或分发的企图都是无效的,并将自动终止您在本许可下的权利。

    但是,如果您终止所有违反本许可证的行为,则(a)暂时恢复您的特定版权所有者的许可证,除非版权所有者明确并最终终止您的许可证,并且(b)如果版权所有者在停止后60天之前通过一些合理的方式通知您违规行为。

    此外,如果版权所有者通过某种合理的方式通知您这一侵权行为,您的特许版权所有者的许可将永久恢复,这是您第一次收到来自该版权所有者的违反本许可(任何作品)的通知,而且您在收到通知之后的30天之前就会解决违规问题。

    根据本部分终止您的权利不会终止根据本许可证收到您的副本或权利的当事人的许可。 如果您的权利已被终止,而不是永久恢复,则收到一些或全部相同材料的副本不会赋予您使用该权利的任何权利。

  11. 本许可证的未来修订

    自由软件基金会可能不时地发布GNU自由文档许可证的新的修订版本。 这样的新版本在精神上与现在的版本相似,但可能会有不同的细节,以解决新的问题或疑虑。 参见http://www.gnu.org/copyleft/

    每个版本的许可证都有一个明显的版本号。 如果文档指定本许可证的特定编号版本适用于本许可证,则可以选择遵守指定版本或已发布的任何更新版本的条款和条件(而不是草案)由自由软件基金会。 如果文档未指定本许可证的版本号,则可以选择自由软件基金会发布的任何版本(不作为草稿)。 如果文档指定代理可以决定使用哪个版本的本许可证,那么代理人公开声明接受版本将永久授权您选择该文档的版本。

  12. 重新授权

    “大规模多作者合作网站”(或“MMC网站”)是指任何发行版权作品的万维网服务器,也为任何人编辑这些作品提供了显着的设施。 任何人都可以编辑的公共维基是这种服务器的一个例子。 网站中包含的“Massive Multiauthor Collaboration”(或“MMC”)是指在MMC网站上发布的任何着作权作品。

    “CC-BY-SA”是指Creative Commons Corporation(一家非营利性公司,在加利福尼亚州旧金山的主要营业场所)出版的知识共享署名 - 相同方式3.0许可协议,以及未来版权的由同一组织发布的许可证。

    “合并”是指将文件的全部或部分发布或重新发布为另一文件的一部分。

    (1)如果MMC根据本许可证获得许可,并且如果首次根据本许可证在本许可证以外的其他地方首次发布并随后全部或部分地并入MMC中,则“符合重新许可”封面文本或不变部分,(2)于2008年11月1日前合并。

    MMC网站的运营商可以在2009年8月1日之前的任何时间,在同一网站的CC-BY-SA下重新发布该网站中包含的MMC,前提是MMC有资格进行重新授权。

附录:如何使用本许可证文件

要在您所写的文档中使用本许可证,请在文档中包含许可证的副本,并在标题页后面放置以下版权和许可证声明:

  Copyright (C)  year  your name.
  Permission is granted to copy, distribute and/or modify this document
  under the terms of the GNU Free Documentation License, Version 1.3
  or any later version published by the Free Software Foundation;
  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
  Texts.  A copy of the license is included in the section entitled ``GNU
  Free Documentation License''.

如果您有不可变部分,封面文本和封底文本,请将“with ... Texts。”行替换为:

    with the Invariant Sections being list their titles, with
    the Front-Cover Texts being list, and with the Back-Cover Texts
    being list.

如果您有不带封面文字的不变章节,或者三者的其他组合,则合并这两个替代方案以适应情况。

如果您的文档包含程序代码的不平凡的例子,我们建议在您选择的免费软件许可证(如GNU通用公共许可证)下并行发布这些示例,以允许其在免费软件中使用。


上一页:,上一节:Top [目录][索引]

附录D 索引


下一页:,上一节:索引 [目录] [索引]

D.1 Shell内建命令的索引

跳转到:   .   :   [  
A   B   C   D   E   F   G   H   J   K   L   M   P   R   S   T   U   W  
索引输入  部分

.
.: Bourne Shell Builtins

:
:: Bourne Shell Builtins

[
[ Bourne Shell Builtins

A
alias Bash Builtins

B
bg 作业控制内置命令
bind Bash Builtins
break Bourne Shell Builtins
builtin Bash Builtins

C
caller Bash Builtins
cd Bourne Shell Builtins
command Bash Builtins
compgen 可编程补全内置命令
complete 可编程补全内置命令
compopt 可编程补全内置命令
continue Bourne Shell Builtins

D
declare Bash Builtins
dirs 目录堆栈Builtins
disown 作业控制内置命令

E
echo Bash Builtins
enable Bash Builtins
eval Bourne Shell Builtins
exec Bourne Shell Builtins
exit Bourne Shell Builtins
export Bourne Shell Builtins

F
fc Bash History Builtins
fg Job Control Builtins

G
getopts Bourne Shell Builtins

H
hash Bourne Shell Builtins
help Bash Builtins
history Bash History Builtins

J
jobs Job Control Builtins

K
kill Job Control Builtins

L
let Bash Builtins
local Bash Builtins
logout Bash Builtins

M
mapfile Bash Builtins

P
popd 目录堆栈Builtins
printf Bash Builtins
pushd 目录堆栈Builtins
pwd Bourne Shell Builtins

R
read Bash Builtins
readarray Bash Builtins
readonly Bourne Shell Builtins
return Bourne Shell Builtins

S
set Set Builtin
shift Bourne Shell Builtins
shopt Shopt Builtin
source Bash Builtins
suspend Job Control Builtins

T
test Bourne Shell Builtins
times Bourne Shell Builtins
trap Bourne Shell Builtins
type Bash Builtins
typeset Bash Builtins

U
ulimit Bash Builtins
umask Bourne Shell Builtins
unalias Bash Builtins
unset Bourne Shell Builtins

W
wait Job Control Builtins

跳转到:   .   :   [  
A   B   C   D   E   F   G   H   J   K   L   M   P   R   S   T   U   W  

下一页:,上一页:,上一节:索引 [目录][索引]

D.2 shell保留字的索引

跳到:   !   [   ]   {   }  
C   D   E   F   I   S   T   U   W  
索引输入  部分

!
!: 管道

[
[[ 条件结构

]
]]