Bash 翻译
Bash参考手册
目录
- 1简介
- 2定义
- 3基本外壳功能
- 4 Shell Builtin命令
- 5壳变量
- 6 Bash功能
- 7工作控制
- 8命令行编辑
- 9交互式使用历史记录
- 10安装Bash
- 附录A报告错误
- 附录B与Bourne Shell的主要区别
- 附录C GNU自由文档许可证
- 附录D索引
Bash功能
本文简要介绍了Bash shell(版本4。4,2016年9月7日)中提供的功能。Bash主页是http://www.gnu.org/software/bash/。
这是4.4版本,最近更新2016年9月7日,中的GNU Bash的参考手册,为Bash
4.4版本。
Bash包含出现在其他流行shell中的功能,以及一些仅出现在Bash中的功能。Bash借用概念的一些shell是Bourne Shell(SH),Korn Shell(KSH)和C壳(CSH 及其继承人, tcsh的)。以下菜单将功能分解为类别,注意哪些功能受其他shell启发,哪些功能特定于Bash。
本手册简要介绍了Bash中的功能。Bash手册页应该用作shell行为的权威参考。
• 简介: | shell的介绍。 | |
• 定义: | 本手册其余部分使用了一些定义。 | |
• 基本外壳功能: | 外壳“积木”。 | |
• Shell Builtin命令: | 作为shell一部分的命令。 | |
• 壳变量: | Bash使用或设置的变量。 | |
• Bash功能: | 仅在Bash中找到的功能。 | |
• 工作控制: | 什么工作控制以及Bash如何允许您使用它。 | |
• 命令行编辑: | 描述命令行编辑功能的章节。 | |
• 交互式使用历史记录: | 命令历史扩展 | |
• 安装Bash: | 如何在您的系统上构建和安装Bash。 | |
• 报告错误: | 如何在Bash中报告错误。 | |
• 与Bourne Shell的主要区别: | 简要列出Bash与/ bin / sh历史版本之间的差异。 | |
• GNU自由文档许可证: | 复制和共享此文档。 | |
• 指数: | 本手册的各种索引。 |
1简介
• 什么是Bash?: | Bash的简短描述。 | |
• 什么是外壳?: | 贝壳简介。 |
1.1什么是Bash?
Bash是GNU操作系统的shell或命令语言解释器。这个名字是''的首字母缩写Bourne-Again SHell',这是当前Unix shell直接祖先的作者斯蒂芬伯恩的双关语sh
,它出现在第七版贝尔实验室研究版的Unix中。
Bash在很大程度上与sh
Korn shell ksh
和C shell 兼容并集成了有用的功能csh
。它旨在成为IEEE POSIX 规范(IEEE标准1003.1)的IEEE POSIX Shell和Tools部分的一致实现。它为交互式和编程使用提供了功能改进。 sh
虽然GNU操作系统提供了其他shell,包括一个版本csh
,但Bash是默认的shell。像其他GNU软件一样,Bash非常便携。它目前几乎运行在每个Unix版本和一些其他操作系统上 - 为MS-DOS,OS / 2和Windows平台提供独立支持的端口。
1.2什么是shell?
在它的基础上,shell只是一个执行命令的宏处理器。术语宏处理器意味着扩展文本和符号以创建更大表达式的功能。
Unix shell既是命令解释器又是编程语言。作为命令解释器,shell为丰富的GNU实用程序提供了用户界面。编程语言功能允许组合这些实用程序。可以创建包含命令的文件,并自己成为命令。这些新命令与目录中的系统命令具有相同的状态,例如/箱,允许用户或组建立自定义环境以自动执行其常见任务。
壳可以以交互方式或非交互方式使用。在交互模式下,它们接受键盘输入的输入。当以非交互方式执行时,shell执行从文件读取的命令。
shell允许同步和异步执行GNU命令。shell在接受更多输入之前等待同步命令完成; 异步命令在读取和执行其他命令时继续与shell并行执行。所述重定向构建体允许这些命令的输入和输出的精细控制。而且,shell允许控制命令环境的内容。
Shell还提供一小组内置命令(内置命令),实现不可能或不方便通过单独的实用程序获取的功能。例如cd
,break
,continue
,和 exec
不能在外壳的外面实现,因为它们直接操纵shell本身。的history
,getopts
,kill
,或pwd
内建命令,除其他外,可以在单独的事业中实现,但他们使用的内置命令更方便。所有shell内置函数都将在后续章节中介绍。
虽然执行命令是必不可少的,但shell的大部分功能(和复杂性)都归功于它们的嵌入式编程语言。与任何高级语言一样,shell提供变量,流控制构造,引用和函数。
Shell提供专门用于交互式使用的功能,而不是增强编程语言。这些交互式功能包括作业控制,命令行编辑,命令历史记录和别名。本手册中介绍了这些功能中的每一项。
2定义
这些定义在本手册的其余部分中使用。
POSIX
-
一系列基于Unix的开放系统标准。Bash主要关注POSIX 1003.1标准的Shell和Utilities部分 。
blank
-
空格或制表符。
builtin
-
由shell本身在内部实现的命令,而不是由文件系统中某处的可执行程序实现的命令。
control operator
-
token
执行控制功能的A. 它是newline
以下之一:'||','&&','&',';',';;',';&',';;&','|','|&','(', 要么 ')”。 exit status
-
命令返回给调用者的值。该值限制为8位,因此最大值为255。
field
-
一个文本单元,它是一个shell扩展的结果。扩展后,执行命令时,结果字段将用作命令名称和参数。
filename
-
用于标识文件的字符串。
job
-
一组进程,包括一个管道,以及来自它的任何进程,它们都在同一个进程组中。
job control
-
用户可以选择性地停止(暂停)和重新启动(恢复)进程执行的机制。
metacharacter
-
一个字符,当不加引号时,分隔单词。元字符是一个
space
,tab
,newline
,或以下字符中的一个:“|','&',';','(',')','<', 要么 '>”。 name
-
A
word
仅由字母,数字和下划线组成,以字母或下划线开头。Name
s用作shell变量和函数名称。也称为identifier
。 operator
-
A
control operator
或aredirection operator
。有关重定向运算符的列表,请参阅重定向。运算符包含至少一个未引用的metacharacter
。 process group
-
每个具有相同进程组ID的相关进程的集合。
process group ID
-
process group
在其生命周期内表示a的唯一标识符。 reserved word
-
一个
word
对shell有特殊意义的东西。大多数保留字引入shell流控制结构,例如for
和while
。 return status
-
的同义词
exit status
。 signal
-
一种机制,通过该机制,内核可以通知系统中发生的事件。
special builtin
-
一个shell内置命令,已被POSIX标准分类为特殊命令 。
token
-
shell的一系列字符被认为是一个单元。它是一个
word
或一个operator
。 word
-
由shell处理为一个单元的字符序列。单词可能不包括未引用的
metacharacters
。
下一页:Shell Builtin命令,上一页:定义,上一页:顶部 [ 目录 ] [ 索引 ]
3基本外壳功能
Bash是'的首字母缩写'Bourne-Again SHell”。Bourne shell是最初由Stephen Bourne编写的传统Unix shell。所有Bourne shell内置命令都在Bash中可用,评估和引用的规则取自 “标准”Unix shell 的POSIX规范。
本章简要总结了shell的“构建块”:命令,控制结构,shell函数,shell 参数,shell扩展, 重定向,这是一种指向命名文件的输入和输出的方式,以及shell如何执行命令。
• Shell语法: | 你的输入对shell意味着什么。 | |
• Shell命令: | 您可以使用的命令类型。 | |
• 壳牌功能: | 按名称分组命令。 | |
• 外壳参数: | shell如何存储值。 | |
• 壳牌扩张: | Bash如何扩展参数和可用的各种扩展。 | |
• 重定向: | 一种控制输入和输出的方法。 | |
• 执行命令: | 运行命令时会发生什么。 | |
• Shell脚本: | 执行shell命令的文件。 |
3.1 Shell语法
• 壳牌操作: | shell的基本操作。 | |
• 报价: | 如何从字符中删除特殊含义。 | |
• 评论: | 如何指定评论。 |
当shell读取输入时,它将继续执行一系列操作。如果输入指示注释的开头,则shell忽略注释符号('#'),以及该行的其余部分。
否则,粗略地说,shell读取其输入并将输入分为单词和运算符,使用引用规则来选择分配各种单词和字符的含义。
然后shell将这些标记解析为命令和其他结构,删除某些单词或字符的特殊含义,扩展其他单词,根据需要重定向输入和输出,执行指定的命令,等待命令的退出状态,并使该退出状态可用进一步检查或处理。
3.1.1外壳操作
以下是shell在读取和执行命令时的操作的简要说明。基本上,shell执行以下操作:
- 从文件中读取其输入(请参阅Shell Scripts),从作为参数提供的字符串中读取-C调用选项(请参阅调用Bash),或从用户的终端。
- 打破输入字和操作符,服从中描述的引用规则引用。这些令牌被分开
metacharacters
。别名扩展由此步骤执行(请参阅别名)。 - 将标记解析为简单和复合命令(请参阅Shell命令)。
- 执行各种shell扩展(请参阅Shell扩展),将扩展的标记分解为文件名列表(请参阅文件名扩展)以及命令和参数。
- 执行任何必要的重定向(请参阅重定向)并从参数列表中删除重定向运算符及其操作数。
- 执行命令(请参阅执行命令)。
- (可选)等待命令完成并收集其退出状态(请参阅退出状态)。
Next:Comments,Previous:Shell Operation,Up:Shell语法 [ 目录 ] [ 索引 ]
3.1.2报价
• 逃脱角色: | 如何从单个字符中删除特殊含义。 | |
• 单引号: | 如何抑制一系列字符的所有解释。 | |
• 双引号: | 如何抑制大部分字符序列的解释。 | |
• ANSI-C引用: | 如何在带引号的字符串中扩展ANSI-C序列。 | |
• 区域设置翻译: | 如何将字符串翻译成不同的语言。 |
引用用于删除shell中某些字符或单词的特殊含义。引用可用于禁用特殊字符的特殊处理,以防止保留字被识别,并防止参数扩展。
每个shell元字符(请参阅定义)对shell具有特殊含义,如果要表示自身,则必须引用它们。使用命令历史记录扩展功能时(请参阅历史记录交互), 历史记录扩展字符,通常是!',必须引用以防止历史扩张。有关历史记录扩展的详细信息,请参阅Bash历史记录工具。
有三种引用机制: 转义字符,单引号和双引号。
3.1.2.1逃逸角色
一个没有引用的反斜杠'\'是Bash逃脱角色。除了newline
。之外,它保留了下一个字符的字面值。如果\newline
出现一对,并且没有引用反斜杠本身,则将\newline
其视为行继续(即,它将从输入流中删除并被有效忽略)。
3.1.2.2单引号
用单引号括起字符('“')保留引号内每个字符的字面值。单引号之间可能不会出现单引号,即使前面有反斜杠也是如此。
3.1.2.3双引号
用双引号括起字符('“')保留引号内所有字符的字面值,但'$','`','\',以及,当启用历史扩展时,'!”。当shell处于 POSIX模式时(参见Bash POSIX模式),'!'即使启用历史记录扩展,双引号内也没有特殊含义。那些角色 '$'和'`'在双引号中保留它们的特殊含义(参见Shell Expansions)。只有在跟随以下字符之一时,反斜杠才会保留其特殊含义:'$','`','“','\'或者newline
。在双引号内,将删除后跟其中一个字符的反斜杠。没有特殊含义的字符前面的反斜杠保持不变。双引号可以在双引号内引用,前面加一个反斜杠。如果启用,将执行历史记录扩展,除非'!'出现在双引号中使用反斜杠进行转义。'前面的反斜杠'!'没有删除。
特殊参数'*'和'@'在双引号中有特殊含义(参见Shell参数扩展)。
3.1.2.4 ANSI-C引用
表格的字是特别对待的。单词扩展为字符串,替换为ANSI C标准指定的反斜杠转义字符。反斜杠转义序列(如果存在)按如下方式解码: $'string'
\a
-
警报(铃)
\b
-
退格
\e
\E
-
转义字符(不是ANSI C)
\f
-
形式饲料
\n
-
新队
\r
-
回车
\t
-
水平标签
\v
-
垂直标签
\\
-
反斜线
\'
-
单引号
\"
-
双引号
\?
-
问号
\nnn
-
八位字符,其值为八进制值nnn (一到三位数)
\xHH
-
八位字符,其值为十六进制值HH (一个或两个十六进制数字)
\uHHHH
-
Unicode(ISO / IEC 10646)字符,其值为十六进制值 HHHH(一到四个十六进制数字)
\UHHHHHHHH
-
Unicode(ISO / IEC 10646)字符,其值为十六进制值 HHHHHHHH(一到八个十六进制数字)
\cx
-
一个控制X字符
扩展结果是单引号,好像美元符号不存在一样。
3.1.2.5特定于语言环境的翻译
双引号字符串前面有一个美元符号('$')将导致根据当前语言环境翻译字符串。如果当前区域设置为C
或POSIX
,则忽略美元符号。如果翻译并替换字符串,则替换为双引号。
某些系统使用LC_MESSAGES
shell变量选择的消息目录。其他人从TEXTDOMAIN
shell变量的值创建消息目录的名称,可能添加后缀'的.mo”。如果使用该TEXTDOMAIN
变量,则可能需要将TEXTDOMAINDIR
变量设置为消息目录文件的位置。还有一些人以这种方式使用这两个变量:TEXTDOMAINDIR
/ LC_MESSAGES
/ LC_MESSAGES / TEXTDOMAIN
.mo。
3.1.3评论
在非交互式shell或 启用interactive_comments
了shopt
内置选项的交互式shell中 (请参阅The Shopt Builtin),以''开头的单词#'导致该字和该行上的所有剩余字符被忽略。未interactive_comments
启用选项的交互式shell 不允许注释。interactive_comments
默认情况下,该选项在交互式shell中处于启用状 有关使shell交互的原因的说明,请参阅交互式外壳。
3.2 Shell命令
一个简单的shell命令,例如echo a b c
由命令本身后跟参数组成,用空格分隔。
更复杂的shell命令由以各种方式排列在一起的简单命令组成:在一个管道中,其中一个命令的输出成为第二个的输入,在循环或条件构造中,或在一些其他分组中。
• 简单命令: | 最常见的命令类型。 | |
• 管道: | 连接几个命令的输入和输出。 | |
• 列表: | 如何顺序执行命令。 | |
• 复合命令: | 用于控制流的Shell命令。 | |
• Coprocesses: | 命令之间的双向通信。 | |
• GNU Parallel: | 并行运行命令。 |
3.2.1简单命令
一个简单的命令是最经常遇到的命令。它只是由blank
s 分隔的一系列单词,由shell的一个控制操作符终止(参见定义)。第一个字通常指定要执行的命令,其余的单词是该命令的参数。
返回状态(参照退出状态的简单命令的)是它的退出状态作为通过所提供的POSIX 1003.1 waitpid
功能,或128+ Ñ如果命令是由信号终止Ñ。
3.2.2管道
A pipeline
是由一个控制运算符分隔的一个或多个命令的序列|' 要么 '|&”。
管道的格式是
[time [-p]] [!] command1 [| 或|&command2 ] ......
管道中每个命令的输出通过管道连接到下一个命令的输入。也就是说,每个命令都读取前一个命令的输出。此连接在命令指定的任何重定向之前执行。
如果'|&'使用,command1的标准错误,除了标准输出外,还通过管道连接到 command2的标准输入; 它是简写2>&1 |
。标准错误到标准输出的隐式重定向是在命令指定的任何重定向之后执行的。
保留字time
导致一旦完成,就会为管道打印时序统计信息。统计信息当前包括已用(挂钟)时间以及命令执行所消耗的用户和系统时间。该-p选项将输出格式更改为POSIX指定的格式。当shell处于POSIX模式时(参见Bash POSIX模式),time
如果下一个标记以''开头' ,则它不会识别为保留字- ”。该TIMEFORMAT
变量可以设置为格式字符串,该字符串指定应如何显示定时信息。有关可用格式的说明,请参阅Bash变量。使用time
作为保留字允许shell内置函数,shell函数和管道的时序。外部 time
命令无法轻松计时。
当shell处于POSIX模式时(参见Bash POSIX模式),time
可能后面跟一个换行符。在这种情况下,shell显示shell及其子级占用的总用户和系统时间。该TIMEFORMAT
变量可用于指定时间信息的格式。
如果管道未异步执行(请参阅列表),则shell将等待管道中的所有命令完成。
管道中的每个命令都在其自己的子shell中执行(请参阅命令执行环境)。除非pipefail
启用该选项,否则管道的退出状态是管道中最后一个命令的退出状态(请参阅Set Builtin)。如果pipefail
启用,则管道的返回状态是以非零状态退出的最后一个(最右边)命令的值,如果所有命令都成功退出,则返回零。如果保留字'!'在管道之前,退出状态是如上所述的退出状态的逻辑否定。shell在返回值之前等待管道中的所有命令终止。
Next:Compound命令,Previous:Pipelines,Up:Shell命令 [ Contents ] [ Index ]
3.2.3命令列表
A list
是由一个运营商分隔的一个或多个管道的序列;','&','&&', 要么 '||',并可选择以其中一个终止';','&'或者a newline
。
在这些列表运营商中,''&&'和'||'有同等的优先权,其次是';'和'&',具有相同的优先权。
一个或多个换行符的序列可能出现在一个list
分隔命令中,相当于一个分号。
如果命令被控制操作员终止'&',shell在子shell中异步执行命令。这称为在后台执行命令。shell不等待命令完成,返回状态为0(true)。当作业控制未激活时(请参阅作业控制),在没有任何显式重定向的情况下,异步命令的标准输入将从中重定向/dev/null
。
由'分隔的命令;'按顺序执行; shell等待每个命令依次终止。返回状态是最后执行的命令的退出状态。
AND和OR列表是由控制运算符分隔的一个或多个管道的序列&&'和'||', 分别。 AND和OR列表以左关联性执行。
一个AND序列的形式是
command1 && command2
命令2,如果执行,且仅当是command1 返回零退出状态。
一个OR序列的形式是
command1 || 命令2
命令2,如果执行,且仅当命令1 返回一个非零退出状态。
AND和OR列表的返回状态是 列表中执行的最后一个命令的退出状态。
下一篇:Coprocesses,上一篇:Lists,Up:Shell命令 [ 目录 ] [ 索引 ]
3.2.4复合命令
• 循环结构: | Shell命令用于迭代操作。 | |
• 条件构造: | 用于条件执行的Shell命令。 | |
• 命令分组: | 分组命令的方法。 |
复合命令是shell编程结构。每个构造以保留字或控制运算符开始,并由相应的保留字或运算符终止。除非明确覆盖,否则与复合命令关联的任何重定向(请参阅重定向)都将应用于该复合命令中的所有命令。
在大多数情况下,复合命令描述中的命令列表可以通过一个或多个换行符与命令的其余部分分开,并且可以后跟换行符代替分号。
Bash提供循环结构,条件命令和机制来分组命令并将它们作为一个单元执行。
Next:Conditional Constructs,Up:Compound命令 [ Contents ] [ Index ]
3.2.4.1循环结构
Bash支持以下循环结构。
请注意,无论何处'';'出现在命令语法的描述中,它可能被一个或多个换行符替换。
until
-
该
until
命令的语法是:直到测试命令 ; 做后续命令 ; DONE
只要 test-commands的退出状态不为零,就执行consequent-commands。返回状态是在后续命令中执行的最后一个命令的退出状态,如果没有执行则返回零。
while
-
该
while
命令的语法是:而测试的命令 ; 做后续命令 ; DONE
只要 test-commands的退出状态为零,就执行consequent-commands。返回状态是在后续命令中执行的最后一个命令的退出状态,如果没有执行则返回零。
for
-
该
for
命令的语法是:对于名称 [[在[ 话 ...]]; ]做命令 ; DONE
展开单词,并对结果列表中的每个成员执行一次命令,并将名称绑定到当前成员。如果'用语言'不存在,该
for
命令为每个设置的位置参数执行一次命令,就好像'在“$ @”'已被指定(参见特殊参数)。返回状态是执行的最后一个命令的退出状态。如果单词扩展中没有项目,则不执行任何命令,返回状态为零。for
还支持该命令的替代形式:for((expr1 ; expr2 ; expr3)); 做命令 ; DONE
首先,根据下面描述的规则评估算术表达式expr1(参见Shell算术)。然后重复计算算术表达式expr2,直到它的计算结果为零。每次expr2计算为非零值时,执行命令并计算算术表达式expr3。如果省略任何表达式,它表现为,如果它的计算结果为1的返回值是最后一个命令的中退出状态的命令 被执行的,或假如果任何表达式是无效的。
的break
和continue
内建命令(参见Bourne Shell的内置命令)可以被用于控制循环执行。
3.2.4.2条件结构
if
-
该
if
命令的语法是:如果测试命令 ; 然后是 后续命令 ; [elif more-test-commands ; 然后 更多结果 ;] [else alternate-consequents ;] 科幻
执行测试命令列表,如果其返回状态为零,则执行结果命令列表。如果test-commands返回非零状态,
elif
则依次执行每个列表,如果其退出状态为零,则执行相应的更多结果并完成命令。如果'否则交替结果'存在,并且finalif
或elif
子句中的最后一个命令具有非零退出状态,然后执行alternate-consequents。返回状态是执行的最后一个命令的退出状态,如果没有条件测试为真,则返回零。 case
-
该
case
命令的语法是:[[(] pattern [| pattern ] ...)命令列表中的案例单词 ;;] ... esac
case
将有选择地执行与匹配单词的第一个模式相对应的命令列表。如果shell选项(见的描述中shopt内建)被启用时,不考虑字母的情况下进行比赛。''nocasematch
shopt
|'用于分隔多个模式,')'运算符终止模式列表。模式列表和关联的命令列表称为子句。每个条款必须以'终止';;',';&', 要么 ';;&”。在尝试匹配之前,该词经历了波浪扩展,参数扩展,命令替换,算术扩展和引用删除。每个模式经历波浪扩展,参数扩展,命令替换和算术扩展。
可能有任意数量的
case
条款,每个条款以''结尾;;',';&', 要么 ';;&”。匹配的第一个模式确定执行的命令列表。使用'这是一个常见的习语'*'作为定义默认情况的最终模式,因为该模式将始终匹配。这是一个
case
在脚本中使用的示例,可用于描述动物的一个有趣特征:echo -n“输入动物名称:” 阅读动物 echo -n“$ ANIMAL有” 案例$ ANIMAL in 马| 狗| cat)echo -n“four”;; 男人| kangaroo)echo -n“two”;; *)echo -n“未知数量”;;; ESAC 回声“腿”。
如果';;使用'运算符,在第一个模式匹配后不会尝试后续匹配。使用';&'代替';;'导致执行继续使用与下一个子句关联的命令列表(如果有)。使用';;&'代替';;'使shell测试下一个子句中的模式(如果有),并 在成功匹配时执行任何关联的命令列表。
如果没有匹配模式,则返回状态为零。否则,返回状态是执行的命令列表的退出状态。
select
-
该
select
构造允许轻松生成菜单。它与for
命令的语法几乎相同:选择名称 [ 单词 ...]; 做命令 ; DONE
in
扩展后面的单词列表,生成项目列表。扩展单词集打印在标准错误输出流上,每个前面都有一个数字。如果'用语言'省略,打印位置参数,就好像'在“$ @”'已被指定。该PS3
然后,显示提示和线从标准输入读取。如果该行包含与所显示的单词之一对应的数字,则将name的值设置为该单词。如果该行为空,则再次显示单词和提示。如果EOF
读取,则select
命令完成。读取的任何其他值都会将name设置为null。读取的行保存在变量中REPLY
。的命令,直到每个选择之后执行
break
执行命令后,在该点处select
命令完成。下面是一个示例,允许用户从当前目录中选择文件名,并显示所选文件的名称和索引。
在*中选择fname; 做 echo你选了$ fname \($ REPLY \) 打破; DONE
((…))
-
((表达))
算术表达式根据下面描述的规则进行评估(参见Shell算术)。如果表达式的值不为零,则返回状态为0; 否则返回状态为1.这完全等同于
让“ 表达 ”
有关内置的完整描述,请参阅Bash Builtins
let
。 [[…]]
-
[[ 表达 ]]
根据条件表达式表达式的求值,返回0或1的状态。表达式由下面在Bash条件表达式中描述的原色组成 。不对
[[
和之间的单词执行单词拆分和文件名扩展]]
; 执行波形扩展,参数和变量扩展,算术扩展,命令替换,进程替换和引用删除。有条件的运营商,如'-F'必须不加引号才能被承认为初选。与...一起使用时
[[
,'<'和'>'运算符使用当前语言环境按字典顺序排序。当。。。的时候 '=='和'!=使用运算符时,运算符右侧的字符串被视为一种模式,并根据下面在模式匹配中描述的规则进行匹配,就像
extglob
启用了shell选项一样。''='运营商与'相同'==”。如果nocasematch
shell选项(见的描述shopt
中shopt内建)被启用时,不考虑字母的情况下进行比赛。如果字符串匹配,则返回值为0('==')或不匹配('!=')模式,否则为1。可引用图案的任何部分以迫使引用部分匹配为字符串。一个额外的二元运算符,'=〜',可用,具有与'相同的优先级'=='和'!=”。使用它时,操作符右侧的字符串被视为扩展正则表达式并相应地进行匹配(如正则表达式 3))。如果字符串与模式匹配,则返回值为0,否则返回1。如果正则表达式语法不正确,则条件表达式的返回值是2,如果
nocasematch
shell选项(见的描述shopt
中shopt内建)启用,执行匹配而不考虑字母字符的情况。可引用图案的任何部分以迫使引用部分匹配为字符串。必须小心处理正则表达式中的括号表达式,因为正常的引号字符在括号之间会失去其含义。如果模式存储在shell变量中,引用变量扩展会强制整个模式作为字符串进行匹配。与正则表达式中带括号的子表达式匹配的子字符串保存在数组变量中BASH_REMATCH
。BASH_REMATCH
索引为0 的元素是与整个正则表达式匹配的字符串部分。的元件BASH_REMATCH
与索引Ñ是字符串的匹配部分Ñ带括号的子表达式。例如,如果值中包含任意数字(包括零)的空格字符,零个或一个实例' ,则以下内容将匹配一行(存储在shell变量行中)一个',然后'b“:
[[$ line =〜[[:space:]] *(a)?b]]
这意味着价值'AAB'和' aaaaaab'将匹配,包含'的行也将匹配b'价值无处不在。
将正则表达式存储在shell变量中通常是一种有用的方法,可以避免引用shell特有的字符时出现问题。有时很难在不使用引号的情况下直接指定正则表达式,或者在注意shell的引用删除时跟踪正则表达式使用的引用。使用shell变量来存储模式可以减少这些问题。例如,以下内容相当于上述内容:
图案= '[[:空间:]] *(A)B' [[$ line =〜$ pattern]]
如果要匹配特殊字符与正则表达式语法,则必须引用它以删除其特殊含义。这意味着在'模式中'xxx.txt',''。'匹配字符串中的任何字符(通常的正则表达式含义),但在模式中'“xxx.txt”'它只能匹配文字'。”。Shell程序员应特别注意反斜杠,因为shell和正则表达式都使用反斜杠来从后面的字符中删除特殊含义。以下两组命令不相同:
图案= '\'。 [[。=〜$ pattern]] [[。=〜\。]] [[。=〜“$ pattern”]] [[。=〜'\。' ]]
前两个匹配将成功,但后两个不会,因为在后两个中反斜杠将成为要匹配的模式的一部分。在前两个示例中,反斜杠从''中删除了特殊含义。',所以文字'。' 火柴。如果第一个示例中的字符串不是'。',说'一个',模式不匹配,因为引用'。'在模式中失去了匹配任何单个字符的特殊含义。
可以使用以下运算符组合表达式,按优先级递减顺序列出:
( expression )
-
返回表达式的值。这可以用于覆盖运算符的正常优先级。
! expression
-
如果表达式为false,则为True 。
expression1 && expression2
-
如果expression1和expression2都为true,则为True。
expression1 || expression2
-
如果expression1或expression2为true,则为True。
在
&&
与||
运营商不计算表达式2,如果值表达式是足以决定整个条件表达式的返回值。
Previous:Conditional Constructs,Up:Compound命令 [ Contents ] [ Index ]
3.2.4.3分组命令
Bash提供了两种方法来将要作为一个单元执行的命令列表分组。当命令被分组时,重定向可以应用于整个命令列表。例如,列表中所有命令的输出可以重定向到单个流。
()
-
(清单)
在括号之间放置命令列表会导致创建子shell环境(请参阅命令执行环境),并且列表中的每个命令都将在该子shell中执行。由于 列表是在子shell中执行的,因此变量赋值在子shell完成后不会保持有效。
{}
-
{ list ; }
在花括号之间放置命令列表会导致列表在当前shell上下文中执行。没有创建子shell。以下列表中的分号(或换行符)是必需的。
除了创建子shell之外,由于历史原因,这两种结构之间存在细微差别。大括号是reserved words
,所以它们必须 通过s或其他shell元字符与列表分开blank
。括号是operators
,并且被shell识别为单独的标记,即使它们没有通过空格与列表分开。
这两个结构的退出状态是列表的退出状态 。
下一篇:GNU Parallel,上一篇:复合命令,上一篇:Shell命令 [ 目录 ] [ 索引 ]
3.2.5 Coprocesses
A coprocess
是以命令coproc
开头的shell命令。协同进程在子shell中异步执行,就像命令已被'&'控制操作符,在执行的shell和协处理之间建立了双向管道。
协同进程的格式是:
coproc [ NAME ] 命令 [ 重定向 ]
这将创建一个名为NAME的协同进程。如果未提供NAME,则默认名称为COPROC。 如果command是一个简单的命令,则不能提供NAME(参见Simple Commands); 否则,它被解释为简单命令的第一个单词。
执行协同进程时,shell会创建一个在执行shell的上下文中命名的数组变量(请参阅Arrays)NAME
。命令的标准输出 通过管道连接到执行shell中的文件描述符,并且该文件描述符被分配给NAME
[0]。命令的标准输入 通过管道连接到执行shell中的文件描述符,并且该文件描述符被分配给NAME
[1]。此管道在命令指定的任何重定向之前建立(请参阅重定向)。文件描述符可以用作shell命令和使用标准词扩展的重定向的参数。子shell中没有文件描述符。
为执行协同进程而生成的shell的进程ID可用作变量NAME
_PID 的值。该wait
内建命令可以用来等待协进程终止。
由于协同进程是作为异步命令创建的,因此该coproc
命令始终返回成功。协同进程的返回状态是命令的退出状态。
上一篇:Coprocesses,Up:Shell命令 [ 目录 ] [ 索引 ]
3.2.6 GNU并行
有一些方法可以并行运行未构建到Bash中的命令。GNU Parallel是一个可以做到这一点的工具。
GNU Parallel,顾名思义,可用于并行构建和运行命令。您可以使用不同的参数运行相同的命令,无论它们是文件名,用户名,主机名还是从文件读取的行。GNU Parallel提供了对许多最常见操作(输入行,输入行的各个部分,指定输入源的不同方式等)的简写引用。Parallel可以将xargs
命令从其输入源替换或馈送到几个不同的Bash实例。
有关完整说明,请参阅GNU Parallel文档。一些例子应该简要介绍它的用法。
例如,很容易替换xargs
gzip当前目录及其子目录中的所有html文件:
找 。-type f -name'* .html'-print | 并行gzip
如果需要保护特殊字符(如文件名中的换行符),请使用find -print0 选项和并行 -0 选项。
当文件数太大而无法通过一次mv
调用进行处理时,可以使用Parallel从当前目录移动文件:
ls | parallel mv {} destdir
如您所见,{}被替换为从标准输入读取的每一行。虽然ls
在大多数情况下使用都可以,但是处理所有文件名是不够的。如果您需要在文件名中包含特殊字符,则可以使用
找 。-depth 1 \!-name'。*' - print0 | parallel -0 mv {} destdir
如上所述。
这将运行mv
与当前目录中的文件一样多的命令。您可以xargs
通过添加来模拟并行-X 选项:
找 。-depth 1 \!-name'。*' - print0 | parallel -0 -X mv {} destdir
GNU Parallel可以替换在从文件读取的行上操作的某些常用习语(在这种情况下,每行列出一个文件名):
而IFS =读-rx; 做 do-something1“$ x”“config- $ x” do-something2 <“$ x” 完成<文件| 过程输出
更简洁的语法让人联想到lambdas:
猫清单| parallel“do-something1 {} config- {}; do-something2 <{}”| 过程输出
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; } | 并行traceroute
将首先显示的traceroute调用显示为输出。添加-k 选项
{echo foss.org.my; echo debian.org; echo freenetproject.org; } | 并行-k traceroute
将确保traceroute foss.org.my
首先显示输出。
最后,Parallel可用于并行运行一系列shell命令,类似于'猫文件| 庆典”。获取文件名列表,创建一系列shell命令以对其进行操作并将该提交列表提供给shell并不罕见。并行可以加快速度。假如说文件 包含一个shell命令列表,每行一个,
parallel -j 10 <file
将使用shell评估命令(因为没有提供显式命令作为参数),一次只有十个shell作业的块。
3.3 Shell函数
Shell函数是一种将命令分组以便以后使用组的单个名称执行的方法。它们像“常规”命令一样执行。当shell函数的名称用作简单命令名时,将执行与该函数名关联的命令列表。Shell函数在当前shell上下文中执行; 没有创建新的流程来解释它们。
name()compound-command [ redirections ]
要么
函数名 [()] compound-command [ redirections ]
这定义了一个名为name的shell函数。保留字function
是可选的。如果提供了function
保留字,则括号是可选的。所述主体的功能的是化合物命令 化合物命令(参见化合物命令)。该命令通常是{和}之间的列表,但可以是上面列出的任何复合命令,但有一个例外:如果使用function
保留字,但未提供括号,则需要括号。 只要将name指定为命令的名称,就会执行compound- command。当shell处于POSIX模式时(参见Bash POSIX Mode), 名称可能与其中一个特殊内置程序不同(参见Special Builtins)。执行该函数时,将执行与shell函数关联的任何重定向(请参阅重定向)。
可以使用以下命令删除函数定义 -Funset
内置选项 (参见Bourne Shell Builtins)。
除非发生语法错误或已存在具有相同名称的只读函数,否则函数定义的退出状态为零。执行时,函数的退出状态是正文中执行的最后一个命令的退出状态。
请注意,由于历史原因,在最常见的用法中,围绕函数体的花括号必须通过blank
s或换行符与主体分隔 。这是因为大括号是保留字,只有当它们通过空格或其他shell元字符与命令列表分开时才会被识别。此外,使用大括号时,列表必须以分号结束,''&'或换行符。
执行函数时,函数的参数将成为执行期间的位置参数(请参阅位置参数)。特殊参数'#将更新为扩展到位置参数的数量以反映更改。特殊参数0
不变。在FUNCNAME
执行函数时,变量的第一个元素设置为函数的名称。
shell执行环境的所有其他方面在函数及其调用者之间是相同的,但有以下例外:除非使用内置函数为函数提供了属性或者已使用内置函数启用了该函数,否则不会继承DEBUG
和RETURN
陷阱 ,(其中case所有函数都继承和陷阱),除非 已启用shell选项,否则不会继承陷阱。有关内置的描述, 请参阅Bourne Shell Builtins。 trace
declare
-o functrace
set
DEBUG
RETURN
ERR
-o errtrace
trap
的FUNCNEST
变量,如果设置为一个数字值大于0,定义了一个最大函数嵌套级别。超出限制的函数调用会导致整个命令中止。
如果return
在函数中执行内置命令,则函数完成并在函数调用后使用下一个命令继续执行。RETURN
在执行恢复之前执行与陷阱关联的任何命令。当函数完成时,位置参数的值和特殊参数'#'恢复到函数执行前的值。如果给出一个数字参数return
,那就是函数的返回状态; 否则函数的返回状态是在执行之前执行的最后一个命令的退出状态return
。
函数的局部变量可以使用local
内置函数声明 。这些变量仅对函数及其调用的命令可见。
函数名称和定义可能与列出 -Fdeclare
(typeset
)内置命令的选项(参见Bash Builtins)。该-F选项declare
或typeset
将仅列出函数名称(如果extdebug
启用了shell选项,则可选择列出源文件和行号)。可以导出函数,以便子shell自动使用它们定义它们 -Fexport
内置选项(参见Bourne Shell Builtins)。请注意,具有相同名称的shell函数和变量可能会在传递给shell的子项的环境中生成多个具有相同名称的条目。如果这可能导致问题,应该小心。
函数可以是递归的。该FUNCNEST
变量可用于限制函数调用堆栈的深度并限制函数调用的数量。默认情况下,递归调用的数量没有限制。
Next:Shell Expansions,Previous:Shell Functions,Up:Basic Shell Features [ Contents ] [ Index ]
3.4外壳参数
• 位置参数: | shell的命令行参数。 | |
• 特殊参数: | 由特殊字符表示的参数。 |
甲参数是存储的值的实体。它可以是name
下面列出的一个,一个数字或一个特殊字符。甲变量是由表示的参数name
。变量具有值和零个或多个属性。属性使用所分配的declare
内置命令(见的说明declare
内置在击内置命令)。
如果已为其分配了值,则会设置该参数。空字符串是有效值。设置变量后,只能使用unset
builtin命令取消设置。
可以通过表单的声明来分配变量
name = [ value ]
如果 未给出值,则为变量分配空字符串。所有 值都进行波形扩展,参数和变量扩展,命令替换,算术扩展和报价删除(详见下文)。如果变量的integer
属性已设置,则 即使 未使用扩展,也会将值计算为算术表达式$((…))
(请参阅算术扩展)。除了"$@"
如下所述之外,不执行单词拆分。不执行文件名扩展。赋值语句也可能出现作为参数传递给 alias
, declare
,typeset
,export
,readonly
,和local
内置命令(声明命令)。在POSIX模式下(参见Bash POSIX模式),这些内置函数可能出现在内置函数的一个或多个实例之后的命令中,command
并保留这些赋值语句属性。
在赋值语句为shell变量或数组索引赋值的上下文中(参见Arrays),'+ ='运算符可用于附加或添加到变量的先前值。这包括内置命令的参数,例如declare
接受赋值语句(声明命令)。什么时候 '+ =''被应用于已设置整数属性的变量,value被计算为算术表达式并添加到变量的当前值,该值也被计算。什么时候 '+ ='使用复合赋值(参见数组)应用于数组变量,变量的值不会被取消(因为它在使用'时)='),并且新值将附加到数组,从大于数组的最大索引(对于索引数组)开始,或者作为关联数组中的附加键值对添加。应用于字符串值变量时,会扩展值并将其附加到变量的值。
可以使用。为变量分配nameref属性 -ndeclare
或者local
内置命令的选项(请参阅Bash Builtins)以创建nameref或对另一个变量的引用。这允许间接操纵变量。每当引用nameref变量,分配给,取消设置或修改其属性(除了使用或更改nameref属性本身)之外,操作实际上是对nameref变量的值指定的变量执行的。在shell函数中通常使用nameref来引用其名称作为参数传递给函数的变量。例如,如果将变量名作为第一个参数传递给shell函数,则运行
declare -n ref = $ 1
函数内部创建一个nameref变量ref,其值是作为第一个参数传递的变量名。ref的引用和赋值及其属性的更改被视为对名称作为传递的变量的引用,赋值和属性修改$1
。
如果for
循环中的控制变量具有nameref属性,则单词列表可以是shell变量的列表,并且当执行循环时,将依次为列表中的每个单词建立名称引用。数组变量不能给出nameref属性。但是,nameref变量可以引用数组变量和下标数组变量。可以使用。取消设置Namerefs-nunset
内置选项(参见Bourne Shell Builtins)。否则,如果unset
使用nameref变量的名称作为参数执行,则将取消设置nameref变量引用的变量。
3.4.1位置参数
甲位置参数是由一个或多个数字表示的参数,比单个数字其他0
。位置参数在调用时从shell的参数中分配,并且可以使用set
builtin命令重新分配。位置参数N
可以被引用为${N}
,或者$N
当N
由单个数字组成时。可能无法使用赋值语句将位置参数分配给它们。的set
和shift
内建命令被用来设置和取消设置它们(参见壳牌内置命令)。执行shell函数时,临时替换位置参数(请参阅Shell函数)。
当展开由多个数字组成的位置参数时,必须将其括在大括号中。
3.4.2特殊参数
shell专门处理几个参数。这些参数只能被引用; 不允许分配给他们。
*
-
($ *)从1开始扩展到位置参数。当扩展不在双引号内时,每个位置参数都会扩展为单独的单词。在执行它的上下文中,这些单词受到进一步的单词拆分和路径名扩展的影响。当扩展发生在双引号内时,它会扩展为单个单词,每个参数的值由
IFS
特殊变量的第一个字符分隔 。也就是说,"$*"
相当于,其中c 是 变量值的第一个字符。如果未设置,则参数由空格分隔。如果为null,则在不插入分隔符的情况下连接参数。"$1c$2c…"
IFS
IFS
IFS
@
-
($ @)从1开始扩展到位置参数。当扩展发生在双引号内时,每个参数都会扩展为单独的单词。也就是说,
"$@"
相当于"$1" "$2" …
。如果双引号扩展发生在单词中,则第一个参数的扩展与原始单词的开头部分连接,最后一个参数的扩展与原始单词的最后部分连接。当没有位置参数时,"$@"
并且$@
展开为空(即,它们被移除)。 #
-
($#)扩展为十进制的位置参数数量。
?
-
($?)扩展到最近执行的前台管道的退出状态。
-
-
($ - ,连字符。)扩展到调用时指定的当前选项标志,
set
内置命令或shell本身设置的那些(例如-一世 选项)。 $
-
($$)扩展为shell 的进程ID。在
()
子shell中,它扩展为调用shell 的进程ID,而不是子shell。 !
-
($!)扩展到最近放入后台的作业的进程ID,无论是作为异步命令执行还是使用
bg
内置命令(请参阅Job Control Builtins)。 0
-
($ 0)扩展为shell或shell脚本的名称。这是在shell初始化时设置的。如果使用命令文件调用Bash(请参阅Shell Scripts),
$0
则将其设置为该文件的名称。如果Bash是以-C选项(请参阅调用Bash),然后$0
设置为要执行的字符串后的第一个参数(如果存在)。否则,它被设置为用于调用Bash的文件名,如参数0所示。 _
-
($ _,下划线。)在shell启动时,设置为用于调用在环境或参数列表中传递的正在执行的shell或shell脚本的绝对路径名。随后,在扩展后扩展到上一个命令的最后一个参数。还设置为用于调用已执行并放置在导出到该命令的环境中的每个命令的完整路径名。检查邮件时,此参数保存邮件文件的名称。
Next:Redirections,Previous:Shell Parameters,Up:Basic Shell Features [ Contents ] [ Index ]
3.5 Shell扩展
在将命令行拆分为token
s 后,将在命令行上执行扩展 。进行了七种扩展:
- 支撑扩张
- 波浪扩张
- 参数和变量扩展
- 命令替换
- 算术扩展
- 分词
- 文件名扩展
• 支撑扩展: | 在括号内扩展表达式。 | |
• Tilde扩展: | 扩展〜字符。 | |
• Shell参数扩展: | Bash如何将变量扩展为其值。 | |
• 指挥替代: | 使用命令的输出作为参数。 | |
• 算术扩展: | 如何在shell扩展中使用算术。 | |
• 流程替代: | 一种写入和读取命令的方法。 | |
• 单词拆分: | 扩展结果如何分成单独的参数。 | |
• 文件名扩展: | 用于指定匹配模式的文件名的简写。 | |
• 报价删除: | 如何以及何时从单词中删除引号字符。 |
扩展的顺序是:支撑扩展; 代码扩展,参数和变量扩展,算术扩展和命令替换(以从左到右的方式完成); 分词; 和文件名扩展。
在可以支持它的系统上,还有一个额外的扩展可用:进程替换。这与波形符,参数,变量以及算术扩展和命令替换同时执行。
执行这些扩展后,原始单词中出现的引号字符将被删除,除非它们已被引用(引用删除)。
只有大括号扩展,分词和文件名扩展才能改变扩展的单词数量; 其他扩展将单个单词扩展为单个单词。唯一的例外是扩展 "$@"
(参见特殊参数)和 (参见数组)。 "${name[@]}"
在所有扩展之后,执行quote removal
(参见报价删除)。
3.5.1支撑扩张
支撑扩展是一种可以生成任意字符串的机制。此机制类似于 文件名扩展(请参阅文件名扩展),但生成的文件名不需要存在。要扩展的模式采用可选前导码的形式,后跟一系列以逗号分隔的字符串或一对大括号之间的序列表达式,后跟可选的postscript。前导码以大括号内包含的每个字符串为前缀,然后将postscript附加到每个结果字符串,从左向右扩展。
Brace扩展可以嵌套。每个展开的字符串的结果都没有排序; 保持从左到右的顺序。例如,
bash $ echo a {d,c,b} e ade ace abe
序列表达式采用形式,其中x和y是整数或单个字符,incr是可选的增量,是整数。提供整数时,表达式将扩展为x和y之间的每个数字(包括 0和y)。提供的整数可能以'为前缀'{x..y[..incr]}
0'强制每个术语具有相同的宽度。当x或y以零开头时,shell会尝试强制所有生成的术语包含相同数量的数字,必要时填充零填充。提供字符时,表达式使用默认的C语言环境在x和y之间按字典顺序扩展到每个字符。请注意,x和y必须属于同一类型。当提供增量时,它被用作每个术语之间的差异。根据需要,默认增量为1或-1。
在任何其他扩展之前执行大括号扩展,并且在结果中保留对其他扩展特殊的任何字符。这是严格的文字。Bash不对扩展的上下文或大括号之间的文本应用任何语法解释。为避免与参数扩展冲突,字符串'$ {'不被认为有资格进行大括号扩展。
正确形成的大括号扩展必须包含不带引号的开括号和右大括号,以及至少一个不带引号的逗号或有效的序列表达式。任何不正确形成的支撑扩展都保持不变。
A {或','可以用反斜杠引用,以防止它被视为括号表达式的一部分。为避免与参数扩展冲突,字符串'$ {'不被认为有资格进行大括号扩展。
当要生成的字符串的公共前缀比上例中的更长时,此构造通常用作速记:
mkdir / usr / local / src / bash / {old,new,dist,bugs}
要么
chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
3.5.2 Tilde扩展
如果一个单词以不带引号的波浪号字符开头('〜'),所有字符直到第一个未加引号的斜杠(或所有字符,如果没有未加引号的斜杠)被认为是波浪号前缀。如果没有引用tilde-prefix中的任何字符,则代字号后面的波浪号前缀中的字符将被视为可能的登录名。如果此登录名是空字符串,则将波形符替换为HOME
shell变量的值。如果HOME
未设置,则替换执行shell的用户的主目录。否则,tilde-prefix将替换为与指定登录名关联的主目录。
如果波浪号前缀是'〜+',shell变量的值PWD
替换了波浪号前缀。如果波浪号前缀是'〜 - ',shell变量的值( OLDPWD
如果已设置)将被替换。
如果波浪号前缀中波浪号后面的字符由数字N组成,可选择以''为前缀+'或'- ',tilde-prefix被替换为目录堆栈中的相应元素,因为它将由dirs
tilde-prefix中波形符后面的字符作为参数调用内置函数显示(请参阅目录堆栈)。如果波浪号前缀没有波形符号,则由一个没有前导的数字组成+' 要么 '- ','+' 假设。
如果登录名无效,或者代字号扩展失败,则该字保持不变。
在''之后立即检查每个变量赋值的未加引号的波浪号前缀:'或第一'=”。在这些情况下,还执行波浪扩展。因此,人们可以使用的文件名与颚化符号在指配到 PATH
,MAILPATH
,和CDPATH
,并且壳分配扩展后的值。
下表显示了Bash如何处理不带引号的波浪号前缀:
~
-
的价值
$HOME
~/foo
-
$ HOME /富
~fred/foo
-
foo
用户主目录的 子目录fred
~+/foo
-
$ PWD / foo的
~-/foo
-
$ {OLDPWD- '〜 - '} /富
~N
-
将由''显示的字符串dirs + N.“
~+N
-
将由''显示的字符串dirs + N.“
~-N
-
将由''显示的字符串dirs - N.“
3.5.3 Shell参数扩展
''$'字符引入了参数扩展,命令替换或算术扩展。要扩展的参数名称或符号可以用大括号括起来,大括号是可选的,但用于保护变量从紧跟在其后面的字符扩展,这些字符可以被解释为名称的一部分。
使用大括号时,匹配的结束括号是第一个'}'不是通过反斜杠或在带引号的字符串中转义,也不是在嵌入式算术扩展,命令替换或参数扩展中。
参数扩展的基本形式是$ { parameter }。参数的值被替换。该参数是如上所述的shell参数(请参阅Shell参数)或数组引用(请参阅数组)。当参数 是具有多个数字的位置参数时,或者当参数后跟不被解释为其名称的一部分的字符时,需要括号。
如果参数的第一个字符是感叹号(!),并且参数不是nameref,则它引入了一个变量间接的级别。Bash使用从参数的其余部分形成的变量的值作为变量 的名称; 然后展开此变量,并将该值用于替换的其余部分,而不是参数本身的值。这被称为indirect expansion
。如果参数是nameref,则会扩展为参数引用的变量的名称,而不是执行完整的间接扩展。对此的例外是$ {的扩展!前缀 *}和$ {!名称[@]} 如下面所描述的。感叹号必须紧跟左支撑,以引入间接。
在下面的每种情况中,单词都受波形扩展,参数扩展,命令替换和算术扩展的影响。
当不执行子串扩展时,使用下面描述的形式(例如,': - '),Bash测试未设置或为null的参数。省略冒号只会导致对未设置的参数进行测试。换句话说,如果包含冒号,运算符将测试两个参数的存在以及它的值是否为空; 如果省略冒号,则运算符仅测试是否存在。
${parameter:-word}
-
如果参数未设置或为null,则替换单词的扩展 。否则,参数的值将 被替换。
${parameter:=word}
-
如果参数 未设置或为null,则将字的扩展 分配给参数。然后替换参数的值。不能以这种方式分配位置参数和特殊参数。
${parameter:?word}
-
如果参数 为null或未设置,则单词的扩展(或者如果单词 不存在则为该效果的消息)将写入标准错误,如果不是交互式,则退出shell。否则,参数的值将被替换。
${parameter:+word}
-
如果参数 为null或未设置,则不替换任何内容,否则将替换word的扩展 。
${parameter:offset}
${parameter:offset:length}
-
这称为子字符串扩展。它扩展为 从offset指定的字符开始的参数值的最大长度字符。如果参数是'@',下标的索引数组'@' 要么 '*'或关联数组名称,结果如下所述不同。如果省略length,则会扩展为参数值的子字符串,该值 从offset指定的字符开始 并延伸到值的末尾。 length和offset是算术表达式(参见Shell Arithmetic)。
如果offset的计算结果小于零,则该值将用作参数值末尾的字符偏移量。如果length的计算结果小于零,则将其解释为字符与参数值末尾的偏移量而不是字符数,并且扩展名是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} 公元前 $ 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} 公元前 $ 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} 公元前 $ echo $ {array [0]: - 7:-2} BCDEF
如果参数是'@',结果是从偏移量开始的长度位置参数。相对于大于最大位置参数的负偏移取负值,因此偏移量-1评估为最后一个位置参数。如果长度评估为小于零的数字,则为扩展错误。
以下示例说明了使用位置参数的子字符串扩展:
$ set - 1 2 3 4 5 6 7 8 9 0 abcdefgh $ echo $ {@:7} 7 8 9 0 abcdefgh $ echo $ {@:7:0} $ echo $ {@:7:2} 7 8 $ echo $ {@:7:-2} bash:-2:substring expression <0 $ echo $ {@: - 7:2} 公元前 $ echo $ {@:0} ./bash 1 2 3 4 5 6 7 8 9 0 abcdefgh $ echo $ {@:0:2} ./bash 1 $ echo $ {@: - 7:0}
如果参数是由''下标的索引数组名称@' 要么 '*',结果是 数组的长度成员开头。相对于大于指定数组的最大索引的偏移量取负偏移量。如果长度评估为小于零的数字,则为扩展错误。
${parameter[offset]}
这些示例显示了如何使用索引数组的子字符串扩展:
$ array =(0 1 2 3 4 5 6 7 8 9 0 abcdefgh) $ echo $ {array [@]:7} 7 8 9 0 abcdefgh $ echo $ {array [@]:7:2} 7 8 $ echo $ {array [@]: - 7:2} 公元前 $ echo $ {array [@]: - 7:-2} bash:-2:substring expression <0 $ echo $ {array [@]:0} 0 1 2 3 4 5 6 7 8 9 0 abcdefgh $ echo $ {array [@]:0:2} 0 1 $ echo $ {array [@]: - 7:0}
应用于关联数组的子串扩展会产生未定义的结果。
除非使用位置参数,否则子串索引是从零开始的,在这种情况下,索引默认从1开始。如果offset为0,并且使用了位置参数,
$@
则会在列表中添加前缀。 ${!prefix*}
${!prefix@}
-
扩展为名称以prefix开头的变量的名称,由
IFS
特殊变量的第一个字符分隔。什么时候 '@'使用并且扩展显示在双引号内,每个变量名称扩展为单独的单词。 ${!name[@]}
${!name[*]}
-
如果name是数组变量,则展开到名称中指定的数组索引(键)列表。如果name不是数组,则在设置name时扩展为0 ,否则为null。什么时候 '@'被使用,扩展出现在双引号内,每个键扩展为一个单独的单词。
${#parameter}
-
参数展开值的字符长度被替换。如果参数是'*' 要么 '@',替换值是位置参数的数量。如果参数是''下标的数组名称*' 要么 '@',替换值是数组中元素的数量。如果参数 是由负数下标的索引数组名称,则该数字被解释为相对于大于参数的最大索引的数字 ,因此负数索引从数组末尾开始计数,索引-1引用最后一个元件。
${parameter#word}
${parameter##word}
-
这个词 被扩展为产生一个模式,就像文件名扩展一样(参见文件名扩展)。如果模式匹配参数的扩展值的开头,那么扩展的结果是 具有最短匹配模式的参数的扩展值('#“案例”或最长的匹配模式('##'案例)删除。如果参数是'@' 要么 '*',模式去除操作依次应用于每个位置参数,并且扩展是结果列表。如果参数是一个下标''的数组变量@' 要么 '*',模式删除操作依次应用于数组的每个成员,扩展是结果列表。
${parameter%word}
${parameter%%word}
-
这个词被扩展为产生一个模式,就像文件名扩展一样。如果模式匹配参数展开值的尾部 ,那么展开的结果是具有最短匹配模式的参数值 ('%“案例”或最长的匹配模式('%%'案例)删除。如果参数是'@' 要么 '*',模式去除操作依次应用于每个位置参数,并且扩展是结果列表。如果参数 是一个下标''的数组变量@' 要么 '*',模式删除操作依次应用于数组的每个成员,扩展是结果列表。
${parameter/pattern/string}
-
的图案被膨胀,以产生一个模式,就像在文件名扩展。 扩展参数,并将模式 与其值的最长匹配替换为字符串。如果模式以''开头/',模式的所有匹配都用字符串替换。通常只替换第一场比赛。如果模式以''开头#',它必须在参数的扩展值的开头匹配。如果模式以''开头%',它必须在参数的扩展值的末尾匹配。如果string为null,则删除pattern的匹配,并且可以省略
/
以下模式。如果nocasematch
shell选项(见的描述shopt
中shopt内建)被启用时,不考虑字母的情况下进行比赛。如果参数是'@' 要么 '*',替换操作依次应用于每个位置参数,并且扩展是结果列表。如果参数 是一个下标''的数组变量@' 要么 '*',替换操作依次应用于数组的每个成员,扩展是结果列表。 ${parameter^pattern}
${parameter^^pattern}
${parameter,pattern}
${parameter,,pattern}
-
此扩展修改参数中字母字符的大小写。的图案被膨胀,以产生一个模式,就像在文件名扩展。参数的扩展值中的每个字符都针对模式进行测试 ,如果它与模式匹配,则转换其大小写。该模式不应尝试匹配多个字符。''^'运算符将匹配模式的小写字母转换 为大写; '','运算符将匹配的大写字母转换为小写。''^^'和',,'扩展转换扩展值中的每个匹配字符; ''^'和','扩展匹配并仅转换扩展值中的第一个字符。如果省略pattern,则将其视为''?',匹配每个角色。如果参数是'@' 要么 '*',将大小写修改操作依次应用于每个位置参数,并且扩展是结果列表。如果参数 是一个下标''的数组变量@' 要么 '*',大小写修改操作依次应用于数组的每个成员,扩展是结果列表。
${parameter@operator}
-
扩展可以是参数值的变换,也可以是参数本身的 信息,具体取决于运算符的值 。每个运营商都是一个字母:
Q
-
扩展是一个字符串,它是以可以重用为输入的格式引用的参数值。
E
-
扩展是一个字符串,它是带有反斜杠转义序列的参数值,与
$'…'
引用mechansim一样。 P
-
扩展是一个字符串,它是扩展参数值的结果, 就好像它是一个提示字符串一样(请参阅控制提示)。
A
-
扩展是赋值语句或
declare
命令形式的字符串,如果求值,将使用其属性和值重新创建参数。 a
-
扩展是一个由表示参数属性的标志值组成的字符串 。
如果参数是'@' 要么 '*',操作依次应用于每个位置参数,扩展是结果列表。如果参数 是一个下标''的数组变量@' 要么 '*',操作依次应用于数组的每个成员,扩展是结果列表。
扩展的结果受到分词和路径名扩展的影响,如下所述。
3.5.4命令替换
命令替换允许输出命令来替换命令本身。命令替换发生在命令括起时,如下所示:
$(命令)
要么
` 命令 `
Bash通过在子shell环境中执行命令并使用命令的标准输出替换命令替换来执行扩展,并删除任何尾随换行符。嵌入的换行不会被删除,但在分词时可能会被删除。命令替换可以替换为等效但更快。 $(cat file)
$(< file)
当使用旧式反引号形式的替换时,反斜杠保留其字面含义,除非后面跟着'$','`', 要么 '\”。第一个不带反斜杠的反引号终止命令替换。使用表单时,括号内的所有字符组成命令; 没有人特别对待。 $(command)
命令替换可以嵌套。要在使用反引号形式时进行嵌套,请使用反斜杠转义内部反引号。
如果替换出现在双引号内,则不会对结果执行单词拆分和文件名扩展。
3.5.5算术扩展
算术扩展允许评估算术表达式和结果的替换。算术扩展的格式是:
$((表达式))
该表达式被视为在双引号内,但括号内的双引号未被特别处理。表达式中的所有标记都经历参数和变量扩展,命令替换和引用删除。结果被视为要评估的算术表达式。算术扩展可以嵌套。
评估根据下面列出的规则执行(参见Shell算术)。如果表达式无效,Bash将打印一条消息,指示标准错误失败并且不会发生替换。
3.5.6流程替换
进程替换允许使用文件名引用进程的输入或输出。它采取的形式
<(清单)
要么
>(列表)
进程列表以异步方式运行,其输入或输出显示为文件名。作为扩展的结果,此文件名作为参数传递给当前命令。如果使用表单,写入文件将提供列表输入。如果使用 表单,则应读取作为参数传递的文件以获取列表的输出。请注意,没有空间可之间出现或 与左括号,否则结构将被解释为一个重定向。支持命名管道(FIFO)或支持命名管道的系统支持进程替换>(list)
<(list)
<
>
的/ dev / FD 命名打开文件的方法。
可用时,进程替换与参数和变量扩展,命令替换和算术扩展同时执行。
3.5.7单词拆分
shell扫描参数扩展,命令替换和算术扩展的结果,这些结果在双引号内没有出现用于分词。
shell将每个字符$IFS
视为分隔符,并使用这些字符作为字段终止符将其他扩展的结果拆分为单词。如果IFS
没有设置,或者它的值是完全<space><tab><newline>
,默认值,然后序列 <space>
,<tab>
以及<newline>
在开始和以前扩张的结果最终会被忽略,而任何序列IFS
在开始时没有字符或结束用于分隔单词。如果IFS
具有比缺省以外的值,则空白字符的序列space
,tab
以及newline
在开始和该词的端忽略,只要空白字符是在的值IFS
(一个IFS
空白字符)。其中的任何角色IFS
都不是IFS
空格以及任何相邻的IFS
空白字符分隔字段。一系列IFS
空白字符也被视为分隔符。如果值为IFS
null,则不会发生分词。
保留显式空参数(""
或''
)并将其作为空字符串传递给命令。将删除由于没有值的参数的扩展而产生的不带引号的隐式空参数。如果在双引号内扩展没有值的参数,则会生成并返回null参数,并将其作为空字符串传递给命令。当引用的null参数作为扩展为非null的单词的一部分出现时,将删除null参数。也就是说,在单词拆分和空参数删除之后,该单词 -d''
变为-d
。
请注意,如果不发生扩展,则不执行拆分。
3.5.8文件名扩展
• 模式匹配: | shell如何匹配模式。 |
分词后,除非 -F选项已设置(请参阅Set Builtin),Bash扫描每个单词的字符'*','?','和'[”。如果出现其中一个字符,则该单词被视为模式,并替换为与模式匹配的按字母顺序排列的文件名列表(请参阅模式匹配)。如果未找到匹配的文件名,并且nullglob
禁用了shell选项,则该字保持不变。如果nullglob
设置了该选项,并且未找到匹配项,则删除该单词。如果failglob
设置了shell选项,但未找到匹配项,则会打印一条错误消息并且不执行该命令。如果nocaseglob
启用了shell选项,则执行匹配而不考虑字母字符的情况。
当模式用于文件名扩展时,字符'。除非dotglob
设置了shell选项,否则必须明确匹配文件名开头或紧跟斜杠后的字符串。匹配文件名时,必须始终明确匹配斜杠字符。在其他情况下,'。'人物不受特别对待。
见的描述shopt
中shopt内建,为的描述nocaseglob
,nullglob
, failglob
,和dotglob
选项。
所述GLOBIGNORE
外壳变量可以用来限制该组匹配的图案的文件名。如果GLOBIGNORE
设置,则匹配其中一个模式的每个匹配文件 GLOBIGNORE
名将从匹配列表中删除。如果nocaseglob
设置了该选项,GLOBIGNORE
则执行与模式的匹配 而不考虑大小写。文件名 。 和 ..GLOBIGNORE
设置 时始终忽略,而不是null。但是,设置GLOBIGNORE
为非null值具有启用dotglob
shell选项的效果,因此所有其他文件名以''开头。'会匹配。为了获得忽略以''开头的文件名的旧行为。',make'*。'其中一种模式GLOBIGNORE
。 未设置dotglob
时禁用该选项GLOBIGNORE
。
3.5.8.1模式匹配
除了下面描述的特殊模式字符之外,模式中出现的任何字符都与其自身匹配。该NUL可以以图案不会发生字符。反斜杠会逃避以下字符; 匹配时丢弃转义反斜杠。如果要按字面匹配,则必须引用特殊模式字符。
特殊模式字符具有以下含义:
*
-
匹配任何字符串,包括空字符串。当
globstar
外壳选项启用,并且“*'用于文件名扩展上下文,两个相邻'*用作单个模式将匹配所有文件以及零个或多个目录和子目录。如果后跟一个'/',两个相邻'*只会匹配目录和子目录。 ?
-
匹配任何单个字符。
[…]
-
匹配任何一个附带的字符。用连字符分隔的一对字符表示范围表达式 ; 使用当前区域设置的整理顺序和字符集匹配这两个字符之间的任何字符(包括在内)。如果第一个字符跟'['是'!'或'^'那么任何未包含的字符都是匹配的。一个 '- 可以通过将其包括为集合中的第一个或最后一个字符来匹配。一个 ']'可以通过将其包含在集合中的第一个字符来匹配。范围表达式中字符的排序顺序由当前语言环境
LC_COLLATE
以及LC_ALL
shell变量的值( 如果已设置)确定。例如,在默认的C语言环境中,'[A-DX-Z]'相当于'[abcdxyz]”。许多语言环境按字典顺序对字符进行排序,并在这些语言环境中排序[A-DX-Z]'通常不等于'[abcdxyz]“; 它可能相当于'[aBbCcDdxXyYz]', 例如。要获得括号表达式中范围的传统解释,可以通过将
LC_COLLATE
或LC_ALL
环境变量设置为值' 来强制使用C语言环境。C',或启用globasciiranges
shell选项。内 '['和']',可以使用语法类指定 字符类,其中class是POSIX标准中定义的以下类之一:
[:
:]
alnum alpha ascii空白cntrl数字图表更低 打印punct空间上面的单词xdigit
字符类匹配属于该类的任何字符。该
word
字符类匹配字母,数字和字符“_”。内 '['和']”,一个等价类可以使用语法指定
[=
Ç=]
,它匹配具有相同的排序规则重量的所有字符(如由当前区域定义)作为字符Ç。内 '['和']',语法
[.
符号.]
与整理符号符号匹配。
如果extglob
使用shopt
内置函数启用了shell选项,则会识别多个扩展模式匹配运算符。在以下描述中,模式列表是由a'分隔的一个或多个模式的列表。|”。可以使用以下子图案中的一个或多个来形成复合图案:
?(pattern-list)
-
匹配给定模式的零次或一次出现。
*(pattern-list)
-
匹配给定模式的零次或多次出现。
+(pattern-list)
-
匹配给定模式的一次或多次出现。
@(pattern-list)
-
匹配给定模式之一。
!(pattern-list)
-
匹配除了给定模式之外的任何内容。
3.5.9报价删除
在前面的扩展之后,所有未出现的字符出现'\','“','和'“'不会导致上述扩展之一的结果被删除。
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
,或者如果n
未指定则输入标准输入(文件描述符0)。
重定向输入的一般格式是:
[ n ] < 字
3.6.2重定向输出
输出的重定向导致打开名称由word扩展产生的文件 以便在文件描述符n上写入,或者如果 未指定n则打开标准输出(文件描述符1)。如果文件不存在则创建; 如果确实存在则将其截断为零大小。
重定向输出的一般格式是:
[ n ]> [|] 字
如果重定向运算符是'>',并且启用noclobber
了set
内置选项,如果名称来自单词扩展的文件存在并且是常规文件,则重定向将失败 。如果重定向运算符是'> |',或重定向运算符'>'并且noclobber
未启用该选项,即使由word命名的文件存在,也会尝试重定向。
3.6.3附加重定向输出
以这种方式重定向输出会导致名称由word扩展产生的文件 打开以附加到文件描述符n上,或者如果 未指定n则打开标准输出(文件描述符1)。如果该文件不存在,则创建该文件。
附加输出的一般格式是:
[ n ] >> 字
3.6.4重定向标准输出和标准错误
此构造允许将标准输出(文件描述符1)和标准错误输出(文件描述符2)重定向到名称为单词扩展的文件。
重定向标准输出和标准错误有两种格式:
&> 字
和
>&word
在这两种形式中,第一种是优选的。这在语义上等同于
> 字 2>&1
使用第二种形式时,单词可能不会扩展为数字或'- ”。如果是,则应用其他重定向运算符(请参阅下面的“复制文件描述符”)以了解兼容性原因。
3.6.5附加标准输出和标准误差
此构造允许将标准输出(文件描述符1)和标准错误输出(文件描述符2)附加到名称为单词扩展的文件。
附加标准输出和标准错误的格式为:
&>> 字
这在语义上等同于
>> 字 2>&1
(请参阅下面的复制文件描述符)。
3.6.6这里的文件
这种类型的重定向指示shell从当前源读取输入,直到 看到只包含单词(没有尾随空白)的行。所有行的读取到该点随后被用作标准输入(或文件描述符ñ如果Ñ被指定)的命令。
here-documents的格式是:
[ n ] << [ - ] word here- document delimiter
没有参数和变量扩展,命令替换,算术扩展或文件名扩展是在执行 字。如果引用了单词的任何部分,则 分隔符是单词上的引号删除的结果,并且不会展开here-document中的行。如果word不加引号,则here-document的所有行都要进行参数扩展,命令替换和算术扩展,\newline
忽略字符序列,并且'\'必须用来引用人物'\','$','和'`”。
如果重定向运算符是'<< - ',然后从输入行和包含分隔符的行中删除所有前导制表符。这允许shell脚本中的here-documents以自然的方式缩进。
3.6.7这里的字符串
这里文档的一个变体,格式是:
[ n ] <<< 字
所述字经历括号扩展,波浪线扩展,参数和变量扩展,命令替换算术扩展和引用的去除。不执行路径名扩展和单词拆分。的结果被提供作为单个字符串,以换行附加到命令的标准输入(或文件描述符ñ如果Ñ指定)。
3.6.8复制文件描述符
重定向运算符
[ n ] <&word
用于复制输入文件描述符。如果word 扩展为一个或多个数字,则由n表示的文件描述符 将成为该文件描述符的副本。如果单词中的数字未指定打开输入的文件描述符,则会发生重定向错误。如果单词 评估为'- ',文件描述符n已关闭。如果未指定n,则使用标准输入(文件描述符0)。
运营商
[ n ]>&word
与重复的输出文件描述符类似地使用。如果 未指定n,则使用标准输出(文件描述符1)。如果单词中的数字未指定打开输出的文件描述符,则会发生重定向错误。如果单词 评估为'- ',文件描述符n已关闭。作为特殊情况,如果省略n,并且单词不会扩展为一个或多个数字或'- ',标准输出和标准错误如前所述被重定向。
3.6.9移动文件描述符
重定向运算符
[ n ] <&digit -
移动文件描述符数字文件描述符Ñ,或者如果标准输入(文件描述符0)ñ没有被指定。 数字在复制到n后关闭。
同样,重定向运算符
[ n ]>&digit -
移动文件描述符数字文件描述符Ñ,或者如果标准输出(文件描述符1)ñ没有被指定。
3.6.10打开读写文件描述符
重定向运算符
[ n ] <> 字
导致名称为word扩展的 文件在文件描述符n上读取和写入时打开 ,如果 未指定n则在文件描述符0上打开。如果该文件不存在,则创建该文件。
3.7执行命令
• 简单的命令扩展: | Bash如何在执行它们之前扩展简单命令。 | |
• 命令搜索和执行: | Bash如何查找命令并运行它们。 | |
• 命令执行环境: | Bash执行非shell内置命令的环境。 | |
• 环境: | 给命令的环境。 | |
• 退出状态: | 命令返回的状态以及Bash如何解释它。 | |
• 信号: | 当Bash或它运行的命令收到信号时会发生什么。 |
3.7.1简单的命令扩展
执行简单命令时,shell将从左到右执行以下扩展,分配和重定向。
- 解析器标记为变量赋值(命令名称前面的那些)和重定向的单词将保存以供以后处理。
- 扩展非变量赋值或重定向的单词(请参阅Shell Expansions)。如果在扩展后仍有任何单词,则第一个单词将被视为命令的名称,其余单词则为参数。
- 如上所述执行重定向(请参阅重定向)。
- '后面的文字'='在每个变量赋值中,在分配给变量之前经历波浪扩展,参数扩展,命令替换,算术扩展和引用删除。
如果未生成命令名称,则变量赋值会影响当前的shell环境。否则,变量将添加到已执行命令的环境中,不会影响当前的shell环境。如果任何分配尝试将值分配给只读变量,则会发生错误,并且命令以非零状态退出。
如果没有命令名称结果,则执行重定向,但不影响当前的shell环境。重定向错误导致命令以非零状态退出。
如果在扩展后留下命令名称,则执行如下所述。否则,该命令退出。如果其中一个扩展包含命令替换,则该命令的退出状态是执行的最后一个命令替换的退出状态。如果没有命令替换,则命令以状态为零退出。
3.7.2命令搜索和执行
将命令拆分为单词后,如果它生成简单命令和可选参数列表,则执行以下操作。
- 如果命令名称不包含斜杠,则shell会尝试找到它。如果存在该函数的shell函数,则按Shell函数中的描述调用该函数。
- 如果名称与函数不匹配,shell将在shell builtins列表中搜索它。如果找到匹配项,则调用该内置项。
- 如果名称既不是shell函数也不是内置函数,并且不包含斜杠,则Bash会搜索
$PATH
包含该名称的可执行文件的目录的每个元素 。Bash使用哈希表来记录可执行文件,以避免多重的完整路径PATH
搜索(见的描述hash
在Bourne Shell的内置命令)。$PATH
只有在哈希表中找不到该命令时,才会执行对目录的完整搜索。如果搜索不成功,shell将搜索已定义的shell函数command_not_found_handle
。如果该函数存在,则使用原始命令和原始命令的参数作为其参数调用它,函数的退出状态将成为shell的退出状态。如果未定义该函数,则shell将输出错误消息并返回退出状态127。 - 如果搜索成功,或者命令名称包含一个或多个斜杠,则shell在单独的执行环境中执行指定的程序。参数0设置为给定的名称,并且命令的其余参数设置为提供的参数(如果有)。
- 如果由于文件不是可执行格式而导致此执行失败,并且该文件不是目录,则假定它是 shell脚本,并且shell按照Shell脚本中的描述执行它 。
- 如果命令未异步启动,则shell会等待命令完成并收集其退出状态。
3.7.3命令执行环境
shell有一个执行环境,它包含以下内容:
- 打开由调用时shell继承的文件,由提供给
exec
内置的 重定向修改 - 如通过设置当前工作目录
cd
,pushd
或popd
,或通过在调用壳继承 - 文件创建模式掩码由
umask
shell的父级设置或继承自shell的父级 - 当前陷阱设置
trap
- shell参数,由变量赋值设置,或者与
set
shell中父项在环境中继承 - shell函数在执行期间定义或从shell的父级环境中继承
- 调用时启用的选项(默认情况下或使用命令行参数)或通过
set
- 选项启用
shopt
(参见The Shopt Builtin) - 用别名定义的shell别名
alias
(参见别名) - 各种进程ID,包括后台作业(参见列表),值
$$
和值$PPID
当要执行除内置函数或shell函数之外的简单命令时,将在包含以下内容的单独执行环境中调用它。除非另有说明,否则值将从shell继承。
- shell的打开文件,以及由重定向到命令指定的任何修改和添加
- 当前的工作目录
- 文件创建模式掩码
- 标记为导出的shell变量和函数,以及为该命令导出的变量,在环境中传递(请参阅环境)
- shell捕获的陷阱将重置为从shell的父级继承的值,并忽略shell忽略的陷阱
在此单独环境中调用的命令不会影响shell的执行环境。
命令替换,用括号分组的命令和异步命令在子shell环境中调用,该shell环境是shell环境的副本,除了shell捕获的陷阱被重置为shell在调用时从其父级继承的值。作为管道的一部分调用的内置命令也在子shell环境中执行。对子shell环境所做的更改不会影响shell的执行环境。
衍生出来执行命令替换的子shell继承了该值 -e来自父shell的选项。当不在POSIX模式时,Bash清除-e 这种子壳中的选项。
如果命令后跟''&'并且作业控制未激活,该命令的默认标准输入是空文件 的/ dev / null的。否则,调用的命令将继承由重定向修改的调用shell的文件描述符。
3.7.4环境
调用程序时,会给出一个称为环境的字符串数组。这是表单的名称 - 值对列表name=value
。
Bash提供了几种操作环境的方法。在调用时,shell会扫描自己的环境并为找到的每个名称创建一个参数,并自动将其标记为导出 到子进程。执行的命令继承环境。在export
和“声明-x'命令允许在环境中添加和删除参数和功能。如果修改了环境中参数的值,则新值将成为环境的一部分,替换旧值。任何执行的命令继承的环境都包含shell的初始环境,其值可以在shell中修改,少于由unset
'和' 删除的任何对。出口-n'命令,以及通过export
和'的任何补充声明-x'命令。
任何简单命令或函数的环境都可以通过为参数赋值添加前缀来临时扩充,如Shell参数中所述。这些赋值语句仅影响该命令所见的环境。
如果 -k选项已设置(请参阅Set Builtin),然后所有参数分配都放在命令的环境中,而不仅仅是命令名称之前的那些。
当Bash调用外部命令时,变量'$ _'设置为命令的完整路径名,并在其环境中传递给该命令。
3.7.5退出状态
执行命令的退出状态是waitpid系统调用或等效函数返回的值 。退出状态介于0到255之间,但如下所述,shell可能会特别使用大于125的值。shell builtins和复合命令的退出状态也仅限于此范围。在某些情况下,shell将使用特殊值来指示特定的故障模式。
出于shell的目的,以零退出状态退出的命令已成功。非零退出状态表示失败。使用这种看似反直觉的方案,因此有一种明确定义的方式来指示成功和各种方式来指示各种故障模式。当命令终止于编号为N的致命信号时,Bash使用值128+ N作为退出状态。
如果未找到命令,则为执行该命令而创建的子进程将返回状态127.如果找到命令但不可执行,则返回状态为126。
如果命令因扩展或重定向期间的错误而失败,则退出状态大于零。
退出状态由Bash条件命令(请参阅条件构造)和一些列表构造(请参阅列表)使用。
所有Bash内置函数如果成功则返回零状态,并在失败时返回非零状态,因此条件和列表构造可以使用它们。所有内置函数都返回退出状态2以指示不正确的用法,通常是无效选项或缺少参数。
3.7.6信号
当Bash是交互式的,没有任何陷阱时,它会忽略 SIGTERM
(这样'杀死0'不会杀死交互式shell),并且SIGINT
被捕获和处理(以便wait
内置可以中断)。当Bash收到a时SIGINT
,它会突破任何正在执行的循环。在所有情况下,Bash都会忽略SIGQUIT
。如果作业控制生效(见作业控制),猛砸忽略SIGTTIN
,SIGTTOU
和SIGTSTP
。
由Bash启动的非内置命令将信号处理程序设置为shell从其父级继承的值。当作业控制无效,异步命令忽略SIGINT
和SIGQUIT
除了这些继承处理。运行作为命令替换的结果的命令忽略键盘生成的作业控制信号 SIGTTIN
,SIGTTOU
和SIGTSTP
。
收到a后,shell默认退出SIGHUP
。在退出之前,交互式shell会重新发送SIGHUP
所有正在运行或已停止的作业。发送停止的工作SIGCONT
以确保他们收到SIGHUP
。为防止shell将SIGHUP
信号发送到特定作业,应将其从disown
内置的作业表中删除(请参阅作业控制内置)或标记为不接收SIGHUP
使用disown -h
。
如果 huponexit
已设置shell选项shopt
(请参阅Shopt Builtin),则SIGHUP
当交互式登录shell退出时,Bash会向所有作业发送。
如果Bash正在等待命令完成并收到已设置陷阱的信号,则在命令完成之前不会执行该陷阱。当Bash通过wait
内置命令等待异步命令时,接收到已设置陷阱的信号将导致wait
内置命令立即返回,退出状态大于128,紧接着执行陷阱。
3.8 Shell脚本
shell脚本是包含shell命令的文本文件。当这样的文件在调用Bash时被用作第一个非选项参数,而不是-C 也不 -s提供了选项(请参阅调用Bash),Bash从文件中读取并执行命令,然后退出。这种操作模式创建了一个非交互式shell。shell首先在当前目录中搜索该文件,并在$PATH
那里找不到目录。
当Bash运行shell脚本时,它将特殊参数设置为0
文件名,而不是shell的名称,并且位置参数设置为其余参数(如果有)。如果未提供其他参数,则取消设置位置参数。
通过使用该chmod
命令打开执行位,可以使shell脚本可执行。当Bash在搜索$PATH
命令时找到这样的文件时,它会生成一个子shell来执行它。换句话说,执行
文件名参数
相当于执行
bash文件名参数
if filename
是可执行的shell脚本。这个子shell重新初始化自身,这样效果就好像一个新的外壳已经被调用来解释脚本,不同之处在于由父想起命令的位置(见的描述hash
在Bourne Shell的内置命令)由孩子被保留。
大多数Unix版本都将其作为操作系统命令执行机制的一部分。如果脚本的第一行以两个字符开头'#!',该行的其余部分指定该程序的解释器。因此,您可以指定Bash,awk
Perl或其他一些解释器,并以该语言编写脚本文件的其余部分。
解释器的参数由脚本文件第一行上的解释器名称后面的单个可选参数组成,后跟脚本文件的名称,后跟其余参数。Bash将在不自行处理它的操作系统上执行此操作。请注意,某些旧版本的Unix将解释器名称和参数限制为最多32个字符。
Bash脚本通常以#! /bin/bash
(假设已安装Bash)开头/箱),因为这确保了Bash将用于解释脚本,即使它是在另一个shell下执行的。
4 Shell Builtin命令
• Bourne Shell Builtins: | 从Bourne Shell继承的内置命令。 | |
• Bash Builtins: | 特定于Bash的内置表。 | |
• 修改Shell行为: | Builtins用于修改shell属性和可选行为。 | |
• 特别建筑: | 由POSIX专门分类的内置命令。 |
内置命令包含在shell本身中。当内置命令的名称用作简单命令的第一个单词时(请参阅简单命令),shell直接执行命令,而不调用另一个程序。内置命令对于实现不可能的功能或通过单独的实用程序获得不方便是必需的。
本节简要介绍Bash从Bourne Shell继承的内置函数,以及Bash中唯一或已扩展的内置命令。
其他章节中描述了几个内置命令:内置命令,它们为作业控制工具提供Bash接口(参见Job Control Builtins),目录堆栈(参见Directory Stack Builtins),命令历史(参见Bash History Builtins),以及可编程完井设施(参见可编程完井建筑物)。
许多内置程序已经被POSIX或Bash 扩展。
除非另有说明,否则每个内置命令都记录为接受选项,前面是'- '接受'- '表示选项的结束。在:
,true
,false
,和test
建宏不接受选项,并没有把'- '特别。的exit
,logout
,return
, break
,continue
,let
,和shift
内建接受并处理论点“开始- '不需要'- ”。其他接受参数但未指定为接受选项的内置函数解释以'开头的参数- '作为无效选项并要求'- '以防止这种解释。
下一篇:Bash Builtins,Up:Shell内置命令 [ 目录 ] [ 索引 ]
4.1 Bourne Shell Builtins
以下shell内置命令继承自Bourne Shell。这些命令按POSIX标准的规定实现。
: (a colon)
-
:[ 参数 ]
除了扩展参数和执行重定向之外什么都不做。返回状态为零。
. (a period)
-
。文件名 [ 参数 ]
从当前shell上下文中的filename参数读取并执行命令。如果filename不包含斜杠,则该
PATH
变量用于查找文件名。当Bash未处于POSIX模式时,如果找不到filename,则搜索当前目录$PATH
。如果提供了任何参数,则在执行文件名时它们将成为位置参数。否则,位置参数不变。如果-T选项已启用,source
继承任何陷阱DEBUG
; 如果不是,DEBUG
则在调用时保存和恢复任何陷阱字符串source
,并在执行时source
取消设置DEBUG
陷阱。如果-T未设置,源文件更改DEBUG
陷阱,source
完成后将保留新值。返回状态是执行的最后一个命令的退出状态,如果没有执行命令则返回零。如果找不到filename,或者无法读取,则返回状态为非零。这个内置相当于source
。 break
-
休息[ n ]
退出从
for
,while
,until
,或select
循环。如果Ñ被提供时,Ñ个封闭回路中退出。 n必须大于或等于1.除非n不大于或等于1,否则返回状态为零。 cd
-
cd [-L | [-P [-e]] [ - @] [ 目录 ]
将当前工作目录更改为目录。如果未提供directory,
HOME
则使用shell变量的值。忽略目录后的任何其他参数。如果shell变量CDPATH
存在,则将其用作搜索路径:在每个目录名称中CDPATH
搜索 目录,其他目录名称CDPATH
用冒号分隔(':“)。如果目录以斜杠开头,CDPATH
则不使用。该 -P选项意味着不遵循符号链接:符号链接在
cd
遍历目录时和处理实例之前被解析..'在目录中。默认情况下,或者当 -L提供了选项,在处理实例' 后,目录中的符号链接被解析
cd
..'在目录中。如果'..'出现在目录中,通过删除前面的路径名组件,回到斜杠或目录的开头来处理它。
如果 -e 选项随附 -P 并且在成功更改目录后无法成功确定当前工作目录,
cd
将返回不成功的状态。在支持它的系统上, - @ option将与文件关联的扩展属性显示为目录。
如果目录是'- ',它
$OLDPWD
在尝试更改目录之前转换为。如果使用非空目录名称
CDPATH
,或者如果'- '是第一个参数,目录更改成功,新工作目录的绝对路径名将写入标准输出。如果目录成功更改,则返回状态为零,否则返回非零。
continue
-
继续[ n ]
恢复一个封闭的下一次迭代
for
,while
,until
,或select
循环。如果提供n,则恢复执行第n个封闭循环。 n必须大于或等于1.除非n不大于或等于1,否则返回状态为零。 eval
-
eval [ 参数 ]
参数连接在一起形成一个命令,然后读取并执行,并将其退出状态作为退出状态返回
eval
。如果没有参数或只有空参数,则返回状态为零。 exec
-
exec [-cl] [-a name ] [ command [ arguments ]]
如果 提供了命令,它将替换shell而不创建新进程。如果-l如果提供了选项,shell会在传递给command的第0个参数的开头放置一个破折号。这就是该
login
计划的作用。该-C选项导致命令在空环境中执行。如果-一个在提供时,shell将name作为命令的第0个参数传递。如果 由于某种原因无法执行命令,则会退出非交互式shell,除非execfail
启用了shell选项。在这种情况下,它会返回失败。如果无法执行文件,则交互式shell将返回失败。如果未指定命令,则可以使用重定向来影响当前的shell环境。如果没有重定向错误,则返回状态为零; 否则返回状态为非零。 exit
-
退出[ n ]
退出shell,将状态n返回给shell的父级。如果省略n,则退出状态是最后执行的命令的状态。
EXIT
在shell终止之前执行任何陷阱。 export
-
export [-fn] [-p] [ name [= value ]]
标记要传递给环境中的子进程的每个名称。如果-F提供了选项,名称 s引用shell函数; 否则名称引用shell变量。该-n选项意味着不再标记要导出的每个名称。如果没有提供名称,或者如果没有-p给出选项,显示所有导出变量的名称列表。该-p选项以可以重复用作输入的形式显示输出。如果变量名后跟= value,则变量的值设置为value。
除非提供了无效选项,其中一个名称不是有效的shell变量名称,否则返回状态为零 -F 提供的名称不是shell函数。
getopts
-
getopts optstring name [ args ]
getopts
shell脚本用于解析位置参数。 optstring包含要识别的选项字符; 如果一个字符后面跟一个冒号,那么该选项应该有一个参数,该参数应该用空格分隔。结肠(':')和问号('?')不能用作选项字符。每次调用它时,getopts
将下一个选项放在shell变量名中,初始化 名称(如果它不存在),以及要处理到变量中的下一个参数的索引OPTIND
。OPTIND
每次调用shell或shell脚本时,都会初始化为1。当选项需要参数时,getopts
将该参数放入变量中OPTARG
。shell不会OPTIND
自动重置; 如果要使用getopts
一组新参数,则必须在同一shell调用内的多次调用之间手动重置。遇到选项结束时,
getopts
退出时返回值大于零。OPTIND
设置为第一个非选项参数的索引,并将name设置为'?”。getopts
通常解析位置参数,但如果在args中给出更多参数,则getopts
解析它们。getopts
可以通过两种方式报告错误。如果optstring的第一个字符 是冒号, 则使用静默错误报告。在正常操作中,遇到无效选项或缺少选项参数时,将打印诊断消息。如果变量OPTERR
设置为0,则不会显示任何错误消息,即使第一个字符optstring
不是冒号。如果看到无效选项,则
getopts
地点'?'进入名称,如果不是沉默,则打印错误消息并取消设置OPTARG
。如果getopts
是静音,则放置找到的选项字符OPTARG
,不打印诊断消息。如果找不到所需的参数,并且
getopts
没有沉默,则会出现问号('?')放置在名称中,OPTARG
未设置,并打印诊断消息。如果getopts
是沉默,那么冒号(':')放置在 名称中,OPTARG
并设置为找到的选项字符。 hash
-
hash [-r] [-p filename ] [-dt] [ name ]
每次
hash
调用时,它都会记住指定为名称参数的命令的完整路径名,因此无需在后续调用中搜索它们。通过搜索中列出的目录找到命令$PATH
。任何以前记住的路径名都将被丢弃。该-p选项禁止路径搜索,文件名用作名称的位置。该-r选项会导致shell忘记所有记住的位置。该-d选项会导致shell忘记每个名称的记忆位置。如果-t提供选项,打印每个名称对应的完整路径 名。如果提供了多个名称参数-t的名称被散列全路径名之前打印。该-l选项导致输出以可以重用为输入的格式显示。如果没有给出参数,或者仅给出参数-l提供有关记住命令的信息。除非找不到名称或提供了无效选项,否则返回状态为零。 pwd
-
pwd [-LP]
打印当前工作目录的绝对路径名。如果-P提供了选项,打印的路径名不包含符号链接。如果-L提供了选项,打印的路径名可能包含符号链接。除非在确定当前目录的名称或提供了无效选项时遇到错误,否则返回状态为零。
readonly
-
readonly [-aAf] [-p] [ name [= value ]] ...
将每个名称标记为只读。后续分配不能更改这些名称的值。如果-F提供选项,每个名称引用一个shell函数。该-一个option意味着每个名称引用一个索引数组变量; 该-一个选项意味着每个名称都引用一个关联数组变量。如果提供了两个选项,-一个优先。如果没有给出名称参数,或者如果没有-p 提供选项,打印所有只读名称的列表。其他选项可用于将输出限制为只读名称集的子集。该-p选项导致输出以可以重用为输入的格式显示。如果变量名后跟= value,则变量的值设置为value。除非提供了无效选项,其中一个名称参数不是有效的shell变量或函数名称,否则返回状态为零-F 选项提供的名称不是shell函数。
return
-
返回[ n ]
导致shell函数停止执行并将值n返回 给其调用者。如果未提供n,则返回值是函数中执行的最后一个命令的退出状态。如果
return
由陷阱处理程序执行,则用于确定状态的最后一个命令是在陷阱处理程序之前执行的最后一个命令。如果return
在DEBUG
陷阱期间执行,则用于确定状态的最后一个命令return
是在调用之前由陷阱处理程序执行的最后一个命令。return
也可用于终止使用.
(source
)内置执行的脚本的执行,返回n或脚本中执行的最后一个命令的退出状态作为脚本的退出状态。如果提供n,返回值是其最低有效8位。RETURN
在执行函数或脚本之后继续执行之前,将执行与陷阱关联的任何命令。返回状态是如果非零return
供给非数值参数或由执行的脚本的过程中使用的功能外,而不是.
或source
。 shift
-
转移[ n ]
将位置参数向左移动n。来自n +1 ... 的位置参数
$#
被重命名为$1
......$#
- n。由数字表示的参数$#
来$#
- ñ +1都没有设置。 n必须是小于或等于的非负数$#
。如果n为零或大于$#
,则位置参数不会改变。如果未提供n,则假定为1.除非n大于$#
或小于零,否则返回状态为零,否则为非零。 test
[
-
测试expr
评估条件表达式expr并返回状态0(true)或1(false)。每个运算符和操作数必须是单独的参数。表达式由下面在Bash条件表达式中描述的原色组成 。
test
不接受任何选择,也不接受和忽略其论点- 表示选项的结束。使用
[
表单时,命令的最后一个参数必须是a]
。表达式可以使用以下运算符组合,按优先级的降序列出。评估取决于参数的数量; 见下文。当有五个或更多参数时,使用运算符优先级。
! expr
-
如果expr为false,则为True 。
( expr )
-
返回expr的值。这可以用于覆盖运算符的正常优先级。
expr1 -a expr2
-
如果expr1和expr2都为真,则为真。
expr1 -o expr2
-
如果expr1或expr2为真,则为真。
在
test
和[
内建评估使用基于参数个数一组规则的条件表达式。- 0个参数
-
表达式是假的。
- 1个论点
-
当且仅当参数不为null时,表达式才为真。
- 2个论点
-
如果第一个参数是'!',当且仅当第二个参数为null时,表达式才为真。如果第一个参数是一元条件运算符之一(请参阅Bash条件表达式),则如果一元测试为真,则表达式为true。如果第一个参数不是有效的一元运算符,则表达式为false。
- 3个论点
-
以列出的顺序应用以下条件。如果第二个参数是二进制条件运算符之一(请参阅Bash条件表达式),则表达式的结果是使用第一个和第三个参数作为操作数的二进制测试的结果。''-一个'和'-o当有三个参数时,运算符被认为是二元运算符。如果第一个参数是'!',该值是使用第二和第三个参数的双参数测试的否定。如果第一个参数完全是'('和第三个论点正是')',结果是第二个参数的单参数测试。否则,表达式为false。
- 4个论点
-
如果第一个参数是'!',结果是否定了由剩余参数组成的三参数表达式。否则,使用上面列出的规则根据优先级解析和评估表达式。
- 5个或更多参数
-
使用上面列出的规则根据优先级解析和评估表达式。
与
test
'或'一起使用时[',''<'和'>'运算符使用ASCII排序按字典顺序排序。 times
-
时
打印shell及其子项使用的用户和系统时间。返回状态为零。
trap
-
陷阱[-lp] [ arg ] [ sigspec ...]
当shell接收信号sigspec时,将读取并执行arg中的命令。如果arg不存在(并且有一个sigspec)或等于'- ',每个指定信号的处置都会重置为shell启动时的值。如果arg是空字符串,那么shell和它调用的命令将忽略每个sigspec指定的信号。如果arg不存在并且-p如果已提供,shell将显示与每个sigspec关联的陷阱命令。如果没有提供参数,或者仅提供参数-p如果给出,
trap
则以可以作为shell输入重用的形式打印与每个信号编号相关联的命令列表。该-l选项使shell打印信号名称列表及其相应的数字。每个sigspec都是信号名称或信号编号。信号名称不区分大小写,SIG
前缀是可选的。如果sigspec 是
0
orEXIT
,则在shell退出时执行arg。如果SIGSPEC是DEBUG
,该命令ARG每简单的命令,之前执行for
命令,case
命令,select
命令,每个运算for
的命令,所述第一命令之前执行在一个壳的功能。有关其对陷阱影响的详细信息,请参阅内置extdebug
选项的说明shopt
(请参阅The Shopt Builtin)DEBUG
。如果SIGSPEC是RETURN
,该命令ARG每次执行与执行的功能壳或脚本.
或source
builtins完成执行。如果SIGSPEC是
ERR
,该命令ARG 每当管线(其可以由单个简单的命令的),列表,或化合物命令返回一个非0状态,必须符合以下条件被执行。的ERR
,如果失败的命令是立即以下内容的命令列表的一部分,不执行陷阱until
或while
关键字,继该测试的一部分if
或elif
保留字,在执行的命令的一部分&&
或||
除命令列表以下的最终&&
或||
任何指令在管道中但是最后一个,或者如果命令的返回状态被反转使用!
。这些是errexit
(()的相同条件-e) 选项。进入shell时忽略的信号不能被捕获或重置。当创建一个被捕获的信号时,未被忽略的信号将在子shell或子shell环境中重置为其原始值。
除非sigspec未指定有效信号,否则返回状态为零。
umask
-
umask [-p] [-S] [ 模式 ]
将shell进程的文件创建掩码设置为mode。如果 模式以数字开头,则将其解释为八进制数; 如果不是,则将其解释为类似于
chmod
命令所接受的符号模式掩码。如果省略mode,则打印掩码的当前值。如果-S 如果没有mode参数,则提供选项,掩码以符号格式打印。如果 -p提供了选项, 省略了模式,输出的形式可以重复用作输入。如果模式成功更改或未提供模式参数,则返回状态为零,否则返回非零。请注意,当模式被解释为八进制数时,将从中减去每个umask数
7
。因此,一个umask的022
结果是权限755
。 unset
-
未设置[-fnv] [ 名称 ]
删除每个变量或函数名称。如果-v给出了选项,每个 名称引用一个shell变量并删除该变量。如果-F给出了选项,名称 s引用shell函数,并删除函数定义。如果-n提供了选项,name是具有nameref属性的变量,name将被取消设置而不是它引用的变量。 -n 如果没有效果 -F提供选项。如果没有提供选项,则每个名称都指一个变量; 如果该名称没有变量,则取消设置具有该名称的任何函数。可能不会取消设置只读变量和函数。除非名称是只读的,否则返回状态为零。
下一页:修改Shell行为,上一篇:Bourne Shell Builtins,Up:Shell内置命令 [ 目录 ] [ 索引 ]
4.2 Bash内置命令
本节介绍Bash中唯一或已扩展的内置命令。其中一些命令在POSIX标准中指定。
alias
-
别名[-p] [ name [= value ] ...]
没有争论或与 -p选项,
alias
以允许将它们作为输入重用的形式在标准输出上打印别名列表。如果提供了参数,则为 为其值指定的每个名称定义别名。如果没有值给出的名称和别名的值被打印出来。别名在别名中描述。 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),但每个绑定或命令必须作为单独的参数传递; 例如,'“\ CX \ CR”:重新读取初始化文件”。
选项(如果提供)具有以下含义:
-m keymap
-
使用keymap作为后续绑定影响的键映射。可接受的键盘映射 名称
emacs
,emacs-standard
,emacs-meta
,emacs-ctlx
,vi
,vi-move
,vi-command
,和vi-insert
。vi
相当于vi-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
-
从文件名中读取键绑定。
-q function
-
查询哪些键调用命名函数。
-u function
-
取消绑定绑定到指定函数的所有键。
-r keyseq
-
删除keyseq的所有当前绑定。
-x keyseq:shell-command
-
导致在输入keyseq时执行shell命令。当壳命令被执行时,外壳设置 变量到的Readline线缓冲器和的内容可变插入点的当前位置。如果执行的命令更改了或 的值,则这些新值将反映在编辑状态中。
READLINE_LINE
READLINE_POINT
READLINE_LINE
READLINE_POINT
-X
-
列出绑定到shell命令的所有键序列以及可以重用为输入的格式的相关命令。
除非提供了无效选项或发生错误,否则返回状态为零。
builtin
-
内置[ shell-builtin [ args ]]
运行shell内置,传递args,并返回其退出状态。这在定义与shell内置函数同名的shell函数时非常有用,它保留了函数内置函数的功能。如果shell-builtin不是shell内置命令,则返回状态为非零。
caller
-
来电者[ expr ]
返回任何活动子例程调用的上下文(shell函数或使用
.
或者source
内置函数执行的脚本)。如果没有expr,则
caller
显示当前子例程调用的行号和源文件名。如果提供非负整数作为expr,则caller
显示当前执行调用堆栈中与该位置对应的行号,子例程名称和源文件。例如,可以使用该额外信息来打印堆栈跟踪。当前帧是帧0。除非shell没有执行子例程调用,否则返回值为0,或者expr不对应于调用堆栈中的有效位置。
command
-
命令[-pVv] 命令 [ 参数 ...]
使用参数运行命令,忽略任何名为command的 shell函数。仅执行通过搜索找到的shell内置命令或命令 。如果有一个名为的shell函数,则运行'
PATH
ls
命令ls函数内部将执行外部命令,ls
而不是递归调用函数。该-p选项意味着使用默认值PATH
,保证找到所有标准实用程序。在这种情况下返回值是127,如果命令无法找到或发生错误,并且退出状态命令 ,否则。如果是 -V 要么 -v提供选项,打印命令描述。该-v选项会生成一个单词,表示用于调用命令的命令或文件名; 该-V选项会产生更详细的描述。在这种情况下,如果找到命令则返回状态为零,否则返回非零。
declare
-
声明[-aAfFgilnrtux] [-p] [ name [= value ] ...]
声明变量并赋予它们属性。如果没有给出名称,则显示变量的值。
该 -p选项将显示每个名称的属性和值 。什么时候-p与名称参数,附加选项一起使用,除了-F 和 -F,被忽略了。
什么时候 -p在没有名称参数的情况下提供,
declare
将显示具有由其他选项指定的属性的所有变量的属性和值。如果没有提供其他选项-p,declare
将显示所有shell变量的属性和值。该-F 选项会将显示限制为shell函数。该 -F选项禁止显示功能定义; 仅打印函数名称和属性。如果
extdebug
使用shopt
(参见Shopt Builtin)启用shell选项,则还会显示定义每个名称的源文件名和行号。 -F 暗示 -F。该 -Goption强制在全局范围内创建或修改变量,即使
declare
在shell函数中执行也是如此。在所有其他情况下都会被忽略。以下选项可用于将输出限制为具有指定属性的变量或提供变量属性:
-a
-
每个名称都是一个索引数组变量(请参阅数组)。
-A
-
每个名称都是一个关联数组变量(请参阅数组)。
-f
-
仅使用功能名称。
-i
-
该变量将被视为整数; 当为变量赋值时,执行算术评估(参见壳算术)。
-l
-
为变量分配值时,所有大写字符都将转换为小写。大写属性已禁用。
-n
-
为每个名称指定nameref属性,使其成为另一个变量的名称引用。另一个变量由name的值定义。对名称的所有引用,赋值和属性修改,除了使用或更改的名称 -n属性本身是对name的值引用的变量执行 的。nameref属性不能应用于数组变量。
-r
-
让名字只读。然后,这些名称不能通过后续赋值语句指定值或取消设置。
-t
-
为每个名称指定
trace
属性。跟踪函数从调用shell 继承DEBUG
和RETURN
陷阱。trace属性对变量没有特殊含义。 -u
-
为变量分配值时,所有小写字符都将转换为大写。小写属性已禁用。
-x
-
将每个名称标记为通过环境导出到后续命令。
使用'+' 代替 '- '关闭属性,但有例外'+一'可能不会用于销毁数组变量'+ R'不会删除readonly属性。在函数中使用时,
declare
将每个名称设置为本地,与local
命令一样,除非-G使用选项。如果变量名后跟= value,则变量的值设置为value。使用时 -一个 要么 -一个 以及用于创建数组变量的复合赋值语法,其他属性在后续赋值之前不会生效。
除非遇到无效选项,否则返回状态为零,尝试使用'定义函数'-f foo = bar',尝试为readonly变量赋值,尝试在不使用复合赋值语法的情况下为数组变量赋值(参见Arrays),其中一个名称不是有效的shell变量名,尝试关闭只读变量的只读状态,尝试关闭数组变量的数组状态,或者尝试显示不存在的函数-F。
echo
-
echo [-neE] [ arg ...]
输出以空格分隔的arg,以换行符结束。除非发生写入错误,否则返回状态为0。如果-n如果指定,则尾随换行符将被禁止。如果-e给出了选项,启用了对以下反斜杠转义字符的解释。该-E选项禁用这些转义字符的解释,即使在默认情况下解释它们的系统上也是如此。所述
xpg_echo
壳选项可以被用于动态地确定是否echo
由默认扩展了这些转义字符。echo
不解释- 意味着选择的结束。echo
解释以下转义序列:\a
-
警报(铃)
\b
-
退格
\c
-
抑制进一步的输出
\e
\E
-
逃逸
\f
-
形式饲料
\n
-
新队
\r
-
回车
\t
-
水平标签
\v
-
垂直标签
\\
-
反斜线
\0nnn
-
八位字符,其值为八进制值nnn (零到三个八进制数字)
\xHH
-
八位字符,其值为十六进制值HH (一个或两个十六进制数字)
\uHHHH
-
Unicode(ISO / IEC 10646)字符,其值为十六进制值 HHHH(一到四个十六进制数字)
\UHHHHHHHH
-
Unicode(ISO / IEC 10646)字符,其值为十六进制值 HHHHHHHH(一到八个十六进制数字)
enable
-
启用[-a] [-dnps] [-f filename ] [ name ...]
启用和禁用内置shell命令。禁用内置允许执行与内置shell相同名称的磁盘命令,而不指定完整路径名,即使shell通常在磁盘命令之前搜索内置命令也是如此。如果-n使用,名称 s被禁用。否则 名称已启用。例如,要使用
test
找到的二进制$PATH
代替shell内置版本,请键入'启用-n测试”。如果 -p提供了选项,或者没有显示名称参数,打印了shell内置列表。没有其他参数,该列表包含所有已启用的shell内置函数。该-一个 选项意味着列出每个内置项,并指示它是否已启用。
该 -F选项意味着在支持动态加载的系统上 从共享对象文件名加载新的内置命令名称。该-d 选项将删除加载的内置 -F。
如果没有选项,则显示shell builtins列表。该-s选项限制
enable
为POSIX特殊内置。如果-s 与...一起使用 -F,新的内置成为一个特殊的内置(见特别内置)。返回状态为零,除非名称不是内置shell或从共享对象加载新内置函数时出错。
help
-
帮助[-dms] [ 模式 ]
显示有关内置命令的有用信息。如果图案被指定,
help
给出了匹配的所有命令的详细帮助模式,否则被印刷在内建的列表。选项(如果提供)具有以下含义:
-d
-
显示每个模式的简短描述
-m
-
以类似联机帮助页的格式 显示每个模式的描述
-s
-
仅显示每个模式的简短用法概要
除非没有命令匹配模式,否则返回状态为零。
let
-
让表达 [ 表达 ...]
该
let
内建允许在shell变量进行运算。每个表达式都根据Shell算术中给出的规则进行评估。如果最后一个表达式的计算结果为0,则let
返回1; 否则返回0。 local
-
本地[ 选项 ] 名称 [= 值 ] ...
对于每个参数,将创建名为name的局部变量,并为其指定值。该选项可以是接受的任何选项
declare
。local
只能在一个函数中使用; 它使变量 名具有仅限于该函数及其子项的可见范围。如果名字是'- ',shell选项集对于local
调用的函数是本地的:set
当函数返回时,使用函数内部更改的shell选项将恢复为其原始值。除非local
在函数外部使用,提供了无效名称或name是只读变量,否则返回状态为零。 logout
-
注销[ n ]
退出登录shell,将状态n返回给shell的父级。
mapfile
-
mapfile [-d delim ] [-n count ] [-O origin ] [-s count ] [-t] [-u fd ] [-C callback ] [-c quantum ] [ array ]
读取来自标准输入线到索引数组变量阵列,或从文件描述符FD 如果-u提供选项。该变量
MAPFILE
是默认数组。选项(如果提供)具有以下含义:-d
-
delim的第一个字符用于终止每个输入行,而不是换行符。
-n
-
复制最多计数行。如果count为0,则复制所有行。
-O
-
开始在索引源处分配数组。默认索引为0。
-s
-
丢弃读取的第一个计数行。
-t
-
除去一个尾随DELIM从各行读出(默认换行)。
-u
-
从文件描述符fd读取行而不是标准输入。
-C
-
每次读取量子 P线时评估回调。该-C选项指定量子。
-c
-
指定每次调用回调之间读取的行数。
如果 -C 没有指定 -C,默认量程为5000.当 评估回调时,它将提供要分配的下一个数组元素的索引以及要作为附加参数分配给该元素的行。 在读取行但在分配数组元素之前评估回调。
如果未提供显式原点,
mapfile
则 在分配之前清除数组。mapfile
除非提供了无效的选项或选项参数,数组无效或 不可分配,或者数组不是索引数组,否则返回成功。 printf
-
printf [-v var ] format [ arguments ]
写格式化参数的控制下,以标准输出格式。该-v选项会将输出分配给变量 var,而不是打印到标准输出。
的格式是一个字符串,其包含三种类型的对象:普通的字符,其被简单地复制到标准输出,字符转义序列,其被转换和复制到标准输出,和格式规范,其中的每一个使下一个印刷连续的 论证。除标准
printf(1)
格式外,还printf
解释以下扩展名:%b
-
导致
printf
以相同的方式扩展相应参数中的反斜杠转义序列echo -e
(请参阅Bash Builtins)。 %q
-
导致
printf
以可以作为shell输入重用的格式输出相应的参数。 %(datefmt)T
-
导致
printf
使用datefmt作为strftime
(3)的格式字符串输出的日期时间字符串 。相应的参数是一个整数,表示自纪元以来的秒数。可以使用两个特殊参数值:-1表示当前时间,-2表示调用shell的时间。如果未指定参数,则转换的行为与已给出-1相同。这是通常printf
行为的例外。
非字符串格式说明符的参数被视为C语言常量,但允许使用前导加号或减号,如果前导字符是单引号或双引号,则该值是后续字符的ASCII值。
必要时重用该格式以使用所有参数。如果格式需要的参数多于提供的参数,则额外的格式规范的行为就像提供了零值或空字符串一样。成功时返回值为零,失败时返回值为非零。
read
-
读[-ers] [-a aname ] [-d delim ] [-i text ] [-n nchars ] [-N nchars ] [-p prompt ] [-t timeout ] [-u fd ] [ name ...]
从标准输入读取一行,或从作为参数提供的文件描述符fd读取 -u选项,如上面在Word拆分中所述拆分为单词,第一个单词分配给第一个名称,第二个单词分配给第二个名称,依此类推。如果单词多于名称,则将剩余单词及其间隔分隔符分配给姓氏。如果从输入流中读取的字数少于名称,则为其余名称分配空值。
IFS
变量值中的字符用于使用shell用于扩展的相同规则将行拆分为单词(如上面在Word拆分中所述)。反斜杠字符'\'可用于删除下一个字符读取和行继续的任何特殊含义。如果未提供名称,则将读取的行分配给变量REPLY
。退出状态为零,除非遇到文件结束,read
超时(在这种情况下状态大于128),发生变量分配错误(例如分配给只读变量),或者无效的文件描述符是作为参数提供-u。选项(如果提供)具有以下含义:
-a aname
-
这些单词被分配给数组变量aname的顺序索引 ,从0开始。所有元素在赋值之前从aname中删除。其他名称参数将被忽略。
-d delim
-
delim的第一个字符用于终止输入行,而不是换行符。
-e
-
Readline(参见命令行编辑)用于获取该行。Readline使用当前(或默认,如果行编辑以前未激活)编辑设置。
-i text
-
如果使用Readline读取行,则在编辑开始之前将文本放入编辑缓冲区。
-n nchars
-
read
读取nchars字符后返回,而不是等待完整的输入行,但如果在分隔符之前读取的字符数少于nchars,则表示分隔符。 -N nchars
-
read
在读取完全nchars字符后返回,而不是等待完整的输入行,除非遇到EOF或read
超时。输入中遇到的分隔符不会被特殊处理,并且在读取nchars字符read
之前不会返回 。结果不会分裂在字符中; 意图是变量被精确分配给读取的字符(反斜杠除外;参见IFS
-r选项如下)。 -p prompt
-
在尝试读取任何输入之前,显示提示,没有尾随换行符。仅当输入来自终端时才会显示提示。
-r
-
如果给出此选项,则反斜杠不会充当转义字符。反斜杠被认为是该行的一部分。特别是,反斜杠 - 换行符对不能用作行继续。
-s
-
静音模式。如果输入来自终端,则不回显字符。
-t timeout
-
read
如果在超时秒内未读取完整的输入行(或指定数量的字符),则导致超时并返回失败。 超时 可以是十进制数,小数点后面的小数部分。此选项仅在read
从终端,管道或其他特殊文件读取输入时有效; 从常规文件中读取时没有任何效果。如果read
超时,read
则将任何部分输入读取保存到指定的变量名称中。如果超时为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 ]
读取来自标准输入线到索引数组变量阵列,或从文件描述符FD 如果-u 提供选项。
的同义词
mapfile
。 source
-
源文件名
.
(参见Bourne Shell Builtins)的同义词。 type
-
输入[-afptP] [ name ...]
对于每个名称,指示如果用作命令名称将如何解释它。
如果 -t使用选项,
type
打印一个单词,这是'别号','功能','内置','文件' 要么 '关键词',如果name分别是别名,shell函数,shell内置,磁盘文件或shell保留字。如果找不到名称,则不打印任何内容,并type
返回失败状态。如果 -p使用选项,
type
要么返回将要执行的磁盘文件的名称,要么返回任何内容-t 不会回来'文件”。该 -P选项强制路径搜索每个名称,即使 -t 不会回来'文件”。
如果命令被哈希, -p 和 -P打印散列值,该值不一定是首先出现的文件
$PATH
。如果 -一个使用选项,
type
返回包含名为file的可执行文件的所有位置。这包括别名和函数,当且仅当-p 选项也没有使用。如果 -F使用选项,
type
不会尝试查找shell函数,就像command
内置函数一样。如果找到所有名称,则返回状态为零,如果未找到,则返回非零。
typeset
-
typeset [-afFgrxilnrtux] [-p] [ name [= value ] ...]
提供该
typeset
命令是为了与Korn shell兼容。它是declare
内置命令的同义词。 ulimit
-
ulimit [-HSabcdefiklmnpqrstuvxPT] [ 限制 ]
ulimit
在允许此类控制的系统上,提供对shell启动的进程可用资源的控制。如果给出了一个选项,则解释如下:-S
-
更改并报告与资源关联的软限制。
-H
-
更改并报告与资源关联的硬限制。
-a
-
报告所有当前限制。
-b
-
最大套接字缓冲区大小。
-c
-
创建的核心文件的最大大小。
-d
-
进程数据段的最大大小。
-e
-
最大调度优先级(“nice”)。
-f
-
shell及其子代写入的文件的最大大小。
-i
-
待处理信号的最大数量。
-k
-
可以分配的最大kqueues数。
-l
-
可锁定到内存的最大大小。
-m
-
最大驻留集大小(许多系统不遵守此限制)。
-n
-
打开文件描述符的最大数量(大多数系统不允许设置此值)。
-p
-
管道缓冲区大小。
-q
-
POSIX消息队列中的最大字节数。
-r
-
最大实时调度优先级。
-s
-
最大堆栈大小。
-t
-
最大CPU时间量,以秒为单位。
-u
-
单个用户可用的最大进程数。
-v
-
shell可用的最大虚拟内存量,在某些系统上可用于其子级。
-x
-
最大文件锁数。
-P
-
伪终端的最大数量。
-T
-
最大线程数。
如果给出限制,那么-一个未使用选项, limit是指定资源的新值。特殊的限制值
hard
,soft
和unlimited
代表当前的硬限制,当前的软限制,并没有限制,分别。一旦设置了非root用户,就无法增加硬限制; 软限制可以增加到硬限制的值。否则,将打印指定资源的软限制的当前值,除非-H提供选项。设置新限制时,如果两者都没有-H 也不 -S提供硬限制和软限制。如果没有给出选项,那么-F假设。值以1024字节为增量,除了-t,这是几秒钟; -p,以512字节块为单位; -P, -T, -b, -k, -n 和 -u,这是未缩放的值; 并且,当处于POSIX模式时(参见Bash POSIX模式), -C 和 -F,以512字节为增量。除非提供了无效的选项或参数,否则返回状态为零,或者在设置新限制时发生错误。
unalias
-
unalias [-a] [ name ...]
从别名列表中删除每个名称。如果-一个提供,删除所有别名。别名在别名中描述。
下一篇:Special Builtins,上一篇:Bash Builtins,Up:Shell Builtin命令 [ 目录 ] [ 索引 ]
4.3修改Shell行为
• Set Builtin: | 更改shell属性和位置参数的值。 | |
• Shopt Builtin: | 修改shell可选行为。 |
下一篇:Shopt Builtin,Up:修改Shell行为 [ 目录 ] [ 索引 ]
4.3.1 Set Builtin
这个内置是如此复杂,它应该有自己的部分。 set
允许您更改shell选项的值并设置位置参数,或显示shell变量的名称和值。
set
-
设置[--abefhkmnptuvxBCEHPT] [-o 选项名称 ] [ 参数 ...] 设置[+ abefhkmnptuvxBCEHPT] [+ o 选项名称 ] [ 参数 ...]
如果未提供任何选项或参数,则
set
显示所有shell变量和函数的名称和值,并根据当前区域设置进行排序,格式可以重复用作设置或重置当前设置变量的输入。只读变量无法重置。在POSIX模式下,仅列出shell变量。提供选项时,它们会设置或取消设置shell属性。选项(如果指定)具有以下含义:
-a
-
创建或修改的每个变量或函数都将获得导出属性,并标记为导出到后续命令的环境。
-b
-
导致立即报告已终止后台作业的状态,而不是在打印下一个主要提示之前报告。
-e
-
如果管道(请参阅管道)(可能包含单个简单命令(请参阅简单命令)),列表(请参阅列表)或复合命令(请参阅复合命令)返回非零状态,请立即退出。如果失败的命令是紧跟在一个
while
或一个until
关键字之后的命令列表的一部分,一个if
语句中的测试的一部分,在一个&&
或||
列表中执行的任何命令的一部分,除了最后一个命令之外的命令,&&
或者||
任何命令之后,shell都不会退出管道但最后一个,或者如果命令的返回状态被反转!
。如果子shell以外的复合命令返回非零状态,因为命令失败-e被忽略了,shell没有退出。ERR
如果设置了陷阱,则在shell退出之前执行。此选项分别适用于shell环境和每个子shell环境(请参阅命令执行环境),并可能导致子shell在执行子shell中的所有命令之前退出。
如果复合命令或shell函数在上下文中执行 -e 被忽略,复合命令或函数体内执行的命令都不会受到影响 -e 设置,即使 -e已设置,命令返回失败状态。如果复合命令或shell函数设置-e 在上下文中执行时 -e 被忽略,在复合命令或包含函数调用的命令完成之前,该设置将不起作用。
-f
-
禁用文件名扩展(通配)。
-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模式)。这是为了使Bash表现为该标准的严格超集。
privileged
-
与...相同
-p
。 verbose
-
与...相同
-v
。 vi
-
使用
vi
样式线编辑界面。这也会影响用于的编辑界面read -e
。 xtrace
-
与...相同
-x
。
-p
-
打开特权模式。在这种模式下,
$BASH_ENV
并且$ENV
文件不被处理,shell函数不会从环境中继承,和SHELLOPTS
,BASHOPTS
,CDPATH
和GLOBIGNORE
变量,如果它们出现在环境中,被忽略。如果shell启动时有效用户(组)id不等于真实用户(组)id,那么-p未提供选项,将执行这些操作,并将有效用户标识设置为实际用户标识。如果-p启动时提供选项,不重置有效用户ID。关闭此选项会导致有效的用户和组ID设置为真实用户和组ID。 -t
-
读取并执行一个命令后退出。
-u
-
处理除特殊参数以外的未设置变量和参数@' 要么 '*'执行参数扩展时出错。将向标准错误写入错误消息,并退出非交互式shell。
-v
-
在读取时打印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 /本地/ SYS 然后:
$ cd / usr / sys; echo $ PWD 在/ usr / SYS $ cd ..; PWD 在/ usr
如果
set -P
打开,则:$ cd / usr / sys; echo $ PWD 在/ usr /本地/ SYS $ cd ..; PWD 在/ usr /本地
-T
-
如果设置,则在子shell环境中执行的shell函数,命令替换和命令继承
DEBUG
并RETURN
继承任何陷阱。在DEBUG
和RETURN
陷阱通常不会在这种情况下继承。 --
-
如果此选项后面没有参数,则取消设置位置参数。否则,位置参数被设置为 参数,即使它们中的一些以''开头- ”。
-
-
发出选项结束信号,将所有剩余参数分配给位置参数。该-X 和 -v 选项已关闭。如果没有参数,则位置参数保持不变。
使用'+' 而不是 '- '导致这些选项被关闭。这些选项也可以在调用shell时使用。可以在中找到当前的选项集
$-
。剩余的N 的参数是位置参数和被分配,在顺序来
$1
,$2
...$N
。特殊参数#
设置为N.除非提供了无效选项,否则返回状态始终为零。
上一页:Set Builtin,Up:修改Shell行为 [ 目录 ] [ 索引 ]
4.3.2 Shopt Builtin
此内置允许您更改其他shell可选行为。
shopt
-
shopt [-pqsu] [-o] [ optname ...]
切换控制可选shell行为的设置值。设置可以是下面列出的设置,或者,如果是 -o 使用选项,可用的选项 -o
set
内置命令的 选项(请参阅Set Builtin)。没有选择,或与-p选项,显示所有可设置选项的列表,并指示是否已设置每个选项。该-p选项导致输出以可以重复用作输入的形式显示。其他选项具有以下含义:-s
-
启用(设置)每个optname。
-u
-
禁用(取消设置)每个optname。
-q
-
抑制正常输出; 返回状态指示是设置还是取消设置optname。如果给出了多个optname参数-q,如果启用了所有optnames,则返回状态为零; 否则为非零。
-o
-
将optname的值限制为为其定义的值 -o
set
内置选项 (参见Set Builtin)。
如果是 -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
-
如果置位,击在每个命令之后检查窗口的大小和,如果需要的话,更新的值
LINES
和COLUMNS
。 cmdhist
-
如果设置,Bash会尝试在同一历史记录条目中保存多行命令的所有行。这样可以轻松地重新编辑多行命令。
compat31
-
如果设置,Bash将其行为更改为版本3.1的行为,相对于条件命令的引用参数'=〜'运算符和使用
[[
条件命令时的特定于语言环境的字符串比较'<'和'>'运营商。bash-4.1之前的Bash版本使用ASCII排序规则和strcmp(3); bash-4.1及更高版本使用当前语言环境的归类序列和strcoll(3)。 compat32
-
如果设置,当使用
[[
条件命令'' 时,Bash将其行为更改为版本3.2的行为与特定于语言环境的字符串比较<'和'>'运算符(参见上一项)和中断命令列表的效果。由于中断,Bash版本3.2及更早版本在一个终止后继续执行列表中的下一个命令。 compat40
-
如果设置,当使用
[[
条件命令' 时,Bash将其行为更改为版本4.0的行为与特定于语言环境的字符串比较<'和'>'运算符(参见描述compat31
)和中断命令列表的效果。Bash版本4.0及更高版本会中断列表,就好像shell收到了中断一样; 以前的版本继续使用列表中的下一个命令。 compat41
-
如果设置,Bash,当处于POSIX模式时,将双引号参数扩展中的单引号视为特殊字符。单引号必须匹配(偶数),并且单引号之间的字符被视为引用。这是POSIX模式到4.1版的行为。默认的Bash行为与以前的版本一样。
compat42
-
如果设置,Bash不会使用引用删除处理模式替换字扩展中的替换字符串。
compat43
-
如果设置,如果尝试使用带引号的复合数组赋值作为参数,Bash不会打印警告消息
declare
,使单词扩展错误导致当前命令失败的非致命错误(默认行为是使它们成为导致shell退出的致命错误,并且在执行shell函数时不会重置循环状态(这允许break
或continue
在shell函数中影响调用者上下文中的循环)。 complete_fullquote
-
如果设置,Bash在执行完成时引用文件名和目录名中的所有shell元字符。如果未设置,当这些元字符出现在要完成的单词的shell变量引用中时,Bash将从将在完整文件名中引用的字符集中删除元字符,例如美元符号。这意味着不会引用扩展到目录的变量名中的美元符号; 但是,文件名中出现的任何美元符号也不会被引用。仅当bash使用反斜杠引用已完成的文件名时,此选项才有效。此变量默认设置,这是4.2版本中的默认Bash行为。
direxpand
-
如果设置,Bash会在执行文件名完成时将目录名替换为单词扩展的结果。这会更改readline编辑缓冲区的内容。如果未设置,Bash会尝试保留用户键入的内容。
dirspell
-
如果设置,如果最初提供的目录名不存在,Bash会在字完成期间尝试对目录名进行拼写更正。
dotglob
-
如果设置,Bash包含以'。'开头的文件名。在文件名扩展的结果。
execfail
-
如果设置了此项,则如果无法执行指定为
exec
builtin命令的参数的文件,则非交互式shell将不会退出。如果exec
失败,交互式shell不会退出。 expand_aliases
-
如果设置,则别名将按照下面的“别名”,“ 别名”中的说明进行扩展 。对于交互式shell,默认情况下启用此选项。
extdebug
-
如果设置为shell调用,则安排在shell启动之前执行调试器配置文件,与之相同 --debugger选项。如果在调用后设置,则启用供调试器使用的行为:
- 该 -F
declare
内置选项(参见Bash Builtins)显示与作为参数提供的每个函数名对应的源文件名和行号。 - 如果
DEBUG
陷阱运行的命令返回非零值,则跳过下一个命令而不执行。 - 如果
DEBUG
陷阱运行的命令返回值2,并且shell正在子例程(shell函数或由.
或者内部函数执行的shell脚本)中执行source
,则shell模拟对其的调用return
。 BASH_ARGC
并按BASH_ARGV
其描述中的描述进行更新(请参阅Bash变量)。- 启用了函数跟踪:命令替换,shell函数和通过继承 和陷阱调用的子shell 。
( command )
DEBUG
RETURN
- 启用了错误跟踪:命令替换,shell函数和通过继承 陷阱调用的子shell 。
( command )
ERR
- 该 -F
extglob
-
如果设置,则启用上述扩展模式匹配功能(请参阅模式匹配)。
extquote
-
如果设置,并且加引号内执行双引号括起来的扩展。默认情况下启用此选项。
$'string'
$"string"
${parameter}
failglob
-
如果设置,则在文件名扩展期间无法匹配文件名的模式会导致扩展错误。
force_fignore
-
如果设置,则
FIGNORE
shell变量指定的后缀会导致在执行单词完成时忽略单词,即使忽略的单词是唯一可能的完成。有关描述,请参阅Bash变量FIGNORE
。默认情况下启用此选项。 globasciiranges
-
如果设置,模式匹配括号表达式中使用的范围表达式(请参阅模式匹配)在执行比较时的行为就像在传统的C语言环境中一样。也就是说,不考虑当前区域设置的整理顺序,因此'b'不会整理'一个'和'乙',大写和小写的ASCII字符将整理在一起。
globstar
-
如果设置,模式'**'在文件名扩展上下文中使用将匹配所有文件以及零个或多个目录和子目录。如果模式后跟''/',只有目录和子目录匹配。
gnu_errfmt
-
如果设置,则shell错误消息以标准GNU错误消息格式写入。
histappend
-
如果设置,则
HISTFILE
在shell退出时,历史列表将附加到由变量值指定的文件中,而不是覆盖文件。 histreedit
-
如果设置,并且正在使用Readline,则用户有机会重新编辑失败的历史记录替换。
histverify
-
如果设置,并且正在使用Readline,则历史替换的结果不会立即传递给shell解析器。相反,生成的行被加载到Readline编辑缓冲区中,允许进一步修改。
hostcomplete
-
如果设置,并且正在使用Readline,当包含'的单词时,Bash将尝试执行主机名完成@'正在完成(参见完成命令)。默认情况下启用此选项。
huponexit
-
如果设置,Bash将
SIGHUP
在交互式登录shell退出时发送到所有作业(请参阅信号)。 inherit_errexit
-
如果设置,命令替换将继承
errexit
选项的值,而不是在子shell环境中取消设置。启用POSIX模式时启用此选项。 interactive_comments
-
允许以''开头的单词#'使该单词和该行上的所有剩余字符在交互式shell中被忽略。默认情况下启用此选项。
lastpipe
-
如果设置,并且作业控制未激活,则shell将运行当前shell环境中未在后台执行的管道的最后一个命令。
lithist
-
如果启用,并且启用该
cmdhist
选项,则多行命令将保存到具有嵌入换行符的历史记录中,而不是尽可能使用分号分隔符。 login_shell
-
如果shell作为登录shell启动,则shell会设置此选项(请参阅调用Bash)。该值可能不会更改。
mailwarn
-
如果设置,并且自上次检查以来已访问Bash正在检查邮件的文件,则会显示该消息 。
"The mail in mailfile has been read"
no_empty_cmd_completion
-
如果设置,并且正在使用Readline,
PATH
则在空行尝试完成时,Bash将不会尝试搜索可能的完成。 nocaseglob
-
如果设置,Bash在执行文件名扩展时以不区分大小写的方式匹配文件名。
nocasematch
-
如果设置,Bash在执行匹配时执行
case
或[[
条件命令,执行模式替换字扩展时,或者在可编程完成时过滤可能的完成时,以不区分大小写的方式匹配模式。 nullglob
-
如果设置,Bash允许不匹配任何文件的文件名模式扩展为空字符串,而不是自己。
progcomp
-
如果置位,则启用可编程完成功能(参见可编程完成)。默认情况下启用此选项。
promptvars
-
如果设置,则在如下所述进行扩展后,提示字符串将进行参数扩展,命令替换,算术扩展和引用删除(请参阅控制提示)。默认情况下启用此选项。
restricted_shell
-
如果以受限模式启动,shell将设置此选项(请参阅受限制的Shell)。该值可能不会更改。执行启动文件时不会重置此项,允许启动文件发现shell是否受限制。
shift_verbose
-
如果设置了此项,则
shift
当移位计数超过位置参数的数量时,内置程序将输出错误消息。 sourcepath
-
如果设置,
source
内置命令使用值PATH
来查找包含作为参数提供的文件的目录。默认情况下启用此选项。 xpg_echo
-
如果设置,
echo
内置函数默认会扩展反斜杠转义序列。
如果 启用了所有optnames,则列出选项时的返回状态为零,否则为非零。设置或取消设置选项时,除非optname不是有效的shell选项,否则返回状态为零 。
4.4特殊建筑物
由于历史原因,POSIX标准已将几个内置命令分类为特殊命令。当Bash在POSIX模式下执行时,特殊内置命令在三个方面与其他内置命令不同:
- 在命令查找期间,在shell函数之前找到特殊内置函数。
- 如果特殊内置函数返回错误状态,则退出非交互式shell。
- 命令之前的赋值语句在命令完成后在shell环境中保持有效。
当Bash没有在POSIX模式下执行时,这些内置行为与其他Bash内置命令没有什么不同。Bash POSIX模式在Bash POSIX模式中描述。
这些是POSIX特殊内置:
休息:。继续eval exec退出导出只读返回设置 移位陷阱未设置
下一篇:Bash功能,上一篇:Shell Builtin命令,上一页:顶部 [ 目录 ] [ 索引 ]
5壳变量
• Bourne Shell变量: | Bash使用的变量与Bourne Shell的使用方式相同。 | |
• Bash变量: | Bash中存在的变量列表。 |
本章描述了Bash使用的shell变量。Bash会自动为多个变量分配默认值。
5.1 Bourne Shell变量
Bash以与Bourne shell相同的方式使用某些shell变量。在某些情况下,Bash会为变量分配默认值。
CDPATH
-
以冒号分隔的目录列表,用作
cd
内置命令的搜索路径。 HOME
-
当前用户的主目录;
cd
内置命令的默认值。此变量的值也用于波浪扩展(参见Tilde Expansion)。 IFS
-
分隔字段的字符列表; 当shell将单词拆分为扩展的一部分时使用。
MAIL
-
如果此参数设置为文件名或目录名并且
MAILPATH
未设置该变量,则Bash会通知用户邮件到达指定文件或Maildir格式目录。 MAILPATH
-
由冒号分隔的文件名列表,shell定期检查新邮件。每个列表条目都可以指定新邮件到达邮件文件时打印的邮件,方法是将文件名与邮件分隔为'?”。在消息文本中使用时,
$_
展开到当前邮件文件的名称。 OPTARG
-
getopts
内置处理的最后一个选项参数的值。 OPTIND
-
getopts
内置处理的最后一个选项参数的索引。 PATH
-
以冒号分隔的目录列表,其中shell查找命令。值中的零长度(空)目录名称
PATH
表示当前目录。空目录名称可以显示为两个相邻的冒号,或者作为初始冒号或尾随冒号。 PS1
-
主要提示字符串。默认值为'\ S-符\ v \ $ ”。有关在显示之前展开的转义序列的完整列表,请参阅控制提示
PS1
。 PS2
-
辅助提示字符串。默认值为'> ”。
上一篇:Bourne Shell变量,Up:Shell变量 [ 目录 ] [ 索引 ]
5.2 Bash变量
这些变量由Bash设置或使用,但其他shell通常不会特别对它们进行处理。
Bash使用的一些变量在不同的章节中描述:用于控制作业控制设施的变量(参见作业控制变量)。
BASH
-
用于执行Bash当前实例的完整路径名。
BASHOPTS
-
以冒号分隔的已启用shell选项列表。列表中的每个单词都是有效的参数-s
shopt
内置命令的选项 (请参阅Shopt Builtin)。出现的选项BASHOPTS
是报告为'上'by'禁用了javascript”。如果此变量在Bash启动时处于环境中,则在读取任何启动文件之前,将启用列表中的每个shell选项。这个变量是只读的。 BASHPID
-
扩展到当前Bash进程的进程ID。这与
$$
某些情况不同,例如不需要重新初始化Bash的子shell。 BASH_ALIASES
-
一个关联数组变量,其成员对应于由
alias
内置程序维护的内部别名列表。(参见Bourne Shell Builtins)。添加到此数组的元素将显示在别名列表中; 但是,取消设置数组元素当前不会导致从别名列表中删除别名。如果BASH_ALIASES
未设置,它将失去其特殊属性,即使它随后被重置。 BASH_ARGC
-
一个数组变量,其值是当前bash执行调用堆栈的每个帧中的参数数。当前子例程的参数数量(使用
.
或执行的shell函数或脚本source
)位于堆栈的顶部。执行子程序时,会传递传递的参数数量BASH_ARGC
。shellBASH_ARGC
仅在扩展调试模式下设置(有关内置extdebug
选项 的说明,请参阅Shopt Builtinshopt
)。 BASH_ARGV
-
包含当前bash执行调用堆栈中所有参数的数组变量。最后一个子程序调用的最后一个参数位于堆栈的顶部; 初始调用的第一个参数位于底部。执行子程序时,将提供所提供的参数
BASH_ARGV
。shellBASH_ARGV
仅在扩展调试模式下设置(有关内置extdebug
选项 的说明,请参阅Shopt Builtinshopt
)。 BASH_CMDS
-
一个关联数组变量,其成员对应于由内置函数维护的命令的内部哈希表
hash
(请参阅Bourne Shell Builtins)。添加到此数组的元素显示在哈希表中; 但是,取消设置数组元素当前不会导致从哈希表中删除命令名称。如果BASH_CMDS
未设置,它将失去其特殊属性,即使它随后被重置。 BASH_COMMAND
-
当前正在执行或即将执行的命令,除非shell正在执行作为陷阱结果的命令,在这种情况下,它是在陷阱时执行的命令。
BASH_COMPAT
-
该值用于设置shell的兼容级别。有关各种兼容性级别及其效果的说明,请参阅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]}
调用的行号(或者${BASH_LINENO[$i-1]}
在另一个shell函数中引用的行号)。使用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环境中增加1。初始值为0。
BASH_VERSINFO
-
一个只读数组变量(请参阅数组),其成员包含此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将写入''时生成的跟踪输出设置-x'启用该文件描述符。这允许将跟踪输出与诊断和错误消息分开。
BASH_XTRACEFD
未设置或分配新值时,文件描述符将关闭。取消设置BASH_XTRACEFD
或为其分配空字符串会导致跟踪输出发送到标准错误。请注意,设置BASH_XTRACEFD
为2(标准错误文件描述符)然后取消设置将导致标准错误被关闭。 CHILD_MAX
-
设置要记住的shell的已退出子状态值的数量。Bash不允许将此值降低到低于POSIX指令的最小值,并且有一个最大值(当前为8192),这可能不会超过。最小值取决于系统。
COLUMNS
-
select
打印选择列表时,命令用于确定终端宽度。如果checkwinsize
选项已启用(请参阅Shopt Builtin),或者在收到a时在交互式shell中 自动设置SIGWINCH
。 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
内置显示的顺序显示在堆栈中 。分配给此数组变量的成员可用于修改堆栈中已有的目录,但 必须使用pushd
和popd
builtins来添加和删除目录。对此变量的赋值不会更改当前目录。如果DIRSTACK
未设置,它将失去其特殊属性,即使它随后被重置。 EMACS
-
当shell以值''开头时,Bash在环境中找到此变量Ť',它假定shell在Emacs shell缓冲区中运行并禁用行编辑。
ENV
-
类似于
BASH_ENV
; 在POSIX模式下调用shell时使用 (请参阅Bash POSIX模式)。 EUID
-
当前用户的数字有效用户ID。这个变量是只读的。
EXECIGNORE
-
以冒号分隔的shell模式列表(请参阅模式匹配),用于定义要使用命令搜索忽略的文件名列表
PATH
。完整路径名与这些模式之一匹配的文件不会被视为可执行文件,以便通过PATH
查找完成和执行命令。这不会影响的行为[
,test
和[[
命令。命令哈希表中的完整路径名不受影响EXECIGNORE
。使用此变量可忽略具有可执行位设置但不是可执行文件的共享库文件。模式匹配遵循extglob
shell选项的设置。 FCEDIT
-
编辑器用作默认值 -e
fc
内置命令的选项。 FIGNORE
-
执行文件名完成时要忽略的以冒号分隔的后缀列表。后缀与其中一个条目
FIGNORE
匹配的文件名从匹配的文件名列表中排除。样本值是'的.o:〜“ FUNCNAME
-
一个数组变量,包含当前在执行调用堆栈中的所有shell函数的名称。索引为0的元素是当前正在执行的shell函数的名称。最底部的元素(索引最高的元素)是
"main"
。此变量仅在执行shell函数时存在。作业FUNCNAME
无效。如果FUNCNAME
未设置,它将失去其特殊属性,即使它随后被重置。此变量可以与
BASH_LINENO
和一起使用BASH_SOURCE
。每个元素FUNCNAME
都有相应的元素BASH_LINENO
和BASH_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
-
如果设置此变量且不为null,则其值将用作strftime的格式字符串,以打印与
history
内置显示的每个历史记录条目关联的时间戳。如果设置了此变量,则会将时间戳记写入历史记录文件,以便可以跨shell会话保留它们。这使用历史注释字符来区分时间戳与其他历史记录行。 HOSTFILE
-
包含与其格式相同的文件名 / etc / hosts文件当shell需要完成主机名时应该读取。shell运行时可能会更改可能的主机名完成列表; 下次在更改值后尝试完成主机名时,Bash会将新文件的内容添加到现有列表中。如果
HOSTFILE
设置但没有值,或者没有命名可读文件,Bash会尝试读取 / etc / hosts文件获取可能的主机名完成列表。何时HOSTFILE
取消设置,将清除主机名列表。 HOSTNAME
-
当前主机的名称。
HOSTTYPE
-
描述正在运行Bash的机器的字符串。
IGNOREEOF
-
控制shell在接收
EOF
角色作为唯一输入时的操作。如果设置,则该值表示EOF
在shell退出之前可以作为输入行上的第一个字符读取的连续字符数。如果变量存在但没有数值(或没有值),则默认值为10.如果变量不存在,则EOF
表示shell的输入结束。这仅对交互式shell有效。 INPUTRC
-
Readline初始化文件的名称,覆盖默认值 〜/ .inputrc文件。
LANG
-
用于确定未使用以变量开头的具体选择的任何类别的区域设置类别
LC_
。 LC_ALL
-
此变量将覆盖指定区域设置类别的值
LANG
和任何其他LC_
变量。 LC_COLLATE
-
此变量确定排序文件名扩展结果时使用的归类顺序,并确定范围表达式,等价类和归类序列在文件名扩展和模式匹配中的行为(请参阅文件名扩展)。
LC_CTYPE
-
此变量确定字符串的解释以及文件名扩展和模式匹配中字符类的行为(请参阅文件名扩展)。
LC_MESSAGES
-
此变量确定用于翻译双引号字符串的区域设置,前面带有''$'(见区域翻译)。
LC_NUMERIC
-
此变量确定用于数字格式的区域设置类别。
LC_TIME
-
此变量确定用于数据和时间格式的区域设置类别。
LINENO
-
当前正在执行的脚本或shell函数中的行号。
LINES
-
由
select
命令用于确定打印选择列表的列长度。如果checkwinsize
选项已启用(请参阅Shopt Builtin),或者在收到a时在交互式shell中 自动设置SIGWINCH
。 MACHTYPE
-
一个字符串,以标准GNU cpu-company-system格式完整描述执行Bash的系统类型。
MAILCHECK
-
shell应该多久(以秒为单位)检查
MAILPATH
或MAIL
变量中指定的文件中的邮件。默认值为60秒。当需要检查邮件时,shell会在显示主要提示之前执行此操作。如果未设置此变量,或将该值设置为大于或等于零的数值,则shell将禁用邮件检查。 MAPFILE
-
创建一个数组变量,用于
mapfile
在未提供变量名时保存内置函数读取的文本 。 OLDPWD
-
由
cd
builtin 设置的上一个工作目录。 OPTERR
-
如果设置为值1,Bash将显示由
getopts
builtin命令生成的错误消息。 OSTYPE
-
描述正在运行Bash操作系统的字符串。
PIPESTATUS
-
一个数组变量(请参阅Arrays),其中包含最近执行的前台管道(可能只包含一个命令)中的进程的退出状态值列表。
POSIXLY_CORRECT
-
如果此变量在Bash启动时处于环境中,则shell会在读取启动文件之前进入POSIX模式(请参阅Bash POSIX模式),就像--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选项已设置(请参阅Set Builtin)。
PS4
必要时,第一个字符被多次复制,以指示多个间接级别。默认为'+ ”。 PWD
-
由
cd
内置设置的当前工作目录。 RANDOM
-
每次引用此参数时,都会生成0到32767之间的随机整数。为此变量赋值可以为随机数生成器提供种子。
READLINE_LINE
-
Readline行缓冲区的内容,用于'绑定-x'(见Bash Builtins)。
READLINE_POINT
-
Readline行缓冲区中插入点的位置,用于'绑定-x'(见Bash Builtins)。
REPLY
-
read
内置的默认变量。 SECONDS
-
此变量扩展为自shell启动以来的秒数。对此变量的赋值会将计数重置为指定的值,并且展开的值将成为指定的值加上自分配以来的秒数。
SHELL
-
shell的完整路径名保存在此环境变量中。如果在shell启动时未设置它,Bash会为其分配当前用户的登录shell的完整路径名。
SHELLOPTS
-
以冒号分隔的已启用shell选项列表。列表中的每个单词都是有效的参数-o
set
内置命令的选项 (请参阅Set Builtin)。出现的选项SHELLOPTS
是报告为'上'by'设置-o”。如果此变量在Bash启动时处于环境中,则在读取任何启动文件之前,将启用列表中的每个shell选项。这个变量是只读的。 SHLVL
-
每次启动Bash的新实例时增加1。这是为了计算嵌套Bash shell的深度。
TIMEFORMAT
-
此参数的值用作格式字符串,指定
time
应如何显示前缀为保留字的管道的时序信息。''%'character引入了一个转义为时间值或其他信息的转义序列。逃逸序列及其含义如下; 括号表示可选部分。%%
-
文字'%”。
%[p][l]R
-
以秒为单位的经过时间。
%[p][l]U
-
在用户模式下花费的CPU秒数。
%[p][l]S
-
系统模式下花费的CPU秒数。
%P
-
CPU百分比,计算为(%U +%S)/%R。
可选p是指定精度的数字,小数点后的小数位数。值0表示不输出小数点或小数。最多可以指定小数点后的三个位置; p大于3的值更改为3.如果未指定p,则使用值3。
可选项
l
指定MM m SS格式的较长格式,包括分钟。FF s。p的值确定是否包括该分数。如果未设置此变量,则Bash就像具有该值一样
$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'
如果该值为null,则不显示任何计时信息。显示格式字符串时,将添加尾随换行符。
TMOUT
-
如果设置为大于零的值,
TMOUT
则将其视为read
内置的默认超时(请参阅Bash Builtins)。的select
命令(见条件结构,如果输入不之后到达)终止TMOUT
时输入来自终端秒。在交互式shell中,该值被解释为在发出主提示后等待输入行的秒数。如果完整的输入行没有到达,Bash会在等待该秒数后终止。
TMPDIR
-
如果设置,Bash将其值用作Bash为shell使用创建临时文件的目录的名称。
UID
-
当前用户的数字真实用户ID。这个变量是只读的。
6 Bash功能
本章介绍Bash独有的功能。
• 调用Bash: | 您可以为Bash提供的命令行选项。 | |
• Bash启动文件: | Bash何时以及如何执行脚本。 | |
• 交互式壳: | 什么是交互式shell。 | |
• Bash条件表达式: | 用于构建test 内置表达式的基元。 |
|
• 壳算术: | 关于shell变量的算法。 | |
• 别名: | 将一个命令替换为另一个命令。 | |
• 数组: | 数组变量。 | |
• 目录堆栈: | 访问目录的历史记录。 | |
• 控制提示: | 自定义各种提示字符串。 | |
• 受限制的外壳: | 一种更受控制的shell执行模式。 | |
• Bash POSIX模式: | 使Bash的行为更接近POSIX标准指定的行为。 |
6.1调用Bash
bash [long-opt] [-ir] [-abefhkmnptuvxdBCDHP] [-o option ] [-O shopt_option ] [ 参数 ...] bash [long-opt] [-abefhkmnptuvxdBCDHP] [-o option ] [-O shopt_option ] -c string [ argument ...] bash [long-opt] -s [-abefhkmnptuvxdBCDHP] [-o option ] [-O shopt_option ] [ 参数 ...]
内置函数使用的所有单字符选项set
(请参阅Set Builtin)可以在调用shell时用作选项。此外,您还可以使用多个多字符选项。在要识别单字符选项之前,这些选项必须出现在命令行上。
--debugger
-
安排在shell启动之前执行调试器配置文件。打开扩展调试模式(有关内置
extdebug
选项 的说明,请参阅Shopt Builtinshopt
)。 --dump-po-strings
-
所有双引号字符串的列表,前面是'$'以GNU
gettext
PO(便携式对象)文件格式打印在标准输出上。相当于-D 除了输出格式。 --dump-strings
-
相当于 -D。
--help
-
在标准输出上显示用法消息并成功退出。
--init-file filename
--rcfile filename
-
从文件名执行命令(而不是在〜/ .bashrc)在交互式shell中。
--login
-
相当于 -l。
--noediting
-
当shell是交互式时,不要使用GNU Readline库(请参阅命令行编辑)来读取命令行。
--noprofile
-
不要加载系统范围的启动文件 / etc / profile文件 或任何个人初始化文件 在〜/ .bash_profile, 〜/ .bash_login文件, 要么 〜/ .profile文件 当Bash被调用为登录shell时。
--norc
-
别读了 在〜/ .bashrc交互式shell中的初始化文件。如果调用shell,则默认情况下处于启用状态
sh
。 --posix
-
更改Bash的行为,其中默认操作与POSIX标准不同,以匹配标准。这是为了使Bash表现为该标准的严格超集。见击POSIX模式,对于击的描述 POSIX模式。
--restricted
-
使shell成为受限shell(请参阅The Restricted Shell)。
--verbose
-
相当于 -v。打印shell输入行,因为它们被读取。
--version
-
在标准输出上显示此Bash实例的版本信息并成功退出。
调用时可能提供了几个单字符选项,这些选项在set
内置函数中不可用。
-c
-
从第一个非选项参数command_string中读取并执行命令 ,然后退出。如果command_string之后有参数,则分配第一个参数,
$0
并将任何剩余参数分配给位置参数。用于$0
设置shell名称的赋值,用于警告和错误消息。 -i
-
强制shell以交互方式运行。Interactive Shell中描述了交互式shell。
-l
-
使此shell的行为就像登录直接调用一样。当shell是交互式的时,这相当于用'启动登录shell'exec -l bash”。当shell不是交互式时,将执行登录shell启动文件。“exec bash -l' 要么 'exec bash --login'将用Bash登录shell替换当前的shell。有关登录shell的特殊行为的说明,请参阅Bash启动文件。
-r
-
使shell成为受限shell(请参阅The Restricted Shell)。
-s
-
如果存在此选项,或者在选项处理后没有参数,则从标准输入读取命令。此选项允许在调用交互式shell时设置位置参数。
-D
-
所有双引号字符串的列表,前面是'$'打印在标准输出上。当前区域设置不是
C
或时,这些是受语言翻译影响的字符串POSIX
(请参阅区域设置翻译)。这意味着-n选项; 没有命令会被执行。 [-+]O [shopt_option]
-
shopt_option是
shopt
内置接受的shell选项之一 (参见The Shopt Builtin)。如果shopt_option存在,-O 设置该选项的值; + O取消它。如果未提供shopt_option,则接受的shell选项的名称和值shopt
将打印在标准输出上。如果调用选项是+ O,输出以可重复用作输入的格式显示。 --
-
A
--
表示选项结束并禁用进一步的选项处理。之后的任何参数--
都被视为文件名和参数。
甲登录壳是其自变量的第一个字符是零'- '或者用一个调用的 - 登录 选项。
一个交互式的 shell,是一个启动时没有指定非选项参数,除非-s 指定,不指定 -C选项,其输入和输出都连接到终端(由确定isatty(3)
),或者以-一世选项。有关详细信息,请参阅交互式外壳。
如果参数处理后参数仍然存在,那么两者都没有 -C 也不是 -s 如果提供了选项,则假定第一个参数是包含shell命令的文件的名称(请参阅Shell脚本)。以这种方式调用Bash时,$0
将设置为文件名,并将位置参数设置为其余参数。Bash从该文件中读取并执行命令,然后退出。Bash的退出状态是脚本中执行的最后一个命令的退出状态。如果未执行任何命令,则退出状态为0。
6.2 Bash启动文件
本节介绍Bash如何执行其启动文件。如果存在任何文件但无法读取,则Bash报告错误。如上所述,在Tilde Expansion中,Tildes以文件名扩展(参见Tilde Expansion)。
Interactive Shell中描述了交互式shell。
作为交互式登录shell调用,或者使用 - 登录
当Bash作为交互式登录shell调用时,或作为非交互式shell调用时 - 登录 选项,它首先从文件中读取并执行命令 / etc / profile文件,如果该文件存在。在阅读该文件后,它会查找在〜/ .bash_profile, 〜/ .bash_login文件,和 〜/ .profile文件按此顺序,从第一个存在且可读的命令读取和执行命令。该--noprofile 启动shell以禁止此行为时可以使用选项。
当交互式登录shell退出,或者非交互式登录shell执行exit
内置命令时,Bash从文件中读取并执行命令〜/ .bash_logout中,如果它存在。
作为交互式非登录shell调用
当启动不是登录shell的交互式shell时,Bash会从中读取并执行命令 在〜/ .bashrc,如果该文件存在。这可以通过使用来抑制--norc选项。该--rcfile 文件选项将强制Bash从文件中读取和执行命令而不是在〜/ .bashrc。
所以,通常,你的 在〜/ .bash_profile 包含该行
if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
在任何特定于登录的初始化之后(或之前)。
以非交互方式调用
例如,当以非交互方式启动Bash以运行shell脚本时,它会BASH_ENV
在环境中查找变量,如果它出现在那里则展开其值,并使用展开的值作为要读取和执行的文件的名称。Bash的行为就像执行了以下命令一样:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
但是PATH
变量的值不用于搜索文件名。
如上所述,如果使用调用非交互式shell - 登录 选项,Bash尝试从登录shell启动文件中读取和执行命令。
用名称调用 sh
如果使用名称调用Bash sh
,它会尝试尽可能地模仿历史版本的启动行为sh
,同时也符合POSIX标准。
当作为交互式登录shell调用时,或者作为非交互式shell调用时 - 登录 选项,它首先尝试从中读取和执行命令 / etc / profile文件 和 〜/ .profile文件, 以该顺序。该--noprofile选项可用于抑制此行为。当作为具有名称的交互式shell调用时sh
,Bash查找变量ENV
,如果已定义则展开其值,并使用展开的值作为要读取和执行的文件的名称。由于调用的shell sh
不会尝试从任何其他启动文件读取和执行命令,因此--rcfile选项无效。使用该名称调用的非交互式shell sh
不会尝试读取任何其他启动文件。
调用时sh
,Bash 在读取启动文件后进入POSIX模式。
在POSIX模式下调用
当Bash以POSIX模式启动时,与 --posix命令行选项,它遵循启动文件的POSIX标准。在此模式下,交互式shell将扩展ENV
变量,并从名称为扩展值的文件中读取和执行命令。没有读取其他启动文件。
由远程shell守护程序调用
Bash尝试确定何时将其标准输入连接到网络连接,如通常由远程shell守护程序rshd
或安全shell守护程序执行sshd
。如果Bash确定它以这种方式运行,它将从中读取并执行命令在〜/ .bashrc,如果该文件存在且可读。如果调用为,则不会执行此操作sh
。该--norc 选项可用于抑制此行为,并且 --rcfileoption可用于强制读取另一个文件,但通常也rshd
不会sshd
使用这些选项调用shell或允许指定它们。
不等有效和实时调用的UID / GID小号
如果Bash以有效用户(组)id不等于真实用户(组)id而启动,并且 -p选择不提供,不启动文件被读取,shell函数不会从环境中继承,在SHELLOPTS
,BASHOPTS
,CDPATH
,和GLOBIGNORE
变量,如果它们出现在环境中,被忽略,有效用户ID设置为实际用户ID。如果-p 选项在调用时提供,启动行为相同,但不重置有效用户ID。
6.3交互式壳
• 什么是Interactive Shell?: | 是什么决定了shell是否是Interactive。 | |
• 这是Shell Interactive吗?: | 如何判断shell是否是交互式的。 | |
• 交互式Shell行为: | 交互式shell中有什么变化? |
下一篇:这是Shell Interactive吗?,上:互动壳 [ 目录 ] [ 索引 ]
6.3.1什么是Interactive Shell?
交互式shell是在没有非选项参数的情况下启动的,除非 -s 指定,不指定 -C选项,其输入和错误输出都连接到终端(由确定isatty(3)
),或者以-一世 选项。
交互式shell通常从用户终端读取和写入。
该 -s 调用选项可用于在启动交互式shell时设置位置参数。
Next:Interactive Shell Behavior,Previous:什么是Interactive Shell?,上:互动壳 [ 目录 ] [ 索引 ]
6.3.2这是Shell互动吗?
要在启动脚本中确定Bash是否以交互方式运行,请测试'的值- '特殊参数。它包含i
shell是交互式的。例如:
案例“$ - ”in * i *)echo这个shell是交互式的;; *)echo这个shell不是交互式的; ESAC
或者,启动脚本可以检查变量 PS1
; 它在非交互式shell中未设置,并在交互式shell中设置。从而:
如果[-z“$ PS1”]; 然后 echo这个shell不是交互式的 其他 echo这个shell是交互式的 科幻
上一篇:这是Shell Interactive吗?,上:互动壳 [ 目录 ] [ 索引 ]
6.3.3交互式Shell行为
当shell以交互方式运行时,它会以多种方式更改其行为。
- 按照Bash启动文件中的描述读取和执行启动文件。
- 默认情况下启用作业控制(请参阅作业控制)。当作业控制生效时,击忽略键盘产生的作业控制信号
SIGTTIN
,SIGTTOU
和SIGTSTP
。 - Bash
PS1
在读取命令的第一行之前进行扩展和显示,并PS2
在读取多行命令的第二行和后续行之前进行扩展和显示。BashPS0
在读取命令之后但在执行命令之前显示。 - Bash
PROMPT_COMMAND
在打印主提示符之前将该变量的值作为命令执行$PS1
(请参阅Bash变量)。 - Readline(参见命令行编辑)用于从用户终端读取命令。
- Bash检查
ignoreeof
选项的值,set -o
而不是EOF
在读取命令时收到标准输入时立即退出(请参阅Set Builtin)。 - 默认情况下启用命令历史记录(请参阅Bash历史记录设施)和历史记录扩展(请参阅历史记录交互)Bash会将命令历史记录保存到
$HISTFILE
启用了历史记录的shell退出时命名的文件。 - 默认情况下会执行别名扩展(请参阅别名)。
- 在没有任何陷阱的情况下,Bash忽略
SIGTERM
(参见信号)。 - 在没有任何陷阱的情况下,
SIGINT
捕获和处理((参见信号)。SIGINT
将中断一些shell内置。 SIGHUP
如果huponexit
已启用shell选项,则交互式登录shell会在退出时向所有作业发送(请参阅信号)。- 该 -n 调用选项被忽略,'设置-n'没有效果(参见Set Builtin)。
- bash将检查邮件定期,这取决于的值
MAIL
,MAILPATH
和MAILCHECK
shell变量(见bash的变量)。 - 在''之后引用未绑定的shell变量引起的扩展错误设置-u'已启用不会导致shell退出(请参阅Set Builtin)。
- 由于未设置var或在扩展中为null 而导致的扩展错误,shell不会退出(请参阅Shell参数扩展)。
${var:?word}
- shell builtins遇到的重定向错误不会导致shell退出。
- 在POSIX模式下运行时,返回错误状态的特殊内置函数不会导致shell退出(请参阅Bash POSIX模式)。
- 失败
exec
不会导致shell退出(请参阅Bourne Shell Builtins)。 - 分析器语法错误不会导致shell退出。
- 对于目录参数简单拼写校正
cd
内置默认启用(见的描述cdspell
选项将shopt
在内置shopt内建)。 TMOUT
如果在打印后的指定秒数内未读取命令,shell将检查变量的值并退出$PS1
(请参阅Bash变量)。
6.4 Bash条件表达式
[[
复合命令和test
和[
内置命令使用条件表达式。
表达式可以是一元或二元的。一元表达式通常用于检查文件的状态。还有字符串运算符和数字比较运算符。Bash在表达式中使用它们时会处理多个文件名。如果正在运行Bash的操作系统提供这些特殊文件,Bash将使用它们; 否则它将在内部使用此行为模拟它们:如果其中一个原色的文件参数是形式 / dev / fd / N.,然后检查文件描述符N. 如果其中一个原色的文件参数是其中之一 的/ dev /标准输入, 的/ dev /标准输出, 要么 的/ dev /标准错误,检查文件描述符0,1或2。
与...一起使用时[[
,'<'和'>'运算符使用当前语言环境按字典顺序排序。该test
命令使用ASCII排序。
除非另有说明,否则对文件进行操作的原色遵循符号链接并在链接的目标上操作,而不是链接本身。
-a file
-
如果文件存在则为真。
-b file
-
如果文件存在则为真,并且是块特殊文件。
-c file
-
如果文件存在则为真,并且是字符特殊文件。
-d file
-
如果文件存在且为目录,则为True 。
-e file
-
如果文件存在则为真。
-f file
-
如果文件存在且为常规文件,则为True 。
-g file
-
如果文件存在且其set-group-id位已设置,则为True 。
-h file
-
如果文件存在且为符号链接,则为真。
-k file
-
如果文件存在且设置了“粘滞”位,则为真。
-p file
-
如果文件存在且为命名管道(FIFO),则为真。
-r file
-
如果文件存在且可读,则为真。
-s file
-
如果文件存在且大小大于零,则为真。
-t fd
-
如果文件描述符fd打开并且引用终端,则为True 。
-u file
-
如果文件存在且其set-user-id位已设置,则为True 。
-w file
-
如果文件存在且可写,则为True 。
-x file
-
如果文件存在且可执行,则为True 。
-G file
-
如果文件存在并且由有效组ID拥有,则为True 。
-L file
-
如果文件存在且为符号链接,则为真。
-N file
-
如果文件存在且自上次读取以来已被修改,则为真。
-O file
-
如果文件存在且由有效用户标识拥有,则为True 。
-S file
-
如果文件存在且为套接字,则为真。
file1 -ef file2
-
如果file1和file2引用相同的设备和inode编号,则为True 。
file1 -nt file2
-
如果file1比file2更新(或根据修改日期),或者file1存在而file2不存在,则为True 。
file1 -ot file2
-
如果file1早于file2,或者file2存在且file1不存在,则为True 。
-o optname
-
如果启用了shell选项optname,则为True 。选项列表显示在。的说明中-o
set
内置 选项(参见Set Builtin)。 -v varname
-
如果设置了shell变量varname,则为True (已分配值)。
-R varname
-
如果设置了shell变量varname并且它是名称引用,则为True 。
-z string
-
如果字符串的长度为零,则为True 。
-n string
string
-
如果字符串的长度不为零,则为True 。
string1 == string2
string1 = string2
-
如果字符串相等则为True。与
[[
命令一起使用时,如上所述执行模式匹配(请参阅条件构造)。“='应该与POSIX一致性
test
命令一起使用。 string1 != string2
-
如果字符串不相等则为True。
string1 < string2
-
如果string1按字典顺序在string2之前排序,则为True 。
string1 > string2
-
如果string1按字典顺序在string2之后排序,则为True 。
arg1 OP arg2
-
OP
是其中之一 '当量','-ne','-lt','-le','-gt', 要么 '-ge”。如果arg1分别 等于,不等于,小于,小于或等于,大于或大于或等于arg2,则这些算术二元运算符返回true 。 Arg1和arg2 可以是正整数或负整数。
6.5 Shell算术
shell允许对算术表达式进行求值,作为shell扩展之一,或者使用((
复合命令, let
内置函数或者-一世declare
内置选项。
评估是在固定宽度的整数中完成的,没有检查溢出,但除以0被捕获并标记为错误。运算符及其优先级,关联性和值与C语言中的相同。以下运算符列表分组为等优先运算符的级别。级别按优先级递减的顺序列出。
id++ id--
-
变量后增量和后减量
++id --id
-
变量预增量和预减量
- +
-
一元减去和加号
! ~
-
逻辑和按位否定
**
-
幂
* / %
-
乘法,除法,余数
+ -
-
另外,减法
<< >>
-
左右按位移位
<= >= < >
-
对照
== !=
-
平等和不平等
&
-
按位AND
^
-
按位异或
|
-
按位OR
&&
-
逻辑AND
||
-
逻辑或
expr ? expr : expr
-
条件运算符
= *= /= %= += -= <<= >>= &= ^= |=
-
分配
expr1 , expr2
-
逗号
允许Shell变量作为操作数; 在计算表达式之前执行参数扩展。在表达式中,shell变量也可以通过名称引用,而不使用参数扩展语法。在不使用参数扩展语法的情况下按名称引用时,null或unset的shell变量的计算结果为0。变量的值在引用时被计算为算术表达式,或者在使用' 给出整数属性的变量时被计算 声明-i'被分配了一个值。null值的计算结果为0. shell变量不需要打开其整数属性即可在表达式中使用。
前导0的常量被解释为八进制数。一个领先的'0X' 要么 '0X'表示十六进制。否则,数字采用[ base#
] n形式,其中可选基数 是2到64之间的十进制数,表示算术基数,n是该基数中的数字。如果省略base#
,则使用base 10。指定n时,大于9的数字由小写字母,大写字母''表示。@','和'_', 以该顺序。如果base小于或等于36,则小写和大写字母可以互换使用以表示10到35之间的数字。
按优先顺序评估运算符。首先评估括号中的子表达式,并可以覆盖上面的优先级规则。
Next:Arrays,Previous:Shell Arithmetic,Up:Bash Features [ Contents ] [ Index ]
6.6别名
别名允许在将字符串用作简单命令的第一个字时替换字符串。shell维护一个别名列表,可以使用alias
和unalias
builtin命令设置和取消设置这些别名。
如果不加引号,则检查每个简单命令的第一个单词以查看它是否具有别名。如果是这样,该单词将被别名的文本替换。那些角色 '/','$','`','='和上面列出的任何shell元字符或引号字符可能不会出现在别名中。替换文本可以包含任何有效的shell输入,包括shell元字符。替换文本的第一个单词是针对别名测试的,但是与扩展的别名相同的单词不会再次展开。这意味着可以别名ls
来"ls -F"
,例如,和Bash不会尝试递归扩展替换文本。如果别名值的最后一个字符为 空,则还会检查别名后面的下一个命令字的别名扩展。
创建别名并列出 alias
命令,并使用该unalias
命令将其删除。
在替换文本中没有使用参数的机制,如csh
。如果需要参数,则应使用shell函数(请参阅Shell函数)。
当shell不是交互式时,别名不会扩展,除非使用expand_aliases
shell设置 shopt
(参见The Shopt Builtin)。
关于别名的定义和使用的规则有些令人困惑。在执行该行上的任何命令之前,Bash始终会读取至少一个完整的输入行。读取命令时会扩展别名,而不会在执行时扩展别名。因此,在读取下一行输入之前,与另一个命令出现在同一行上的别名定义不会生效。该行上别名定义后面的命令不受新别名的影响。执行函数时,此行为也是一个问题。读取函数定义时会扩展别名,而不是在执行函数时扩展别名,因为函数定义本身就是一个命令。因此,在执行该函数之后,函数中定义的别名才可用。为安全起见,请始终将别名定义放在单独的行中,alias
在复合命令中。
对于几乎所有目的,shell函数优先于别名。
6.7阵列
Bash提供一维索引和关联数组变量。任何变量都可以用作索引数组; 该declare
内建将明确声明一个数组。对数组的大小没有最大限制,也没有要求成员被索引或连续分配的要求。索引数组使用整数引用(包括算术表达式(参见Shell算术))并且基于零; 关联数组使用任意字符串。除非另有说明,否则索引数组索引必须是非负整数。
如果使用语法分配任何变量,则会自动创建索引数组
name [ 下标 ] = 值
的下标 被视为一个算术表达式,必须评估为数字。要显式声明一个数组,请使用
声明 - 一个名字
语法
声明-a name [ 下标 ]
也被接受; 该标被忽略。
使用关联数组创建
声明 - 一个名字。
可以使用declare
和 readonly
builtins 为数组变量指定属性。每个属性都适用于数组的所有成员。
分配数组以使用表单的复合赋值
name =(value1 value2 ...)
其中每个 值都是表单字符串。索引数组赋值不需要任何字符串。分配给索引数组时,如果提供了可选的下标,则将该索引分配给; 否则,分配的元素的索引是语句分配给的最后一个索引加一。索引从零开始。 [subscript]=
分配给关联数组时,下标是必需的。
declare
内置函数也接受此语法。可以使用上面介绍的语法分配各个数组元素 。 name[subscript]=value
分配给索引数组时,如果name 由负数下标,则该数字被解释为相对于大于name的最大索引的数字 ,因此负数索引从数组末尾开始计数,索引为-1引用最后一个元素。
可以使用引用数组的任何元素 。需要大括号以避免与shell的文件名扩展运算符冲突。如果 下标是'${name[subscript]}
@' 要么 '*',单词扩展为数组名称的所有成员。这些下标仅在单词出现在双引号内时有所不同。如果单词是双引号,则 展开为单个单词,每个数组成员的值由变量的第一个字符分隔 ,并将name的每个元素展开 为单独的单词。如果没有数组成员,则 展开为空。如果双引号扩展发生在单词中,则第一个参数的扩展与原始单词的开头部分连接,最后一个参数的扩展与原始单词的最后部分连接。这类似于特殊参数的扩展'${name[*]}
IFS
${name[@]}
${name[@]}
@'和'*”。 扩展到的长度 。如果下标是'${#name[subscript]}
${name[subscript]}
@' 要么 '*',扩展是数组中元素的数量。如果 用于引用索引数组的元素的下标求值为小于零的数字,则将其解释为相对于大于数组的最大索引的下标,因此负索引从数组的末尾开始计数,并且index为-1指的是最后一个元素。
引用不带下标的数组变量等效于使用下标为0的引用。使用有效下标对变量的任何引用都是合法的,并且 bash
如果需要将创建数组。
如果已为下标指定值,则认为数组变量已设置。空字符串是有效值。
可以获得数组的键(索引)以及值。$ {!名字 [@]}和$ {!name [*]}展开到数组变量名中指定的索引。双引号中的处理类似于特殊参数的扩展'@'和'*'双引号内。
该unset
内建是用来摧毁阵列。 在索引下标处销毁数组元素。索引数组的否定下标如上所述进行解释。必须注意避免文件名扩展引起的不必要的副作用。 ,其中name是一个数组,删除整个数组。'的下标'unset name[subscript]
unset name
*' 要么 '@'也删除了整个数组。
的declare
,local
和readonly
建宏每个接受-一个 用于指定索引数组和a的选项 -一个用于指定关联数组的选项。如果提供了两个选项,-一个优先。该read
内建接受-一个 用于将从标准输入读取的单词列表分配给数组的选项,并且可以将标准输入中的值读取到单个数组元素中。的set
和declare
内建命令显示阵列的值的方式,允许它们被作为输入重新使用。
6.8目录堆栈
• 目录堆栈内置: | Bash内置命令来操作目录堆栈。 |
目录堆栈是最近访问过的目录的列表。所述 pushd
内置添加目录到堆栈,因为它改变了当前目录,以及popd
内置从栈中删除指定的目录,并且改变当前目录为除去的目录。所述dirs
内置显示目录堆栈的内容。当前目录始终是目录堆栈的“顶部”。
目录堆栈的内容也可以作为DIRSTACK
shell变量的值显示。
6.8.1目录堆栈内置
dirs
-
dirs [-clpv] [+ N | - N ]
显示当前记住的目录列表。使用
pushd
命令将目录添加到列表中; 该popd
命令从列表中删除目录。当前目录始终是堆栈中的第一个目录。-c
-
通过删除所有元素来清除目录堆栈。
-l
-
使用完整路径名生成列表; 默认列表格式使用代字号表示主目录。
-p
-
dirs
打印目录堆栈的原因是每行一个条目。 -v
-
导致
dirs
打印目录堆栈,每行一个条目,在每个条目前面添加其索引在堆栈中。 +N
-
显示第N个目录(从
dirs
没有选项调用时打印的列表左侧开始计数),从零开始。 -N
-
显示第N个目录(从
dirs
没有选项调用时打印的列表右侧开始计数),从零开始。
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
到目录。没有参数,pushd
交换前两个目录并使新的顶部成为当前目录。-n
-
在向堆栈旋转或添加目录时,禁止正常更改目录,以便仅操作堆栈。
+N
-
通过旋转堆栈,将第N个目录(从列表左侧
dirs
开始计数,从零开始计数)到列表顶部。 -N
-
通过旋转堆栈,将第N个目录(从列表右侧
dirs
开始计数,从零开始计数)到列表顶部。 dir
-
使dir成为堆栈的顶部,使其成为新的当前目录,就好像它已作为
cd
内置参数提供。
6.9控制提示
PROMPT_COMMAND
在Bash打印每个主要提示之前检查变量的值。如果PROMPT_COMMAND
已设置且具有非空值,则执行该值就像在命令行上键入它一样。
此外,下表描述可能出现的提示变量的特殊字符PS1
到PS4
:
\a
-
铃铛角色。
\d
-
日期,以“工作日月日期”格式(例如,“Tue May 26”)。
\D{format}
-
的格式被传递到
strftime
(3),结果被插入到提示字符串; 空格式导致特定于语言环境的时间表示。大括号是必需的。 \e
-
逃脱角色。
\h
-
主机名,直到第一个'。'。
\H
-
主机名。
\j
-
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
缩写为tilde(使用$PROMPT_DIRTRIM
变量)。 \W
-
基本名称
$PWD
,$HOME
缩写为波浪号。 \!
-
此命令的历史编号。
\#
-
该命令的命令编号。
\$
-
如果有效uid为0
#
,否则为$
。 \nnn
-
ASCII码为八进制值nnn的字符。
\\
-
反斜杠。
\[
-
开始一系列非打印字符。这可用于将终端控制序列嵌入到提示中。
\]
-
结束一系列非打印字符。
命令编号和历史编号通常不同:命令的历史编号是其在历史列表中的位置,可能包括从历史文件中恢复的命令(请参阅Bash历史记录设施),而命令编号是在当前shell会话期间执行的命令序列。
解码字符串后,它将通过参数扩展,命令替换,算术扩展和引用删除进行扩展,具体取决于promptvars
shell选项的值 (请参阅Bash Builtins)。
下一页:Bash POSIX模式,上一页:控制提示,上一页:Bash功能 [ 目录 ] [ 索引 ]
6.10受限制的壳牌
如果Bash以名称启动rbash
,或者 --restricted 要么 -r 在调用时提供了选项,shell变得受限制。受限shell用于设置比标准shell更受控制的环境。受限制的shell的行为与bash
以下内容不允许或不执行的情况相同:
- 使用
cd
内置更改目录。 - 设置或取消设置的值
SHELL
,PATH
,ENV
,或BASH_ENV
变量。 - 指定包含斜杠的命令名称。
- 指定包含斜杠的文件名作为
.
builtin命令的参数。 - 指定包含斜杠的文件名作为参数 -p
hash
内置命令的 选项。 - 在启动时从shell环境导入函数定义。
SHELLOPTS
在启动时解析shell环境的值。- 使用'重定向输出'>','> |','<>','>&','&>','和'>>'重定向运算符。
- 使用
exec
内置命令用另一个命令替换shell。 - 使用添加或删除内置命令 -F 和 -d
enable
内置选项。 - 使用
enable
builtin命令启用禁用的shell内置命令。 - 指定 -p
command
内置选项。 - 使用'关闭限制模式设+ r' 要么 '设定+ o限制”。
在读取任何启动文件后强制执行这些限制。
当执行发现是shell脚本的命令时(请参阅Shell脚本),rbash
关闭生成的shell中的任何限制以执行脚本。
6.11 Bash POSIX模式
用。开始Bash --posix 命令行选项或执行'设置-o posix'当Bash运行时,通过更改行为以匹配POSIX在Bash默认值不同的区域中指定的行为,将使Bash更符合POSIX标准。
调用时sh
,Bash 在读取启动文件后进入POSIX模式。
以下列表是“ POSIX模式”生效时发生的变化:
- 当哈希表中的命令不再存在时,Bash将重新搜索
$PATH
以查找新位置。这也适用于'shopt -s checkhash”。 - 作业控制代码打印的消息和作业以非零状态退出时内置的消息是“完成(状态)”。
- 作业控制代码打印的消息和作业停止时内置的消息是“已停止(签名)”,例如,其中是signame
SIGTSTP
。 - 即使在非交互式shell中,也始终启用别名扩展。
- 出现在识别保留字的上下文中的保留字不会经历别名扩展。
- 该POSIX
PS1
和PS2
的扩张“!'到历史编号和'!' 至 '!'已启用,并且对选项的设置PS1
和 值进行参数扩展。PS2
promptvars
- 该POSIX启动文件执行(
$ENV
),而不是正常的Bash文件。 - Tilde扩展仅在命令名称之前的赋值上执行,而不是在该行上的所有赋值语句上执行。
- 默认历史记录文件是 〜/ .sh_history(这是默认值
$HISTFILE
)。 - 除非shell是交互式的,否则重定向操作符不会对重定向中的单词执行文件名扩展。
- 重定向运算符不会在重定向中对单词执行分词。
- 函数名必须是有效的shell
name
。也就是说,它们可能不包含字母,数字和下划线以外的字符,并且可能不以数字开头。声明具有无效名称的函数会导致非交互式shell中出现致命语法错误。 - 函数名称可能与POSIX特殊内置函数之一不同。
- 在命令查找期间,在shell函数之前找到POSIX特殊内置函数。
- 在打印shell函数定义(例如,by
type
)时,Bash不会打印function
关键字。 PATH
如上所述,在Tilde Expansion中,不会扩展作为变量元素中第一个字符出现的文字波浪号。- 该
time
保留的字可以通过本身被用作命令。以这种方式使用时,它会显示shell及其已完成子项的计时统计信息。该TIMEFORMAT
变量控制定时信息的格式。 - 解析和扩展出现在双引号内的$ {...}扩展时,单引号不再特殊,不能用于引用右括号或其他特殊字符,除非运算符是执行模式删除的运算符之一。在这种情况下,它们不必显示为匹配对。
time
如果下一个标记以''开头,则解析器不会识别为保留字- ”。- ''!'字符不会在双引号字符串中引入历史记录扩展,即使该
histexpand
选项已启用。 - 如果POSIX特殊内置函数返回错误状态,则退出非交互式shell。致命错误是POSIX标准中列出的错误,包括传递错误选项,重定向错误,命令名称前面的赋值的变量赋值错误等等。
- 如果在赋值语句后面没有命令名称时发生变量赋值错误,则非交互式shell将退出并显示错误状态。例如,在尝试将值分配给只读变量时,会发生变量赋值错误。
- 如果在特殊内置函数之前的赋值语句中发生变量赋值错误,但非任何其他简单命令,则非交互式shell将以错误状态退出。
- 如果
for
语句中的迭代变量或语句中的选择变量select
是只读变量,则非交互式shell将以错误状态退出。 - 如果 未找到filename中的
.
filename,则非交互式shell将退出。 - 如果算术扩展中的语法错误导致表达式无效,则非交互式shell将退出。
- 如果发生参数扩展错误,则退出非交互式shell。
- 如果在使用
.
或使用source
内置函数读取的脚本中或在eval
内置处理的字符串中存在语法错误,则会退出非交互式shell 。 - 流程替换不可用。
- 虽然变量间接可用,但它可能不适用于'#'和'?'特殊参数。
- 在扩大'*'扩展为双引号的模式上下文中的特殊参数不会将其
$*
视为双引号。 - 在内置完成后,POSIX特殊内置函数之前的赋值语句在shell环境中持久存在。
- shell函数调用之前的赋值语句在函数返回后在shell环境中持久存在,就好像 已经执行了POSIX特殊内置命令一样。
- 该
command
内建不会阻止采取赋值语句从他们扩大为赋值语句的参数建宏; 当不在POSIX模式时,赋值内置函数在前面的时候会丢失它们的赋值语句扩展属性command
。 - 该
bg
内建用途,所需的格式来描述放置在背景,这不包括的作业是否是当前或前面的作业的指示每个作业。 - '的输出'杀死-l'在一行上打印所有信号名称,用空格分隔,不带'SIG' 字首。
- 该
kill
内建没有以'接受信号名称SIG' 字首。 - 的
export
和readonly
在所要求的格式内置命令显示它们的输出POSIX。 - 在
trap
内置显示信号的名字没有领先SIG
。 - 该
trap
内建不检查一个可能的信号规范的第一个参数,并恢复处理原来的配置信号,如果是这样,除非这样的说法由单纯的数字,是一个有效的信号编号。如果用户想要将给定信号的处理程序重置为原始处置,则应使用'- '作为第一个论点。 - 在
.
和source
内建命令不搜寻当前目录下的文件名参数,如果它不是通过搜索找到PATH
。 - 启用POSIX模式具有设置
inherit_errexit
选项的效果 ,因此生成的子shell执行命令替换继承了该值的-e来自父shell的选项。如果inherit_errexit
未启用该选项,Bash将清除该选项-e 这种子壳中的选项。 - 当
alias
内置显示别名定义时,它不显示带有前导'别号 '除非 -p 提供选项。 - 如果在
set
没有选项的情况下调用内置函数,则它不会显示shell函数名称和定义。 - 如果在
set
没有选项的情况下调用内置函数,它将显示不带引号的变量值,除非它们包含shell元字符,即使结果包含非打印字符。 - 当
cd
在逻辑模式下调用内置函数时,$PWD
并且作为参数提供的路径名和作为参数提供的目录名称不引用现有目录时,cd
将失败而不是回退到物理模式。 - 该
pwd
内置验证它打印的价值是一样的当前目录,即使不要求它检查与文件系统 -P 选项。 - 列出历史记录时,
fc
内置函数不包含是否已修改历史记录条目的指示。 - 使用的默认编辑器
fc
是ed
。 - 在
type
和command
内建命令不会报告非可执行文件为已发现,虽然外壳将尝试执行这样的文件,如果它是发现的唯一如此命名的文件$PATH
。 - 在
vi
编辑模式将调用vi
直接编辑当“v'命令运行,而不是检查$VISUAL
和$EDITOR
。 xpg_echo
启用该选项后,Bash不会尝试将任何参数解释echo
为选项。转换转义字符后,将显示每个参数。- 该
ulimit
内建使用的512个字节用于一个块的大小-C 和 -F 选项。 SIGCHLD
设置陷阱时的到达SIGCHLD
不会中断wait
内置并导致它立即返回。对于退出的每个子项,将运行一次trap命令。- 该
read
内建可以通过用于该陷阱已经设置的信号被中断。如果Bash在执行时收到捕获的信号read
,则陷阱处理程序执行并read
返回大于128的退出状态。 - 在使用
wait
内置函数获取后,Bash会从此类状态列表中删除已退出的后台进程的状态。
即使在POSIX模式下,Bash默认也没有其他POSIX行为。特别:
- 该
fc
内置检查$EDITOR
作为一个程序,如果编辑历史项FCEDIT
没有设置,而不是直接默认为ed
。fc
使用ed
ifEDITOR
未设置。 - 如上所述,Bash要求
xpg_echo
启用echo
内置以完全符合的选项。
默认情况下,可以通过指定Bash将Bash配置为POSIX -conformant--enable-严格符合POSIX默认以configure
建设时(见可选功能)。
7工作控制
本章讨论作业控制是什么,它是如何工作的,以及Bash如何允许您访问其工具。
• 工作控制基础: | 工作控制如何运作。 | |
• 工作控制内置: | 用于与作业控制交互的Bash内置命令。 | |
• 工作控制变量: | 变量Bash用于自定义作业控制。 |
下一页:Job Control Builtins,Up:工作控制 [ 目录 ] [ 索引 ]
7.1工作控制基础
作业控制是指有选择地停止(暂停)进程的执行并在稍后继续(恢复)它们的执行的能力。用户通常通过由操作系统内核的终端驱动程序和Bash共同提供的交互式接口来使用该功能。
shell将作业与每个管道相关联。它保留当前正在执行的作业的表,可以使用该jobs
命令列出 。当Bash以异步方式启动作业时,它会打印一条如下所示的行:
[1] 25647
指示此作业是作业编号1,并且 与此作业关联的管道中的最后一个进程的进程ID是25647.单个管道中的所有进程都是同一作业的成员。Bash使用作业抽象作为工作控制的基础。
为了便于实现作业控制的用户界面,操作系统维护当前终端进程组ID的概念。此进程组的成员(进程组ID等于当前终端进程组ID的进程 )接收键盘生成的信号,例如SIGINT
。据说这些过程处于前台。后台进程是进程组ID与终端进程不同的进程; 这些过程不受键盘生成的信号的影响。只允许前台进程读取,或者如果用户如此指定stty tostop
,则写入终端。尝试读取的后台进程(写入时stty tostop
实际上)终端由内核的终端驱动程序发送一个SIGTTIN
(SIGTTOU
)信号,除非被捕获,否则暂停该过程。
如果运行Bash的操作系统支持作业控制,则Bash包含使用它的工具。输入 暂停字符(通常是'^ Z',Control-Z)在进程运行时导致该进程停止并将控制权返回给Bash。输入延迟暂停字符(通常是'^ÿ',Control-Y)导致进程在尝试从终端读取输入时停止,并且控制返回到Bash。然后,用户操作此作业的状态,使用bg
命令在后台继续它,fg
命令在前台继续它,或kill
命令杀死它。一个 '^ Z'立即生效,并具有导致待处理输出和预先输出的附加副作用。
有很多方法可以引用shell中的作业。人物 '%'引入了工作规范(jobspec)。
工作号码n
可称为'%N”。符号'%%'和'%+'参考shell对当前作业的概念,这是当它在前台或在后台启动时停止的最后一个作业。一个'%'(没有附带的工作规范)也指当前的工作。可以使用'引用上一个作业'% - ”。如果只有一份工作,'%+'和'% - '都可以用来指那份工作。在与作业相关的输出(例如,jobs
命令的输出)中,当前作业始终标记为''+',以及以前的工作'- ”。
也可以使用用于启动它的名称的前缀或使用其命令行中出现的子字符串来引用作业。例如, '%CE'指的是一个停止的ce
工作。使用'%?CE',另一方面,指任何包含字符串的作业'CE'在其命令行中。如果前缀或子字符串匹配多个作业,Bash会报告错误。
简单地命名一个工作可以用来将它带到前台:'1%'是'的同义词'fg%1',将工作1从后台带到前台。同样,'%1&'在后台恢复工作1,相当于'bg%1“
当作业改变状态时,shell立即学习。通常,Bash会在报告作业状态更改之前等待打印提示,以免中断任何其他输出。如果-bset
启用了内置选项,Bash立即报告此类更改(请参阅Set Builtin)。SIGCHLD
对于退出的每个子进程执行任何陷阱。
如果在作业停止时(或运行,如果checkjobs
启用该选项 - 请参阅Shopt Builtin)尝试退出Bash ,则shell会打印一条警告消息,如果checkjobs
启用该选项,则会列出作业及其状态。jobs
然后该命令可用于检查其状态。如果在没有插入命令的情况下进行第二次退出尝试,则Bash不会打印另一个警告,并且任何已停止的作业都将终止。
7.2工作控制内置
bg
-
bg [ jobspec ...]
在后台恢复每个暂停的作业jobspec,就好像它已经开始'&”。如果未提供jobspec,则使用当前作业。返回状态为零,除非在未启用作业控制时运行,或者在启用作业控制的情况下运行时,未找到任何 jobspec或指定在没有作业控制的情况下启动的作业。
fg
-
fg [ jobspec ]
在前台恢复作业jobspec并使其成为当前作业。如果未提供jobspec,则使用当前作业。返回状态是放置到前台的命令的状态,如果在禁用作业控制时运行则返回非零,或者在启用作业控制的情况下运行时,jobspec不指定有效作业,或者 jobspec指定在没有作业的情况下启动的作业控制。
jobs
-
工作[-lnprs] [ jobspec ] jobs -x 命令 [ 参数 ]
第一个表单列出了活动作业。选项具有以下含义:
-l
-
除正常信息外,还列出进程ID。
-n
-
仅显示自用户上次通知其状态以来已更改状态的作业的信息。
-p
-
仅列出作业进程组组长的进程ID。
-r
-
仅显示正在运行的作业
-s
-
仅显示已停止的作业。
如果给出了jobspec,则输出仅限于有关该作业的信息。如果未提供jobspec,则列出所有作业的状态。
如果 -X提供选项,
jobs
将命令或参数中找到的任何jobspec替换 为相应的进程组ID,并执行命令,传递参数 s,返回其退出状态。 kill
-
kill [-s sigspec ] [-n signum ] [ - sigspec ] jobspec或pid kill -l | -L [ exit_status ]
将sigspec或signum指定的信号发送到作业规范jobspec或进程ID pid指定的进程。 sigspec是一个不区分大小写的信号名称,例如
SIGINT
(带或不带SIG
前缀)或信号编号; signum是一个信号编号。如果不存在sigspec和signum,SIGTERM
则使用。该-l选项列出信号名称。如果提供任何参数-l如果给出,则列出与参数对应的信号的名称,并且返回状态为零。 exit_status是一个数字,指定信号编号或由信号终止的进程的退出状态。该-L 选项相当于 -l。如果至少一个信号成功发送,则返回状态为零;如果发生错误或遇到无效选项,则返回状态为非零。 wait
-
等[-n] [ jobspec或pid ......]
等到每个进程ID pid 或作业规范jobspec指定的子进程退出并返回等待的最后一个命令的退出状态。如果给出了作业规范,则等待作业中的所有进程。如果未给出参数,则等待所有当前活动的子进程,并且返回状态为零。如果-n提供选项,
wait
等待任何作业终止并返回其退出状态。如果jobspec和pid都没有指定shell的活动子进程,则返回状态为127。 disown
-
disown [-ar] [-h] [ jobspec ... | pid ...]
如果没有选项,请从活动作业表中删除每个jobspec。如果-H如果给出了选项,则不会从表中删除作业,但会对其进行标记,以便
SIGHUP
在shell收到时不会将作业发送到作业SIGHUP
。如果jobspec不存在,那么两者都没有-一个 也不是 -r提供选项,使用当前作业。如果没有提供jobspec,那么-一个选项意味着删除或标记所有工作; 该-r没有jobspec 参数的选项将操作限制为正在运行的作业。 suspend
-
暂停[-f]
暂停此shell的执行,直到收到
SIGCONT
信号。登录shell无法暂停; 该-F 选项可用于覆盖此并强制暂停。
当作业控制未激活时,kill
和builtinswait
不接受jobspec参数。必须提供进程ID。
上一篇:Job Control Builtins,Up:工作控制 [ 目录 ] [ 索引 ]
7.3作业控制变量
auto_resume
-
此变量控制shell如何与用户和作业控件交互。如果存在此变量,则将没有重定向的单个单词简单命令视为恢复现有作业的候选者。不允许含糊不清; 如果以键入的字符串开头有多个作业,则将选择最近访问的作业。在此上下文中,已停止作业的名称是用于启动它的命令行。如果此变量设置为值'精确',提供的字符串必须与已停止的作业的名称完全匹配; 如果设置为'子',提供的字符串需要匹配已停止作业名称的子字符串。''子'价值提供类似于'的功能%?'作业ID(参见作业控制基础)。如果设置为任何其他值,则提供的字符串必须是已停止作业名称的前缀; 这提供了类似''的功能%'工作ID。
8命令行编辑
本章介绍GNU 命令行编辑界面的基本功能。命令行编辑由Readline库提供,该库由几个不同的程序使用,包括Bash。使用交互式shell时,默认情况下启用命令行编辑,除非--noeditingshell调用时提供了option。使用时也使用行编辑-eread
内置命令的选项 (参见Bash Builtins)。默认情况下,行编辑命令与Emacs的命令类似。还提供vi风格的线编辑界面。可以使用随时启用行编辑-o emacs 要么 -o viset
内置命令的选项(请参阅Set Builtin),或使用+ o emacs 要么 + o vi选项set
。
• 简介和符号: | 本文中使用的表示法。 | |
• Readline交互: | 用于编辑行的最小命令集。 | |
• Readline初始化文件: | 从用户的视图自定义Readline。 | |
• 可绑定的Readline命令: | 大多数可用于绑定的Readline命令的描述 | |
• Readline vi模式: | 关于如何使Readline像vi编辑器一样的简短描述。 | |
• 可编程完成: | 如何为特定命令指定可能的完成。 | |
• 可编程完成内置: | 内置命令指定如何完成特定命令的参数。 | |
• 可编程完成示例: | 用于生成可能的完成的示例shell函数。 |
下一页:Readline Interaction,Up:命令行编辑 [ 目录 ] [ 索引 ]
8.1线编辑简介
以下段落描述了用于表示击键的符号。
该文本C-k被读作“Control-K”并描述按下控制键时按下k键时产生的字符。
该文本M-k被读作'Meta-K'并描述当按下Meta键(如果有的话)时产生的字符,并 按下k键。Meta键在许多键盘上标记为ALT。在具有两个标记为ALT的键(通常位于空格键的任一侧)的键盘上,左侧的ALT通常设置为用作Meta键。右侧的ALT键也可以配置为Meta键,或者可以配置为其他一些修饰符,例如用于键入重音字符的Compose键。
如果你没有一个元或ALT键,或另一个主要的工作作为Meta键,可以通过输入生成相同的按键ESC 第一,然后键入ķ。这两个过程都被称为元化k键。
该文本M-C-k被读作'Meta-Control-k'并描述了由元化 产生的字符C-k。
此外,几个键有自己的名字。具体来说, DEL, ESC,LFD,SPC,RET和TAB在本文中或在init文件中都是独立的(参见Readline Init File)。如果你的键盘没有LFD键,输入Cj将产生所需的字符。该RET键可能被标记返回或进入一些键盘上。
下一页:Readline Init File,Previous:Introduction and Notation,Up:命令行编辑 [ Contents ] [ Index ]
8.2 Readline交互
通常在交互式会话期间,您键入一长行文本,只是注意到该行上的第一个单词拼写错误。Readline库为您提供了一组用于在键入文本时操作文本的命令,允许您修复错字,而不是强制您重新键入大部分行。使用这些编辑命令,将光标移动到需要更正的位置,并删除或插入更正的文本。然后,当您对该行感到满意时,只需按RET即可。您不必在行的末尾按RET ; 无论光标在行内的位置如何,都接受整行。
• Readline Bare Essentials: | 至少你需要了解Readline。 | |
• Readline移动命令: | 移动输入线。 | |
• Readline杀戮命令: | 如何删除文本,以及如何取回文本! | |
• Readline参数: | 为命令提供数字参数。 | |
• 搜索: | 搜索前面的行。 |
下一个: Readline移动命令,Up:Readline Interaction [ 目录 ] [ 索引 ]
8.2.1 Readline Bare Essentials
要在行中输入字符,只需键入它们即可。键入的字符出现在光标所在的位置,然后光标向右移动一个空格。如果输入错误的字符,可以使用擦除字符进行备份并删除输入错误的字符。
有时您可能会错误输入一个字符,并且在键入其他几个字符之前不会注意到错误。在这种情况下,您可以键入C-b以将光标向左移动,然后更正您的错误。然后,您可以将光标移动到右侧C-f。
当您在一行中间添加文本时,您会注意到光标右侧的字符被“推过”以为您插入的文本腾出空间。同样,当您删除光标后面的文本时,光标右侧的字符会被“拉回”以填充删除文本所创建的空白区域。下面是编辑输入行文本的基本要素列表。
- C-b
-
向后移动一个角色。
- C-f
-
向前移动一个角色。
- DEL或Backspace
-
删除光标左侧的字符。
- C-d
-
删除光标下方的字符。
- 打印字符
-
将字符插入光标处的行。
- C-_ 要么 C-x C-u
-
撤消上一个编辑命令。您可以一直撤消回空行。
(根据您的配置,Backspace键设置为删除光标左侧的字符,DEL键设置为删除光标下方的字符C-d,而不是光标左侧的字符。)
下一篇:Readline Killing Commands,上一篇:Readline Bare Essentials,Up:Readline Interaction [ 目录 ] [ 索引 ]
8.2.2 Readline移动命令
上表描述了编辑输入行所需的最基本的击键。为了您的方便,许多其他的命令已在除添加C-b,C-f, C-d,和DEL。以下是一些有关线路移动速度更快的命令。
- C-a
-
移动到行的开头。
- C-e
-
移到行尾。
- M-f
-
向前移动一个单词,其中单词由字母和数字组成。
- M-b
-
向后移动一个单词。
- C-l
-
清除屏幕,重新打印顶部的当前行。
注意如何C-f向前移动一个角色,同时M-f向前移动一个单词。控制击键操作字符是一种松散的约定,而元击键操作字。
下一篇:Readline参数,上一篇:Readline 运动命令,Up:Readline Interaction [ 目录 ] [ 索引 ]
8.2.3 Readline杀戮命令
杀死文本意味着从行中删除文本,但要将其保存以供以后使用,通常是通过yanking重新插入(重新插入)行。('Cut'和'paste'是'kill'和'yank'最近的术语。)
如果命令的描述说它“杀死”了文本,那么您可以确定以后可以将文本放回到不同(或相同)的位置。
使用kill命令时,文本将保存在kill-ring中。任意数量的连续杀戮将所有被杀死的文本保存在一起,这样当你把它拉回来时,你就可以得到所有这些。杀伤环不是特定于行的; 当您键入另一行时,您在以前键入的行上杀死的文本可以稍后被拉回。
以下是用于查杀文本的命令列表。
- C-k
-
将文本从当前光标位置杀到行尾。
- M-d
-
从光标到当前单词的结尾,或者,如果在单词之间,到达下一个单词的结尾。字边界与使用的边界相同M-f。
- M-DEL
-
从光标处杀死当前单词的开头,或者,如果在单词之间,则从前一单词的开头处开始。字边界与使用的边界相同M-b。
- C-w
-
从光标到前一个空格。这不同于 因为单词边界不同。 M-DEL
下面是如何抽出文本回线。Yanking意味着从kill buffer中复制最近被杀死的文本。
- C-y
-
将最近被杀死的文本放回到光标处的缓冲区中。
- M-y
-
旋转杀死环,并猛拉新的顶部。如果先前的命令是C-y或,则只能执行此操作M-y。
下一页:搜索,上一页:Readline Killing Commands,Up:Readline Interaction [ 目录 ] [ 索引 ]
8.2.4 Readline参数
您可以将数字参数传递给Readline命令。有时,论证充当重复计数,有时则是是重要参数标志。如果将负参数传递给通常作用于正向的命令,则该命令将向后移动。例如,要将文本杀回到行的开头,您可以键入'M-- Ck”。
将数字参数传递给命令的一般方法是在命令之前键入元数字。如果键入的第一个“数字”是减号('- '),那么论证的标志将是否定的。键入一个元数字以启动参数后,可以键入其余的数字,然后键入命令。例如,给予C-d命令参数10,您可以键入'M-1 0 Cd',将删除输入行中的下十个字符。
上一篇:Readline Arguments,Up:Readline Interaction [ 目录 ] [ 索引 ]
8.2.5在历史记录中搜索命令
Readline提供了用于搜索包含指定字符串的行的命令历史记录(请参阅Bash历史记录设施)的命令。有两种搜索模式: 增量和非增量。
在用户键入搜索字符串之前开始增量搜索。当输入搜索字符串的每个字符时,Readline将显示与目前为止键入的字符串匹配的历史记录中的下一个条目。增量搜索仅需要所需的字符数来查找所需的历史记录条目。要在历史记录中向后搜索特定字符串,请键入 C-r。键入C-s搜索历史记录。isearch-terminators
变量值中存在的字符用于终止增量搜索。如果尚未为该变量分配值,则ESC和 C-J字符将终止增量搜索。 C-g将中止增量搜索并恢复原始行。搜索终止时,包含搜索字符串的历史记录条目将成为当前行。
要在历史记录列表中查找其他匹配条目,请键入C-r或 C-s根据需要键入。这将在历史记录中向后或向前搜索与目前为止键入的搜索字符串匹配的下一个条目。绑定到Readline命令的任何其他键序列将终止搜索并执行该命令。例如,RET将终止搜索并接受该行,从而从历史列表中执行命令。移动命令将终止搜索,使最后一行找到当前行,然后开始编辑。
Readline会记住最后一个增量搜索字符串。如果C-r输入两个 s而没有定义新搜索字符串的任何插入字符,则使用任何记住的搜索字符串。
在开始搜索匹配的历史记录行之前,非增量搜索会读取整个搜索字符串。搜索字符串可以由用户键入或者是当前行的内容的一部分。
Next:可绑定Readline命令,上一页:Readline Interaction,Up:命令行编辑 [ Contents ] [ Index ]
8.3 Readline初始化文件
尽管Readline库默认安装了一组类似Emacs的键绑定,但可以使用一组不同的键绑定。任何用户都可以通过将命令放在inputrc文件中来定制使用Readline的程序,通常在他的主目录中。此文件的名称取自shell变量的值INPUTRC
。如果未设置该变量,则默认为〜/ .inputrc文件。如果该文件不存在或无法读取,则最终默认为 在/ etc / inputrc文件。
当启动使用Readline库的程序时,将读取init文件,并设置键绑定。
此外,该C-x C-r
命令会重新读取此init文件,从而包含您可能对其进行的任何更改。
• Readline初始化文件语法: | inputrc文件中命令的语法。 | |
• 条件初始化构造: | inputrc文件中的条件键绑定。 | |
• 样本初始化文件: | 一个示例inputrc文件。 |
Next:Conditional Init Constructs,Up:Readline Init File [ Contents ] [ Index ]
8.3.1 Readline初始化文件语法
Readline初始化文件中只允许几个基本结构。空行被忽略。以''开头的行#'是评论。以''开头的行$'表示条件结构(参见条件初始构造)。其他行表示变量设置和键绑定。
- 变量设置
-
您可以通过使用
set
init文件中的命令更改Readline中的变量值来修改Readline的运行时行为。语法很简单:设置变量 值
例如,这里是如何从默认的类Emacs键绑定更改为使用
vi
行编辑命令:设置编辑模式vi
在适当情况下,可以识别变量名称和值,而不考虑大小写。忽略无法识别的变量名称。
如果值为null或空,on(不区分大小写)或1 ,则布尔变量(可以设置为on或off的那些变量)设置为on 。任何其他值都会导致变量设置为off。
该命令列出当前的Readline变量名称和值。见Bash Builtins。
bind -V
使用以下变量可以改变大量的运行时行为。
bell-style
-
控制当Readline想要敲响终端铃声时会发生什么。如果设置为'没有',Readline永远不会响铃。如果设置为'可见',如果有可用铃声,Readline使用可见铃声。如果设置为'听得见'(默认值),Readline试图敲响终端的铃声。
bind-tty-special-chars
-
如果设置为'上'(默认值),Readline尝试将内核终端驱动程序专门处理的控制字符绑定到其Readline等效项。
blink-matching-paren
-
如果设置为'上',Readline尝试在插入右括号时将光标短暂移动到左括号。默认为'离”。
colored-completion-prefix
-
如果设置为'上',当列出完成时,Readline使用不同的颜色显示可能的完成集的公共前缀。颜色定义取自
LS_COLORS
环境变量的值。默认为'离”。 colored-stats
-
如果设置为'上',Readline显示使用不同颜色指示其文件类型的可能完成。颜色定义取自
LS_COLORS
环境变量的值。默认为'离”。 comment-begin
-
insert-comment
执行命令时要在行开头插入的字符串 。默认值为"#"
。 completion-display-width
-
执行完成时用于显示可能匹配的屏幕列数。如果该值小于0或大于终端屏幕宽度,则忽略该值。值为0将导致每行显示一个匹配项。默认值为-1。
completion-ignore-case
-
如果设置为'上',Readline以不区分大小写的方式执行文件名匹配和完成。默认值为'离”。
completion-map-case
-
如果设置为'上',和completion-ignore-case已启用,Readline处理连字符('- ')和下划线('_')在执行不区分大小写的文件名匹配和完成时等效。
completion-prefix-display-length
-
无需修改即可显示的可能完成列表的公共前缀的字符长度。设置为大于零的值时,在显示可能的完成时,将使用省略号替换长于此值的公共前缀。
completion-query-items
-
确定何时应询问用户是否应显示可能性列表的可能完成次数。如果可能的完成次数大于此值,Readline将询问用户是否希望查看它们; 否则,他们只是列出。此变量必须设置为大于或等于0的整数值。负值表示Readline不应该询问。默认限制是
100
。 convert-meta
-
如果设置为'上',Readline将第八位设置的字符转换为ASCII键序列,方法是剥离第八位并为ESC字符添加前缀,将它们转换为以元为前缀的键序列。默认值为'上',但将被设置为'离'如果语言环境是包含8位字符的语言环境。
disable-completion
-
如果设置为'上',Readline将禁止单词完成。完成字符将被插入到行中,就像它们已映射到一样
self-insert
。默认为'离”。 echo-control-characters
-
设置为'上',在表明它们支持它的操作系统上,readline回应与键盘产生的信号相对应的字符。默认为'上”。
editing-mode
-
该
editing-mode
变量控制使用哪组默认键绑定。默认情况下,Readline在Emacs编辑模式下启动,其中击键与Emacs最相似。此变量可以设置为'emacs的' 要么 '六”。 emacs-mode-string
-
当emacs编辑模式处于活动状态时,此字符串将显示在主提示符的最后一行之前。该值像键绑定一样扩展,因此可以使用标准的元和控制前缀和反斜杠转义序列集。使用 '\ 1'和'\ 2'转义为非打印字符的开始和结束序列,可用于将终端控制序列嵌入到模式字符串中。默认为'@”。
enable-bracketed-paste
-
设置为'上',Readline将以一种方式配置终端,使其能够将每个粘贴作为单个字符串插入编辑缓冲区,而不是将每个字符视为已从键盘读取。这可以防止粘贴的字符被解释为编辑命令。默认为'离”。
enable-keypad
-
设置为'上',Readline将在调用时尝试启用应用程序键盘。某些系统需要此功能才能启用箭头键。默认为'离”。
enable-meta-key
-
设置为'上',Readline将尝试启用终端声称在调用时支持的任何元修饰键。在许多终端上,元密钥用于发送8位字符。默认为'上”。
expand-tilde
-
如果设置为'上',当Readline尝试完成单词时执行波浪扩展。默认为'离”。
history-preserve-point
-
如果设置为'上',历史代码尝试将点(当前光标位置)放在使用
previous-history
或检索的每个历史记录行上的相同位置next-history
。默认为'离”。 history-size
-
设置历史列表中保存的最大历史条目数。如果设置为零,则删除任何现有历史记录条目,并且不保存任何新条目。如果设置为小于零的值,则不限制历史条目的数量。默认情况下,历史条目的数量不受限制。如果尝试将history-size设置为非数字值,则最大历史记录条目数将设置为500。
horizontal-scroll-mode
-
此变量可以设置为'上' 要么 '离”。将其设置为'上'表示正在编辑的行的文本在长度超过屏幕宽度时将在单个屏幕行上水平滚动,而不是换行到新的屏幕行。默认情况下,此变量设置为'离”。
input-meta
-
如果设置为'上',Readline将启用8位输入(它不会清除它读取的字符中的第8位),无论终端声称它能支持什么。默认值为'离',但Readline将其设置为'上'如果语言环境包含八位字符。该名称
meta-flag
是此变量的同义词。 isearch-terminators
-
应该终止增量搜索而不随后将该字符作为命令执行的字符串(请参阅搜索)。如果这个变量没有被赋予了价值,人物ESC和 C-J将终止增量的搜索。
keymap
-
设置Readline对键绑定命令的当前键映射的想法。可接受的
keymap
名称emacs
,emacs-standard
,emacs-meta
,emacs-ctlx
,vi
,vi-move
,vi-command
,和vi-insert
。vi
相当于vi-command
(vi-move
也是同义词);emacs
相当于emacs-standard
。默认值为emacs
。editing-mode
变量的值也会影响默认键映射。 keyseq-timeout
-
指定Readline在读取不明确的键序列时将等待字符的持续时间(一个可以使用目前为止的输入读取形成完整的键序列,或者可以采取额外的输入来完成更长的键序列)。如果在超时内没有收到任何输入,Readline将使用较短但完整的键序列。Readline使用此值来确定当前输入源上的输入是否可用(
rl_instream
默认情况下)。该值以毫秒为单位指定,因此值1000表示Readline将等待一秒钟以获得其他输入。如果此变量设置为小于或等于零的值,或者设置为非数字值,则Readline将等待,直到按下另一个键以确定要完成的键序列。默认值为500
。 mark-directories
-
如果设置为'上',已完成的目录名称附加了斜杠。默认为'上”。
mark-modified-lines
-
此变量设置为'上',导致Readline显示星号('*')在已修改的历史记录行的开头。这个变量是'离' 默认情况下。
mark-symlinked-directories
-
如果设置为'上',作为目录的符号链接的已完成名称附加了一个斜杠(取决于值
mark-directories
)。默认为'离”。 match-hidden-files
-
此变量设置为'上',导致Readline匹配名称以'a'开头的文件。'(隐藏文件)执行文件名完成时。如果设置为'离',领先'。'必须由用户提供要完成的文件名。这个变量是'上' 默认情况下。
menu-complete-display-prefix
-
如果设置为'上',菜单完成在循环列表之前显示可能的完成列表的公共前缀(可能为空)。默认为'离”。
output-meta
-
如果设置为'上',Readline将显示直接设置第8位的字符,而不是带有元前缀的转义序列。默认为'离',但Readline将其设置为'上'如果语言环境包含八位字符。
page-completions
-
如果设置为'上',Readline使用
more
类似内部的寻呼机一次显示一系列可能的完成。这个变量是'上' 默认情况下。 print-completions-horizontally
-
如果设置为'上',Readline将显示完整的匹配,按字母顺序水平排序,而不是在屏幕下方。默认为'离”。
revert-all-at-newline
-
如果设置为'上',Readline将在
accept-line
执行返回之前撤消对历史记录行的所有更改。默认情况下,可以修改历史记录行,并在调用时保留单个撤消列表readline
。默认为'离”。 show-all-if-ambiguous
-
这会改变完成函数的默认行为。如果设置为'上',有多个可能完成的单词会立即列出匹配而不是响铃。默认值为'离”。
show-all-if-unmodified
-
这会以类似于show-all-if-ambiguous的方式更改完成函数的默认行为。如果设置为'上',具有多个可能完成但没有任何可能的部分完成的单词(可能的完成不共享公共前缀)导致匹配被立即列出而不是响铃。默认值为'离”。
show-mode-in-prompt
-
如果设置为'上',在提示符的开头添加一个字符,指示编辑模式:emacs,vi命令或vi插入。模式字符串是用户可设置的。默认值为'离”。
skip-completed-text
-
如果设置为'上',这会在将单个匹配插入行时改变默认的完成行为。它仅在单词中间执行完成时才有效。如果启用,则readline不会在完成单词中的点之后匹配字符的完成中插入字符,因此光标后面的单词部分不会重复。例如,如果启用此选项,则在光标位于'之后尝试完成Ë'in'Makefile文件'会导致'Makefile文件' 而不是 'Makefilefile',假设有一个可能的完成。默认值为'离”。
vi-cmd-mode-string
-
当vi编辑模式处于活动状态且处于命令模式时,此字符串将显示在主提示符的最后一行之前。该值像键绑定一样扩展,因此可以使用标准的元和控制前缀和反斜杠转义序列集。使用 '\ 1'和'\ 2'转义为非打印字符的开始和结束序列,可用于将终端控制序列嵌入到模式字符串中。默认为'(CMD)”。
vi-ins-mode-string
-
当vi编辑模式处于活动状态且处于插入模式时,此字符串将显示在主提示符的最后一行之前。该值像键绑定一样扩展,因此可以使用标准的元和控制前缀和反斜杠转义序列集。使用 '\ 1'和'\ 2'转义为非打印字符的开始和结束序列,可用于将终端控制序列嵌入到模式字符串中。默认为'(INS)”。
visible-stats
-
如果设置为'上',列出可能的完成时,表示文件类型的字符将附加到文件名。默认为'离”。
- 关键绑定
-
控制init文件中的键绑定的语法很简单。首先,您需要找到要更改的命令的名称。以下部分包含命令名称表,默认键绑定(如果有)以及命令的简短说明。
一旦知道命令的名称,只需在init文件中的一行中放置要绑定命令的键的名称,冒号,然后命令的名称。键名和冒号之间不能有空格 - 这将被解释为键名的一部分。密钥的名称可以用不同的方式表示,具体取决于您认为最舒适的内容。
除了命令名之外,readline还允许将键绑定到按下键时插入的字符串(宏)。
该命令以可直接放入初始化文件的格式显示Readline函数名称和绑定。见Bash Builtins。
bind -p
- keyname: function-name 或 macro
-
keyname是用英语拼写的密钥的名称。例如:
Control-u:通用参数 Meta-Rubout:反向杀戮词 Control-o:“>输出”
在上面的例子中,C-u绑定到函数
universal-argument
, M-DEL绑定到函数backward-kill-word
,并 C-o绑定运行右侧表示的宏(即插入文本'>输出'进入线)。处理此键绑定语法时会识别许多符号字符名称: DEL, ESC, ESCAPE, LFD, NEWLINE, RET, RETURN, RUBOUT, SPACE, SPC和 TAB。
- “ keyseq ”: 函数名称 或 宏
-
keyseq与上面的keyname不同之处在于,通过将键序列放在双引号中,可以指定表示整个键序列的字符串。可以使用某些GNU Emacs样式键转义,如下例所示,但无法识别特殊字符名称。
“\ Cu”:普遍论证 “\ Cx \ Cr”:重新读取-init-file “\ e [11~”:“功能键1”
在上面的例子中,C-u再次绑定到函数
universal-argument
(就像在第一个例子中一样),'C-x C-r'与函数绑定re-read-init-file
,'ESC [ 1 1 ~'必然会插入文字'功能键1”。
指定键序列时,可以使用以下GNU Emacs样式转义序列:
\C-
-
控制前缀
\M-
-
元前缀
\e
-
逃避角色
\\
-
反斜线
\"
-
“,一个双引号
\'
-
',单引号或撇号
除了GNU Emacs样式转义序列之外,还有第二组反斜杠转义:
\a
-
警报(铃)
\b
-
退格
\d
-
删除
\f
-
形式饲料
\n
-
新队
\r
-
回车
\t
-
水平标签
\v
-
垂直标签
\nnn
-
八位字符,其值为八进制值nnn (一到三位数)
\xHH
-
八位字符,其值为十六进制值HH (一个或两个十六进制数字)
输入宏的文本时,必须使用单引号或双引号来表示宏定义。假设未加引号的文本是函数名称。在宏体中,扩展了上述的反斜杠转义。反斜杠将引用宏文本中的任何其他字符,包括'“'和'“”。例如,以下绑定将使'C-x \'插入一个'\'进线:
“\ Cx \\”:“\\”
Next:Sample Init File,Previous:Readline Init File Syntax,Up:Readline Init File [ Contents ] [ Index ]
8.3.2条件初始化构造
Readline实现了与C预处理器的条件编译功能类似的功能,允许作为测试结果执行键绑定和变量设置。使用了四种解析器指令。
$if
-
该
$if
构造允许基于编辑模式,正在使用的终端或使用Readline的应用程序进行绑定。测试文本延伸到行尾; 隔离它不需要任何字符。mode
-
指令的
mode=
形式$if
用于测试Readline是否处于emacs
或vi
模式。这可以与''结合使用设置键盘映射例如,'命令仅在Readline以模式开始时才在emacs-standard
和键emacs-ctlx
映射中设置绑定emacs
。 term
-
该
term=
表单可以用于包括特定于终端的键绑定,可能用于绑定由终端的功能键输出的键序列。'右边的那个词'='对第一个终端的全名和终端名称的部分进行了测试'- ”。这允许sun
同时匹配sun
和sun-cmd
,例如。 application
-
该应用构建用于包括特定应用程序设置。使用Readline库的每个程序都设置应用程序名称,您可以测试特定值。这可用于将键序列绑定到对特定程序有用的函数。例如,以下命令添加一个引用Bash中当前或上一个单词的键序列:
$如果Bash #引用当前或上一个单词 “\ C-xq”:“\ eb \”\ ef \“” $ ENDIF
$endif
-
如前面的示例所示,此命令终止
$if
命令。 $else
-
$if
如果测试失败,则执行该指令的该分支中的命令。 $include
-
该指令将单个文件名作为参数,并从该文件中读取命令和绑定。例如,以下指令从中读取在/ etc / inputrc文件:
$ include / etc / inputrc
Previous:Conditional Init Constructs,Up:Readline Init File [ Contents ] [ Index ]
8.3.3样本初始化文件
以下是inputrc文件的示例。这说明了键绑定,变量赋值和条件语法。
#此文件控制行输入编辑的行为 #使用GNU Readline库的程序。现有 #program包括FTP,Bash和GDB。 # #您可以使用Cx Cr重新读取inputrc文件。 #以'#'开头的行是注释。 # #首先,包括任何系统范围的绑定和变量 来自/ etc / Inputrc的#assignment $ include / etc / Inputrc # #为emacs模式设置各种绑定。 设置编辑模式emacs $ if mode = emacs Meta-Control-h:忽略函数名后面的后向kill-word文本 # #键盘模式下的箭头键 # #“\ M-OD”:后向字符 #“\ M-OC”:forward-char #“\ M-OA”:以前的历史 #“\ M-OB”:下一个历史 # #ANSI模式下的箭头键 # “\ M- [D”:反向字符 “\ M- [C”:forward-char “\ M- [A”:以前的历史 “\ M- [B”:下一个历史 # #8位键盘模式下的箭头键 # #“\ M- \ C-OD”:后向字符 #“\ M- \ C-OC”:forward-char #“\ M- \ C-OA”:以前的历史 #“\ M- \ C-OB”:下一个历史 # #8位ANSI模式下的箭头键 # #“\ M- \ C- [D”:反向字符 #“\ M- \ C- [C”:forward-char #“\ M- \ C- [A”:以前的历史 #“\ M- \ C- [B”:下一个历史 Cq:引用插入 $ ENDIF #旧式绑定。这恰好是默认值。 TAB:完成 #方便shell交互的宏 $如果Bash #编辑路径 “\ C-xp”:“PATH = $ {PATH} \ e \ Ce \ Ca \ ef \ Cf” #准备输入引用的单词 - #insert打开和关闭双引号 #并转到公开引用之后 “\ Cx \”“:”\“\”\ Cb“ #插入一个反斜杠(测试反斜杠转义 #在序列和宏中) “\ Cx \\”:“\\” #引用当前或上一个单词 “\ C-xq”:“\ eb \”\ ef \“” #添加绑定以刷新未绑定的行 “\ C-xr”:重绘当前行 #编辑当前行的变量。 “\ M- \ Cv”:“\ Ca \ Ck $ \ Cy \ M- \ Ce \ Ca \ Cy =” $ ENDIF #如果可用,请使用可见铃声 设置钟形可见 #读取时不要将字符删除到7位 设置input-meta #允许插入iso-latin1字符 #转换为前缀元序列 设置convert-meta关闭 #显示直接设置第8位的字符 #而不是以元加前缀的字符 设置输出元数据 #如果有超过150个可能的完成 #一个字,询问用户是否要查看所有这些内容 设置完成查询项150 #对于FTP $ if Ftp “\ C-xg”:“得到\ M-?” “\ C-xt”:“把\ M-?” “\ M-。”:yank-last-arg $ ENDIF
下一页:Readline vi模式,上一页:Readline Init File,Up:命令行编辑 [ 目录 ] [ 索引 ]
8.4可绑定的Readline命令
• 移动命令: | 移动线。 | |
• 历史命令: | 获得前一行。 | |
• 文本命令: | 用于更改文本的命令。 | |
• 杀戮命令: | 用于杀戮和劫持的命令。 | |
• 数字参数: | 指定数字参数,重复计数。 | |
• 完成命令: | 获取Readline为您打字。 | |
• 键盘宏: | 保存并重新执行键入的字符 | |
• 杂项命令: | 其他杂项命令。 |
本节介绍可能绑定到键序列的Readline命令。您可以通过执行或者更简洁的格式列出适合 inputrc文件的键绑定 。(请参阅Bash Builtins。)默认情况下,没有附带键序列的命令名称是未绑定的。 bind -P
bind -p
在以下描述中,point指的是当前光标位置,而mark指的是set-mark
命令保存的光标位置 。点和标记之间的文本称为区域。
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)
-
无论光标在哪里,都接受该行。如果此行非空,请根据
HISTCONTROL
和HISTIGNORE
变量的设置将其添加到历史列表中。如果此行是已修改的历史记录行,则将历史记录行还原为其原始状态。 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,就会提取参数,就像'!ñ'历史扩张已经明确。
yank-last-arg (M-. or M-_)
-
将最后一个参数插入上一个命令(上一个历史记录条目的最后一个单词)。使用数字参数,行为完全一样
yank-nth-arg
。连续调用yank-last-arg
返回历史列表,依次插入每行的最后一个单词(或参数指定的单词)。提供给这些连续调用的任何数字参数都决定了在历史记录中移动的方向。负参数切换历史记录(向后或向前)。历史扩展工具用于提取最后一个参数,就像'!$'历史扩张已经明确。
下一页:命令杀害,上一篇:命令对于历史,最多:可绑定的ReadLine命令 [ 内容 ] [ 索引 ]
8.4.3更改文本的命令
end-of-file (usually C-d)
-
指示文件结束的字符,例如,设置为
stty
。如果在行上没有字符时读取该字符,并且point位于行的开头,则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()
插入模式启动。在覆盖模式下,字符绑定
self-insert
在点处替换文本而不是将文本推向右侧。字符绑定backward-delete-char
在用空格点之前替换字符。默认情况下,此命令未绑定。
Next:Numeric Arguments,Previous:Text for Commands,Up:Bindable Readline Commands [ Contents ] [ Index ]
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 ()
-
将区域中的文本复制到kill缓冲区,以便立即将其拉出。默认情况下,此命令未绑定。
copy-backward-word ()
-
将点前的单词复制到kill buffer。单词边界是相同的
backward-word
。默认情况下,此命令未绑定。 copy-forward-word ()
-
将以下单词复制到kill buffer。单词边界是相同的
forward-word
。默认情况下,此命令未绑定。 yank (C-y)
-
将杀伤环的顶部猛击到缓冲点处。
yank-pop (M-y)
-
旋转杀死环,并猛拉新的顶部。如果先前的命令是
yank
或,则只能执行此操作yank-pop
。
8.4.5指定数值参数
digit-argument (M-0, M-1, … M--)
-
将此数字添加到已累积的参数中,或启动新参数。 M--开始一个负面的论点。
universal-argument ()
-
这是指定参数的另一种方法。如果此命令后跟一个或多个数字,可选地带有前导减号,则这些数字定义参数。如果该命令后跟数字,则
universal-argument
再次执行将结束数字参数,否则将被忽略。作为一种特殊情况,如果此命令后面紧跟一个既不是数字也不是减号的字符,则下一个命令的参数计数乘以4。参数计数最初为1,因此第一次执行此函数会使参数计数为4,第二次使参数计数为16,依此类推。默认情况下,它不绑定到密钥。
下一页:键盘宏,上一篇:数值参数,最多:可绑定的ReadLine命令 [ 内容 ] [ 索引 ]
8.4.6为您提供Readline类型
complete (TAB)
-
尝试在点之前对文本执行完成。执行的实际完成是特定于应用程序的。Bash尝试完成将文本视为变量(如果文本以'开头'$'),用户名(如果文字以'开头'〜'),主机名(如果文本以'开头'@')或命令(包括别名和函数)依次。如果这些都不产生匹配,则尝试完成文件名。
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文件的格式定义的最后一个keboard宏 。
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扩展)。
history-expand-line (M-^)
-
在当前行上执行历史记录扩展。
magic-space ()
-
在当前行上执行历史记录扩展并插入空格(请参阅历史记录交互)。
alias-expand-line ()
-
在当前行上执行别名扩展(请参阅别名)。
history-and-alias-expand-line ()
-
在当前行上执行历史记录和别名扩展。
insert-last-argument (M-. or M-_)
-
的同义词
yank-last-arg
。 operate-and-get-next (C-o)
-
接受当前行以执行并从历史记录中获取相对于当前行的下一行以进行编辑。任何参数都会被忽略。
edit-and-execute-command (C-xC-e)
-
在当前命令行上调用编辑器,并将结果作为shell命令执行。Bash尝试以 该顺序调用
$VISUAL
,$EDITOR
并emacs
作为编辑器。
8.5 Readline vi模式
虽然Readline库没有完整的vi
编辑功能,但它确实包含足以允许简单编辑行的功能。Readline vi
模式的行为与POSIX标准中的规定相同。
为了在交互式emacs
和vi
编辑模式之间切换,请使用'设置-o emacs'和'设置-o vi'命令(参见Set Builtin)。Readline默认为emacs
模式。
当您在vi
模式中输入一行时,您已经处于“插入”模式,就像您输入了一个'一世”。按ESC 切换到“命令”模式,您可以在其中编辑标准行的文本vi
移动键使用'移动到以前的历史记录行ķ'和随后的线'Ĵ'等等。
下一页:可编程补内置命令,上一篇:的ReadLine vi模式,最多:命令行编辑 [ 内容 ] [ 索引 ]
8.6可编程完成
当尝试使用内置函数(参见可编程完成内置函数)定义了完成规范(compspec)的命令的参数时,可以调用可编程完成工具。 complete
首先,识别命令名称。如果已为该命令定义了compspec,则compspec用于生成该单词的可能完成列表。如果命令字是空字符串(在空行的开头尝试完成),则使用该字符串定义任何compspec-E使用选项complete
。如果命令字是完整路径名,则首先搜索完整路径名的compspec。如果没有找到完整路径名的compspec,则尝试查找最终斜杠后面的部分的compspec。如果这些搜索不会产生compspec,那么任何compspec都会定义-D选项将complete
用作默认值。
找到compspec后,它将用于生成匹配单词列表。如果未找到compspec,则执行上述默认Bash完成(请参阅完成命令)。
首先,使用compspec指定的操作。仅返回以完成的单词为前缀的匹配。当。。。的时候-F 要么 -doption用于文件名或目录名完成,shell变量FIGNORE
用于过滤匹配。有关描述,请参阅Bash变量FIGNORE
。
由文件名扩展模式指定的任何完成 -G选项是下一个生成的。模式生成的单词不需要与正在完成的单词匹配。所述GLOBIGNORE
壳变量不用于过滤的匹配,但FIGNORE
壳变量被使用。
接下来,将字符串指定为参数 -W选项被考虑。首先使用IFS
特殊变量中的字符将字符串拆分为分隔符。壳牌报价很荣幸。然后使用括号扩展,波浪扩展,参数和变量扩展,命令替换和算术扩展来扩展每个单词,如上所述(参见Shell Expansions)。使用上述规则拆分结果(请参阅Word拆分)。扩展的结果与正在完成的单词匹配前缀,匹配的单词成为可能的完成。
生成这些匹配后,使用指定的任何shell函数或命令 -F 和 -C选项被调用。当调用命令或功能,COMP_LINE
, COMP_POINT
,COMP_KEY
,和COMP_TYPE
变量被分配如上所述(参见值bash的变量)。如果正在调用shell函数,则还会设置COMP_WORDS
和 COMP_CWORD
变量。当调用函数或命令时,第一个参数($ 1)是其参数完成的命令的名称,第二个参数($ 2)是正在完成的单词,第三个参数($ 3)是前面的单词在当前命令行上完成的单词。不执行针对正在完成的单词的生成的完成的过滤; 函数或命令在生成匹配时具有完全的自由度。
任何指定的函数 -F首先被调用。该函数可以使用任何shell工具,包括下面描述的 compgen
和compopt
builtins(参见Programmable Completion Builtins)来生成匹配。它必须将可能的完成放在COMPREPLY
数组变量中,每个数组元素一个。
接下来,使用指定的任何命令 -C在与命令替换等效的环境中调用option。它应该打印一个完成列表,每行一个,到标准输出。如有必要,可以使用反斜杠来转义换行符。
生成所有可能的完成后,使用指定的任何过滤器 -X选项应用于列表。过滤器是用于路径名扩展的模式; 一个 '&'在模式中被替换为正在完成的单词的文本。文字'&'可以用反斜杠逃脱; 在尝试匹配之前删除反斜杠。任何与模式匹配的完成都将从列表中删除。一个领先的'!'否定了这种模式; 在这种情况下,任何与模式不匹配的完成都将被删除。如果nocasematch
shell选项(见的描述shopt
中shopt内建)被启用时,不考虑字母的情况下进行比赛。
最后,使用指定的任何前缀和后缀 -P 和 -S 选项将添加到完成列表的每个成员,并将结果作为可能的完成列表返回到Readline完成代码。
如果先前应用的操作不生成任何匹配,则 -o dirnamescomplete
如果定义了compspec,则会提供选项,尝试完成目录名称。
如果 -o plusdirscomplete
如果定义了compspec,则会提供选项,尝试完成目录名称,并将任何匹配添加到其他操作的结果中。
默认情况下,如果找到compspec,它生成的任何内容都将作为完整的可能完成集返回到完成代码。不尝试默认的Bash完成,并禁用Readline默认的文件名完成。如果-o bashdefaultcomplete
如果定义了compspec,则提供选项,如果compspec没有生成匹配项,则尝试使用默认的Bash完成。如果- 默认complete
如果定义了compspec,则提供选项,如果compspec(以及,如果尝试,默认的Bash完成)不生成匹配,则将执行Readline的默认完成。
当compspec指示需要完成目录名称时,可编程完成函数强制Readline将斜杠附加到已完成的名称,这些名称是目录的符号链接,受标记目录 Readline变量的值的限制,无论标记的设置如何-symlinked-directories读取变量。
有一些动态修改完成的支持。当与指定的默认完成结合使用时,这非常有用-D。作为完成处理程序执行的shell函数可以通过返回124的退出状态来指示完成应该重试。如果shell函数返回124,并更改与正在尝试完成的命令相关联的compspec(作为第一个提供)执行函数时的参数),可编程完成从头开始重新启动,尝试为该命令找到新的compspec。这允许在尝试完成时动态构建一组完成,而不是一次性加载。
例如,假设有一个compspec库,每个都保存在与命令名对应的文件中,以下默认完成函数将动态加载完成:
_completion_loader() { 。“/etc/bash_completion.d/$1.sh”> / dev / null 2>&1 &&返回124 } 完成-D -F _completion_loader -o bashdefault -o default
8.7可编程完成内置
有三个内置命令可用于操作可编程完成工具:一个用于指定如何完成特定命令的参数,另外两个用于修改完成时的完成。
compgen
-
compgen [option] [word]
根据选项 s 生成可能的单词完成匹配,可以是 内置接受的任何选项 ,但不包括
complete
-p 和 -r,并将匹配项写入标准输出。使用时-F 要么 -C 选项,可编程完成工具设置的各种shell变量虽然可用,但没有有用的值。匹配将以与可编程完成代码直接从具有相同标志的完成规范生成它们相同的方式生成。如果指定了单词,则仅 显示匹配单词的那些完成。
除非提供了无效选项,否则返回值为true,或者未生成任何匹配项。
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 …]
指定应如何完成每个名称的参数。如果-p提供选项,或者如果未提供选项,则以允许将它们重新用作输入的方式打印现有完成规范。该-r选项删除每个名称的完成规范,如果没有提供名称,则删除所有完成规范。该-D选项表示其余选项和操作应适用于“默认”命令完成; 也就是说,在先前未定义完成的命令上尝试完成。该-E选项表示其余选项和操作应适用于“空”命令完成; 也就是说,在空白行上尝试完成。
尝试完成单词时应用这些完成规范的过程如上所述(参见可编程完成)。该 -D 选项优先于 -E。
其他选项(如果指定)具有以下含义。对此的论点-G, -W,和 -X 选项(如有必要,还有 -P 和 -S应该引用选项)以在
complete
调用内置函数之前保护它们不被扩展 。-o comp-option
-
该补偿选项控制超越了简单的代补全compspec行为的几个方面。 comp-option可能是以下之一:
bashdefault
-
如果compspec没有生成匹配项,则执行其余的默认Bash完成。
default
-
如果compspec没有生成匹配项,请使用Readline的默认文件名完成。
dirnames
-
如果compspec没有生成匹配项,则执行目录名称完成。
filenames
-
告诉Readline compspec生成文件名,因此它可以执行任何特定于文件名的处理(比如在引用特殊字符的目录名称中添加斜杠,或者抑制尾随空格)。此选项旨在与指定的shell函数一起使用-F。
noquote
-
如果文件名是文件名,则告诉Readline不要引用已完成的单词(引用文件名是默认名称)。
nosort
-
告诉Readline不要按字母顺序对可能的完成列表进行排序。
nospace
-
告诉Readline不要在行尾添加一个空格(默认值)。
plusdirs
-
生成compspec定义的任何匹配项后,将尝试完成目录名称,并将任何匹配项添加到其他操作的结果中。
-A action
-
该操作可以是以下之一,以生成可能的完成列表:
alias
-
别名。也可以指定为-一个。
arrayvar
-
数组变量名。
binding
-
Readline键绑定名称(请参阅Bindable 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变量)。 job
-
作业名称,如果作业控制处于活动状态。也可以指定为-j。
keyword
-
壳保留字。也可以指定为-k。
running
-
如果作业控制处于活动状态,则运行作业的名称。
service
-
服务名称。也可以指定为-s。
setopt
-
有效的参数 -o
set
内置选项(参见Set Builtin)。 shopt
-
shopt
内置接受的Shell选项名称(请参阅Bash Builtins)。 signal
-
信号名称。
stopped
-
如果作业控制处于活动状态,则已停止作业的名称。
user
-
用户名。也可以指定为-u。
variable
-
所有shell变量的名称。也可以指定为-v。
-C command
-
命令在子shell环境中执行,其输出用作可能的完成。
-F function
-
shell函数函数在当前shell环境中执行。执行时,$ 1是其参数完成的命令的名称,$ 2是要完成的字,$ 3是完成的字之前的字,如上所述(参见可编程完成)。完成后,从
COMPREPLY
数组变量的值中检索可能的完成。 -G globpat
-
扩展文件名扩展模式globpat以生成可能的完成。
-P prefix
-
在应用所有其他选项后,在每个可能的完成开始时添加前缀。
-S suffix
-
在应用所有其他选项后,后缀将附加到每个可能的完成。
-W wordlist
-
使用特殊变量中的字符作为分隔符将单词列表拆分
IFS
,并扩展每个结果单词。可能的完成是结果列表的成员,其匹配正在完成的单词。 -X filterpat
-
filterpat是用于文件名扩展的模式。它应用于前面的选项和参数生成的可能完成列表,并从列表中删除每个完成匹配 filterpat。一个领先的'!'在filterpat中否定了模式; 在这种情况下,将删除任何不匹配filterpat的完成。
除非提供了无效选项,否则返回值为true,除了。之外的选项 -p 要么 -r在没有name 参数的情况下提供,尝试删除不存在规范的名称的完成规范,或者添加完成规范时发生错误。
compopt
-
compopt
[-o 选项 ] [-DE] [+ o 选项 ] [ 名称 ]根据 选项 s 修改每个名称的完成选项,如果没有提供名称,则修改当前执行的完成选项。如果未给出选项,则显示每个名称或当前完成的完成选项 。option的可能值是对上述 内置函数有效的值。该
complete
-D选项表示其余选项应适用于“默认”命令完成; 也就是说,在先前未定义完成的命令上尝试完成。该-E选项表示其余选项应适用于“空”命令完成; 也就是说,在空白行上尝试完成。该 -D 选项优先于 -E。
除非提供了无效选项,否则返回值为true,尝试修改不存在完成规范的名称的选项,或者发生输出错误。
8.8可编程完成示例
获得超出默认操作complete
和compgen
提供的附加完成功能的最常用方法是使用shell函数并使用它将其绑定到特定命令complete -F
。
以下函数为cd
内置函数提供了完成。它是用于完成时shell函数必须执行的一个相当好的示例。此函数使用passsed一词$2
来确定要完成的目录名称。你也可以使用 COMP_WORDS
数组变量; 当前单词由COMP_CWORD
变量索引 。
该函数依赖于complete
和compgen
builtins来完成大部分工作,仅添加Bash cd
所做的事情,而不仅仅是接受基本目录名:tilde expansion(参见Tilde Expansion),在$ CDPATH中搜索目录,如上所述(参见Bourne Shell) Builtins),以及对cdable_vars
shell选项的基本支持(参见The Shopt Builtin)。 _comp_cd
修改IFS的值,使其仅包含一个换行符,以容纳包含空格和制表符的文件名 - compgen
打印每行生成一个可能的完成。
可能的完成进入COMPREPLY数组变量,每个数组元素一次完成。可编程完成系统在函数返回时从那里检索完成。
#cn内置的完成功能 #基于bash_completion包中的cd完成函数 _comp_cd() { 本地IFS = $'\ t \ n'#normalize IFS 本地cur _skipdot _cdpath 当地的ijk #Tilde扩展,具有扩展波浪号到全路径名的副作用 案件“$ 2”in \〜*)eval cur =“$ 2”;; *)cur = $ 2 ;; ESAC #no cdpath或绝对路径名 - 直接目录完成 if [[-z“$ {CDPATH: - }”]] || [[“$ cur”== @(./* | ../* | / *)]]; 然后 #compgen每行打印一个路径; 也可以使用while循环 IFS = $ '\ n' COMPREPLY =($(compgen -d - “$ cur”)) IFS = $'\ t \ n' #CDPATH +当前目录中的目录(如果不在CDPATH中) 其他 IFS = $ '\ n' _skipdot = FALSE #preprocess CDPATH将null目录名转换为。 _cdpath = $ {CDPATH /#:/:} _cdpath = $ {_ CDPATH // :: /:。:} _cdpath = $ {_ CDPATH /%:/ :.} for $ in $ {_ cdpath //:/ $'\ n'}; 做 如果[[$ i -ef。]]; 然后_skipdot = true; 科幻 K = “$ {#COMPREPLY [@]}” for j in $(compgen -d - “$ i / $ cur”); 做 COMPREPLY [k ++] = $ {j#$ i /}#切断目录 DONE DONE $ _skipdot || COMPREPLY + =($(compgen -d - “$ cur”)) IFS = $'\ t \ n' 科幻 #varname如果设置了适当的shell选项并且没有完成 如果shopt -q cdable_vars && [[$ {#COMPLPLY [@]} -eq 0]]; 然后 COMPREPLY =($(compgen -v - “$ cur”)) 科幻 返回0 }
我们使用安装完成功能 -F选项 complete
:
#告诉readline引用适当的内容并在目录中添加斜杠; #对其他参数使用bash默认完成 完成-o filenames -o nospace -o bashdefault -F _comp_cd cd
由于我们希望Bash和Readline为我们处理其他一些细节,因此我们使用其他几个选项来告诉Bash和Readline要做什么。该-o文件名选项告诉Readline应将可能的完成视为文件名,并适当引用。该选项还将导致Readline将一个斜杠附加到它可以确定为目录的文件名(这就是为什么我们可能希望扩展_comp_cd
以在我们使用通过CDPATH找到的目录时附加斜杠:Readline无法告诉那些完成是目录) 。该-o nospace选项告诉Readline不要在目录名称后附加空格字符,以防我们想要附加到它。该-o bashdefault选项带来剩余的“Bash默认”完成 - 可能完成Bash添加到默认的Readline集。这些包括命令名称完成,以'开头的单词的变量完成{',包含路径名扩展模式的完成(请参阅文件名扩展),等等。
一旦安装使用complete
,_comp_cd
每次我们为cd
命令尝试单词完成时都会调用。
更多示例 - 大多数常见GNU,Unix和Linux命令的大量完成集合 - 可作为bash_completion项目的一部分提供。默认情况下,这安装在许多GNU / Linux发行版上。该项目最初由Ian Macdonald编写,目前居住在http://bash-completion.alioth.debian.org/。有其他系统的端口,如Solaris和Mac OS X.
旧版本的bash_completion包与bash一起发布 例子/完整 子目录。
9交互式使用历史记录
本章从用户的角度描述了如何以交互方式使用GNU历史库。它应该被视为用户指南。有关在其他程序中使用GNU历史库的信息,请参阅GNU Readline Library Manual。
• Bash历史设施: | Bash如何让您操纵命令历史记录。 | |
• Bash History Builtins: | Bash内置命令,用于操作命令历史记录。 | |
• 历史互动: | 使用History作为用户的感觉。 |
下一篇:Bash History Builtins,Up:以交互方式使用历史 [ 目录 ] [ 索引 ]
9.1 Bash历史设施
当。。。的时候 - 历史set
启用了内置选项(请参阅Set Builtin),shell提供对命令历史记录的访问,该命令历史记录是先前键入的命令列表。所述的值HISTSIZE
壳变量被用作命令的数量中的历史列表进行保存。$HISTSIZE
保存最后一个命令的文本(默认为500)。shell在参数和变量扩展之前将每个命令存储在历史列表中,但是在执行历史扩展之后,根据shell变量的值 HISTIGNORE
和HISTCONTROL
。
shell启动时,将从HISTFILE
变量命名的文件初始化历史记录(默认值)〜/ .bash_history的)。HISTFILE
如果需要,由值命名的文件将被截断,以包含不超过HISTFILESIZE
变量值指定的行数。当启用了历史记录的shell退出时,最后 $HISTSIZE
一行将从历史列表复制到名为的文件$HISTFILE
。如果histappend
设置了shell选项(请参阅Bash Builtins),则这些行将附加到历史记录文件中,否则将覆盖历史记录文件。如果HISTFILE
未设置,或者历史文件不可写,则不保存历史记录。保存历史记录后,历史文件将被截断为仅包含$HISTFILESIZE
行。如果HISTFILESIZE
未设置,或设置为null,非数字值或小于零的数值,则不会截断历史记录文件。
如果HISTTIMEFORMAT
设置了,则将与每个历史条目相关联的时间戳信息写入历史文件,用历史注释字符标记。读取历史文件时,以历史注释字符开头,后面紧跟数字的行将被解释为以下历史记录条目的时间戳。
内置命令fc
可用于列出或编辑和重新执行历史列表的一部分。该history
内建可以用来显示或修改历史列表和操作历史文件。使用命令行编辑时,在每种编辑模式下都可以使用搜索命令来访问历史列表(请参阅历史命令)。
shell允许控制在历史列表中保存哪些命令。该HISTCONTROL
和HISTIGNORE
变量可以被设置为导致shell只保存输入命令的一个子集。该cmdhist
shell选项,如果已启用,导致shell尝试保存多行命令的每一行中相同的历史条目,将分号在必要时维护语法的正确性。该lithist
外壳选项使得shell保存嵌入的新行而不是分号的命令。该shopt
内置用于设置这些选项。有关说明,请参阅Bash Builtinsshopt
。
9.2 Bash History Builtins
Bash提供了两个内置命令来操作历史列表和历史文件。
fc
-
fc [-e ename] [-lnr] [first] [last]
fc -s [pat=rep] [command]
第一种形式中选择的范围内的命令的第一至 最后从历史列表并显示或编辑和重新执行它们。这两个第一和 最后一个可以被指定为字符串(以定位与字符串开头的最近的命令)或数字(索引到历史列表,其中负号被用作从当前命令号的偏移)。如果未指定last,则将其设置为 first。如果未指定first,则将其设置为上一个用于编辑的命令,将-16设置为列表。如果-l如果给出了标志,则命令列在标准输出上。该-nflag在列出时禁止命令编号。该-rflag会颠倒列表的顺序。否则,将在包含这些命令的文件上调用ename给出的编辑器 。如果 未给出ename,则使用以下变量扩展的值:
${FCEDIT:-${EDITOR:-vi}}
。这表示使用FCEDIT
变量的值(如果设置),或变量的值(EDITOR
如果已设置),或者vi
两者都未设置。编辑完成后,将回显并执行编辑的命令。在第二种形式中,指令被的每个实例之后重新执行轻拍在所选择的命令被替换为代表。 命令被intepreted相同第一上方。
与
fc
命令一起使用的有用别名是r='fc -s'
,因此键入'r cc'运行最后一个命令cc
并输入'[R'重新执行最后一个命令(参见别名)。 history
-
历史[ n ] 历史-c 历史记录-d 偏移 历史记录[-anrw] [ 文件名 ] 历史-ps arg
如果没有选项,请使用行号显示历史记录列表。前缀为''的行*'已被修改。n的参数仅列出最后n行。如果shell变量
HISTTIMEFORMAT
已设置且不为null,则将其用作strftime的格式字符串,以显示与每个显示的历史记录条目关联的时间戳。在格式化的时间戳和历史记录行之间不打印中间空白。选项(如果提供)具有以下含义:
-c
-
清除历史列表。这可以与其他选项组合以完全替换历史列表。
-d offset
-
删除位置偏移处的历史记录条目。 应指定显示历史记录时显示的偏移量。
-a
-
将新历史记录行附加到历史记录文件。这些是自当前Bash会话开始以来输入的历史记录行,但尚未附加到历史记录文件中。
-n
-
将尚未从历史文件中读取的历史记录行附加到当前历史记录列表。这些是自当前Bash会话开始以来附加到历史文件的行。
-r
-
读取历史记录文件并将其内容附加到历史记录列表中。
-w
-
将当前历史列表写出到历史文件。
-p
-
在arg上执行历史记录替换并在标准输出上显示结果,而不将结果存储在历史记录列表中。
-s
-
将ARG s的添加到历史记录列表作为单个条目的末尾。
当任何一个 -w, -r, -一个, 要么 -n如果 给出了filename,则使用选项,然后将其用作历史文件。如果不是,则
HISTFILE
使用变量的值。
上一篇:Bash History Builtins,Up:以交互方式使用历史 [ 目录 ] [ 索引 ]
9.3历史扩展
历史记录库提供了与历史记录扩展类似的历史记录扩展功能csh
。本节介绍用于操作历史信息的语法。
历史扩展将历史列表中的单词引入输入流,从而可以轻松地重复命令,将前一个命令的参数插入当前输入行,或者快速修复先前命令中的错误。
在读取完整行之后,在shell将其分解为单词之前立即执行历史记录扩展。
历史扩展分为两部分。第一种是确定在替换期间应该使用历史列表中的哪一行。第二种是选择该行的部分以包含在当前行中。从历史记录中选择的行称为 事件,该行的部分被称为单词。各种修饰符可用于操纵所选单词。该行以与Bash相同的方式分解为单词,因此用引号括起来的几个单词被认为是一个单词。历史扩展是由历史扩展特征的出现引入的,即'!' 默认情况下。只要 '\'和'“'可以用于转义历史扩展字符,但如果历史扩展字符紧跟在双引号字符串中的结束双引号之前,则它也会被视为引用。
可以使用内置的几个shell选项shopt
(参见Bash Builtins)来定制历史扩展的行为。如果histverify
启用了 shell选项,并且正在使用Readline,则历史记录替换不会立即传递给shell解析器。而是将展开的行重新加载到Readline编辑缓冲区中以进行进一步修改。如果正在使用Readline,并且histreedit
启用了shell选项,则会将失败的历史记录扩展重新加载到Readline编辑缓冲区中进行更正。该-phistory
内置命令的选项可用于查看历史扩展在使用之前将执行的操作。该-shistory
内置选项可用于将命令添加到历史列表的末尾而不实际执行它们,以便它们可用于后续调用。这与Readline一起使用最为有用。
shell允许使用histchars
变量控制历史扩展机制使用的各种字符,如上所述(参见Bash变量)。shell在编写历史文件时使用历史注释字符标记历史时间戳。
• 活动指示人: | 如何指定要使用的历史记录行。 | |
• Word指示符: | 指定哪些词是感兴趣的。 | |
• 修饰符: | 修改替换结果。 |
9.3.1事件指示符
事件指示符是对历史列表中命令行条目的引用。除非引用是绝对的,否则事件相对于历史列表中的当前位置。
!
-
开始历史记录替换,除非后跟空格,制表符,行尾,'=' 要么 '('(
extglob
使用shopt
内置函数启用shell选项时 )。 !n
-
请参阅命令行n。
!-n
-
请参阅命令n行。
!!
-
请参阅上一个命令。这是'的同义词'!-1”。
!string
-
请参阅以字符串开头的历史列表中当前位置之前的最新命令。
!?string[?]
-
请参阅包含字符串的历史记录列表中当前位置之前的最新命令。尾随'?如果字符串后面紧跟一个换行符,则可以省略。
^string1^string2^
-
快速换人。重复上一个命令,将string1替换 为string2。相当于 。
!!:s/string1/string2/
!#
-
到目前为止输入的整个命令行。
9.3.2 Word指示符
Word指示符用于从事件中选择所需的单词。一个 ':'将事件规范与单词指示符分开。如果单词指示符以''开头,则可以省略^','$','*','- ', 要么 '%”。单词从行的开头编号,第一个单词用0(零)表示。单词被插入到由单个空格分隔的当前行中。
例如,
!!
-
指定前面的命令。键入此内容时,将重复上述命令。
!!:$
-
指定前一个命令的最后一个参数。这可以缩短为
!$
。 !fi:2
-
指定以字母开头的最新命令的第二个参数
fi
。
以下是单词指示符:
0 (zero)
-
第二
0
个字。对于许多应用程序,这是命令字。 n
-
第n个字。
^
-
第一个论点; 也就是说,第1个字。
$
-
最后一个论点。
%
-
这个词与最近的'匹配'?字符串?'搜索。
x-y
-
一系列的话; “- ÿ'缩写'0- y”。
*
-
所有的话,除了
0
th。这是'的同义词'1- $”。使用'不是错误'*'如果事件只有一个字; 在这种情况下返回空字符串。 x*
-
缩写'x - $“
x-
-
缩写'x - $' 喜欢 'x *',但省略了最后一个字。
如果提供的字指示符没有事件规范,则将上一个命令用作事件。
9.3.3修饰符
在可选的单词指示符之后,您可以添加一个或多个以下修饰符的序列,每个修饰符前面都有一个':”。
h
-
删除尾随路径名组件,只留下头部。
t
-
删除所有前导路径名组件,留下尾部。
r
-
删除表单'的尾随后缀。后缀',留下基名。
e
-
删除除尾随后缀之外的所有内容。
p
-
打印新命令但不执行它。
q
-
引用替换的单词,逃避进一步的替换。
x
-
引用替换的单词与'q',但在空格,制表符和换行符中分成单词。
s/old/new/
-
在事件行中替换new为第一次出现的old。可以使用任何分隔符代替'/”。可以 使用单个反斜杠以旧的和新的引用分隔符。如果'&'出现在新的,它被旧的取代。一个反斜杠就会引用'&”。如果最终分隔符是输入行上的最后一个字符,则它是可选的。
&
-
重复上一次替换。
g
a
-
导致更改应用于整个事件行。与'一起使用'小号',如在'或'与'
gs/old/new/
&”。 G
-
应用以下'小号'修饰符一次到事件中的每个单词。
10安装Bash
本章提供在各种支持的平台上安装Bash的基本说明。该发行版支持 GNU操作系统,几乎每个Unix版本,以及几个非Unix系统,如BeOS和Interix。MS-DOS,OS / 2和Windows平台存在其他独立端口 。
• 基本安装: | 安装说明。 | |
• 编译器和选项: | 如何为各种系统设置特殊选项。 | |
• 编译多个体系结构: | 如何从同一源代码树中为多种系统编译Bash。 | |
• 安装名称: | 如何设置安装使用的各种路径。 | |
• 指定系统类型: | 如何为特定系统配置Bash。 | |
• 共享默认值: | 如何在GNU程序之间共享默认配置值。 | |
• 操作控制: | 配置程序识别的选项。 | |
• 可选功能: | 如何在构建Bash时启用和禁用可选功能。 |
10.1基本安装
这些是Bash的安装说明。
编译Bash最简单的方法是:
cd
到包含源代码的目录并输入'。/配置'为您的系统配置Bash。如果您在csh
旧版本的System V上使用,则可能需要输入'sh ./configure'而是为了防止csh
试图自己执行configure
。跑步
configure
需要一些时间。在运行时,它会打印消息,告知它正在检查哪些功能。- 输入'使'编译Bash并构建
bashbug
错误报告脚本。 - (可选)输入'做测试'运行Bash测试套件。
- 输入'make install'安装
bash
和bashbug
。这也将安装手册页和Info文件。
该configure
shell脚本试图猜测编译过程中使用的各种系统相关的变量的正确值。它使用这些值来创建Makefile文件 在包的每个目录中(顶层目录, 内建, DOC,和 支持 目录,每个目录下 LIB,以及其他几个)。它还创造了一个 config.h中包含系统相关定义的文件。最后,它创建一个名为的shell脚本config.status
,以后可以运行以重新创建当前配置,即文件config.cache的 它可以保存测试结果以加快重新配置和文件 的config.log包含编译器输出(主要用于调试configure
)。如果在某个时候 config.cache的 包含您不想保留的结果,您可以删除或编辑它。
要了解有关configure
脚本理解的选项和参数的更多信息 ,请键入
bash-2.04 $ ./configure --help
在Bash源目录中的Bash提示符下。
如果您需要做一些不寻常的事情来编译Bash,请尝试弄清楚如何configure
检查是否可以执行它们,并将差异或说明邮寄到 bash-maintainers@gnu.org,以便它们可以考虑用于下一个版本。
文件 configure.ac用于configure
通过名为Autoconf的程序创建。你只需要 configure.ac如果你想改变它或configure
使用更新版本的Autoconf 重新生成 。如果这样做,请确保您使用的是Autoconf 2.50或更高版本。
您可以通过键入'从源代码目录中删除程序二进制文件和目标文件'干净”。要删除configure
创建的文件(这样您可以为其他类型的计算机编译Bash),请键入'使distclean”。
10.2编译器和选项
某些系统需要不常用的编译或链接选项,configure
脚本不知道。您可以configure
通过在环境中设置变量来为变量提供初始值。使用与Bourne兼容的shell,您可以在命令行上执行此操作,如下所示:
CC = c89 CFLAGS = -O2 LIBS = -lposix ./configure
在具有该env
程序的系统上,您可以这样做:
env CPPFLAGS = -I / usr / local / include LDFLAGS = -s ./configure
如果Bash可用,配置过程使用GCC来构建Bash。
10.3编译多个体系结构
通过将每个体系结构的目标文件放在它们自己的目录中,您可以同时为多种计算机编译Bash。为此,您必须使用make
支持该VPATH
变量的版本,例如GNU make
。 cd
到目标文件和可执行文件所在的目录,并configure
从源目录运行该脚本。您可能需要提供--srcdir = PATH告诉configure
源文件在哪里的参数。 configure
自动检查configure
“...”中和中的目录中的源代码。
如果必须使用make
不支持该VPATH
变量的变量,则可以在源代码目录中一次为一个体系结构编译Bash。在为一个体系结构安装Bash后,使用'使distclean'在重新配置另一个架构之前。
或者,如果您的系统支持符号链接,则可以使用 支持/ 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。
10.4安装名称
默认情况下, 'make install'将安装到 在/ usr / local / bin目录, 在/ usr /本地/人等等。您可以指定除以外的安装前缀 在/ usr /本地通过提供configure
选项--prefix = PATH,或通过指定DESTDIR
' 的值使'跑步时变量'make install”。
您可以为体系结构特定文件和与体系结构无关的文件指定单独的安装前缀。如果你给configure
了选项 --exec-prefix = PATH,'make install'将使用 PATH作为安装程序和库的前缀。文档和其他数据文件仍将使用常规前缀。
10.5指定系统类型
可能有一些功能configure
无法自动弄清楚,但需要通过主机Bash的类型来确定运行。通常configure
可以解决这个问题,但是如果它打印出一条消息,说它无法猜出主机类型,请给它主机= TYPE选项。“类型'可以是系统类型的简称,例如'sun4',或带有三个字段的规范名称:'CPU-COMPANY-SYSTEM'(例如''I386的未知freebsd4.2“)。
看文件 支持/ config.sub 对于每个字段的可能值。
10.6共享默认值
如果您要设置其默认值configure
脚本共享,你可以创建一个名为网站shell脚本 config.site
,让默认值变量一样 CC
,cache_file
和prefix
。 configure
寻找PREFIX /股/ config.site 如果它存在,那么 PREFIX的/ etc / config.site如果它存在 或者,您可以将CONFIG_SITE
环境变量设置 为站点脚本的位置。警告:Bash configure
查找站点脚本,但并非所有configure
脚本都这样做。
10.7操作控制
configure
识别以下选项以控制其运行方式。
--cache-file=file
-
使用和测试的结果保存在 文件中,而不是./config.cache。将文件设置为 的/ dev / null的禁用缓存,进行调试
configure
。 --help
-
打印选项摘要
configure
,然后退出。 --quiet
--silent
-q
-
不要打印说明正在进行哪些检查的消息。
--srcdir=dir
-
在目录dir中查找Bash源代码。通常
configure
可以自动确定该目录。 --version
-
打印用于生成
configure
脚本的Autoconf版本,然后退出。
configure
还接受一些其他未广泛使用的样板选项。“configure --help'打印完整列表。
10.8可选功能
Bash configure
有很多--enable- 功能 选项,功能表示Bash的可选部分。还有几个--with- 包选项,包裹是类似的'庆典-的malloc' 要么 '净化”。要关闭包的默认使用,请使用 --without- 包。要在没有默认启用的功能的情况下配置Bash,请使用--disable- 功能。
这是完整的清单 --enable- 和 --with-Bash configure
识别的选项。
--with-afs
-
定义您是否使用Transarc的Andrew文件系统。
--with-bash-malloc
-
使用
malloc
目录中的Bash版本 LIB /的malloc。这与 GNU libcmalloc
中出现的不同,但旧版本最初源自4.2 BSD。这个malloc
malloc
非常快,但每次分配都浪费了一些空间。默认情况下启用此选项。该笔记file包含应关闭此系统的系统列表,并configure
自动为许多系统禁用此选项。 --with-curses
-
使用curses库而不是termcap库。如果您的系统具有不充分或不完整的termcap数据库,则应提供此选项。
--with-gnu-malloc
-
的同义词
--with-bash-malloc
。 --with-installed-readline[=PREFIX]
-
定义此项以使Bash链接与本地安装的Readline版本而不是版本 LIB /的ReadLine。这仅适用于Readline 5.0及更高版本。如果PREFIX是
yes
或不提供,configure
使用化妆变量的值includedir
和libdir
,这是子目录prefix
默认情况下,找到的ReadLine的安装版本,如果它不是在标准系统和库目录。如果是PREFIXno
,则Bash链接到版本中 LIB /的ReadLine。如果PREFIX设置为任何其他值,configure
将其视为一个目录路径并查找的Readline在该目录的子目录中安装的版本(包括文件PREFIX /include
和图书馆 PREFIX /lib
)。 --with-purify
-
将其定义为使用Rational Software的Purify内存分配检查程序。
--enable-minimal-config
-
这会生成一个具有最小功能的shell,靠近历史悠久的Bourne shell。
有几个 --enable- 用于更改Bash编译和链接方式的选项,而不是更改运行时功能。
--enable-largefile
-
如果操作系统需要特殊的编译器选项来构建可以访问大文件的程序,则启用对大文件的支持。如果操作系统提供大文件支持,则默认情况下启用此选项。
--enable-profiling
-
这将构建一个Bash二进制文件,生成
gprof
每次执行时要处理的分析信息。 --enable-static-link
-
这会导致Bash静态链接,如果
gcc
正在使用的话。这可以用于构建一个版本以用作root的shell。
''最小的,配置'选项可用于禁用以下所有选项,但首先处理它,因此可以使用'启用单个选项'启用功能”。
以下所有选项除'残疾内建','direxpand默认','和'XPG回波默认'默认情况下已启用,除非操作系统未提供必要的支持。
--enable-alias
-
允许别名扩展并包含
alias
和unalias
builtins(请参阅别名)。 --enable-arith-for-command
-
包括对
for
命令的替代形式的支持,其行为类似于C语言for
语句(请参阅循环结构)。 --enable-array-variables
-
包括对一维数组shell变量的支持(请参阅数组)。
--enable-bang-history
-
包括对
csh
类似历史替换的支持(请参阅历史交互)。 --enable-brace-expansion
-
包括
csh
类支撑扩展(b{a,b}c
→bac bbc
)。有关完整说明,请参阅Brace Expansion。 --enable-casemod-attributes
-
在
declare
内置和赋值语句中包含对大小写修改属性的支持。例如,具有大写属性的变量将在赋值时将其值转换为大写。 --enable-casemod-expansion
-
包括对案例修改单词扩展的支持。
--enable-command-timing
-
包括支持识别
time
为保留字和显示后续管道的时序统计信息time
(请参阅管道)。这允许管道以及shell内置和函数定时。 --enable-cond-command
-
包括对
[[
条件命令的支持。(参见条件结构)。 --enable-cond-regexp
-
包括对匹配POSIX的支持使用'正则表达式的=〜'
[[
条件命令中的二元运算符。(参见条件结构)。 --enable-coprocesses
-
包括对协同处理和
coproc
保留字的支持(请参阅管道)。 --enable-debugger
-
包括对bash调试器的支持(单独分发)。
--enable-direxpand-default
-
导致shell启动时默认启用
direxpand
shell选项(请参阅Shopt Builtin)。通常默认情况下禁用它。 --enable-directory-stack
-
包括支持
csh
样目录栈和pushd
,popd
以及dirs
内建命令(见目录栈)。 --enable-disabled-builtins
-
允许通过'调用内置命令内置xxx'即使在
xxx
被禁用后'启用-n xxx”。有关内置命令builtin
和enable
内置命令的详细信息,请参阅Bash Builtins。 --enable-dparen-arithmetic
-
包括对
((…))
命令的支持(请参阅条件构造)。 --enable-extended-glob
-
包括用于延长图案匹配下上述功能的支持模式匹配。
--enable-extended-glob-default
-
设置要在“Shopt Builtin”下启用的上述extglob shell选项的默认值。
--enable-function-import
-
包括对从环境中导入另一个shell实例导出的函数定义的支持。默认情况下启用此选项。
--enable-glob-asciirange-default
-
设置要在“Shopt Builtin”下启用的上述globasciiranges shell选项的默认值。当在模式匹配括号表达式中使用时,它控制字符范围的行为。
--enable-help-builtin
-
包括
help
内置,它显示shell内置和变量的帮助(参见Bash Builtins)。 --enable-history
-
包括命令历史,
fc
并history
内建命令(见击史设施)。 --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
-
使用Bash版本的Readline库包括对命令行编辑和历史记录的支持(请参阅命令行编辑)。
--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模式)。
--enable-usg-echo-default
-
的同义词
--enable-xpg-echo-default
。 --enable-xpg-echo-default
-
echo
默认情况下,使内置扩展反斜杠转义字符,而不需要-e选项。这将xpg_echo
shell选项的默认值设置为on
,这使得Bash的echo
行为更像是单Unix规范版本3中指定的版本。有关可识别的转义序列的说明, 请参阅Bash Builtinsecho
。
文件 配置-top.h 包含C预处理器'#限定'对于无法设定的选项的陈述 configure
。其中一些并不意味着要改变; 如果你这样做,请注意后果。阅读与每个定义相关的注释,以获取有关其效果的更多信息。
下一篇:与Bourne Shell的主要区别,上一篇:安装Bash,Up:Top [ 目录 ] [ 索引 ]
附录A报告错误
请报告您在Bash中找到的所有错误。但首先,你应该确保它确实是一个bug,并且它出现在最新版本的Bash中。从ftp://ftp.gnu.org/pub/gnu/bash/可以获得最新版本的Bash 。
一旦确定实际存在错误,请使用该 bashbug
命令提交错误报告。如果您有修复,我们也鼓励您发送邮件!建议和“哲学”错误报告可以邮寄到bug-bash@gnu.org或发布到Usenet新闻组gnu.bash.bug
。
所有错误报告应包括:
- Bash的版本号。
- 硬件和操作系统。
- 编译器用于编译Bash。
- 错误行为的描述。
- 一个简短的脚本或“食谱”,用于修复错误并可用于重现它。
bashbug
将前三项自动插入到提供错误报告的模板中。
请将有关本手册的所有报告发送至 bug-bash@gnu.org。
下一篇:GNU自由文档许可证,上一篇:报告错误,上一篇:顶部 [ 目录 ] [ 索引 ]
附录B与Bourne Shell的主要区别
Bash实现了与Bourne Shell基本相同的语法,参数和变量扩展,重定向和引用。Bash使用POSIX标准作为如何实现这些功能的规范。传统的Bourne shell和Bash之间存在一些差异; 本节快速详细说明了重要性的差异。前面几节将更深入地解释其中的一些差异。本节使用sh
SVR4.2 中包含的版本(历史Bourne shell的最新版本)作为基线参考。
- Bash是POSIX -conformant,即使POSIX规范与传统
sh
行为不同(参见Bash POSIX模式)。 - Bash具有多字符调用选项(请参阅调用Bash)。
- Bash有命令行编辑(参见命令行编辑)和
bind
内置命令。 - 击提供了一个可编程的词完成机制(见可编程完成),以及内置命令
complete
,compgen
以及compopt
,以操纵它。 - Bash有命令历史(参见Bash历史设施)
history
和fc
内置操作它。Bash历史列表维护时间戳信息,并使用HISTTIMEFORMAT
变量的值来显示它。 - Bash实现了
csh
类似的历史扩展(参见历史交互)。 - Bash有一维数组变量(参见数组),以及使用它们的相应变量扩展和赋值语法。一些Bash内置程序可以选择对数组进行操作。Bash提供了许多内置的数组变量。
- 支持
$'…'
语法,它在单引号之间扩展文本中的ANSI-C反斜杠转义字符(请参阅ANSI-C引用)。 - Bash支持
$"…"
引用语法,以在双引号之间对字符进行特定于语言环境的转换。该-D, 自卸串,和 自卸宝串 调用选项列出脚本中找到的可翻译字符串(请参阅区域设置转换)。 - Bash实现
!
关键字以否定管道的返回值(请参阅管道)。当if
语句仅在测试失败时才需要执行时非常有用。巴什'-o pipefail'set
如果任何命令失败,'选项将导致管道返回失败状态。 - Bash具有
time
保留字和命令时序(请参阅管道)。可以用TIMEFORMAT
变量控制定时统计的显示 。 - Bash实现了 命令的算术,类似于C语言(参见循环结构)。
for (( expr1 ; expr2 ; expr3 ))
- Bash包含
select
复合命令,它允许生成简单的菜单(参见条件构造)。 - Bash包含
[[
复合命令,它使条件测试成为shell语法的一部分(参见条件构造),包括可选的正则表达式匹配。 - Bash为
case
和[[
构造提供了可选的不区分大小写的匹配。 - Bash包括支撑扩展(参见Brace Expansion)和tilde扩展(参见Tilde Expansion)。
- Bash实现了命令别名和
alias
和unalias
builtins(参见别名)。 - Bash提供shell算法,
((
复合命令(参见Conditional Constructs)和算术扩展(参见Shell Arithmetic)。 - shell初始环境中存在的变量会自动导出到子进程。除非使用该
export
命令显式标记变量,否则Bourne shell通常不会执行此操作。 - Bash支持'+ ='赋值运算符,它附加在左侧命名的变量的值。
- Bash包括POSIX模式删除'%','#','%%'和'##'扩展以从变量值中删除前导或尾随子字符串(请参阅Shell参数扩展)。
- 膨胀
${#xx}
,它返回的长度${xx}
,被支撑(参照壳牌参数扩展)。 - 扩展
${var:
偏移[:
长度]}
(从偏移量开始扩展到var
长度长度值 的子串)(参见Shell参数扩展)。 - 可以使用匹配模式并将其替换为值的替换的扩展
${var/[/]
模式[/
替换(请参阅Shell参数扩展)。]}
var
- 扩展扩展可扩展为名称以prefix开头的所有shell变量的名称(请参阅Shell参数扩展)。
${!prefix*}
- Bash 使用间接变量扩展
${!word}
(参见Shell参数扩展)。 - Bash可以扩展位置参数而不是
$9
使用 。${num}
- 的POSIX
$()
命令替换的形式实现(见命令替换),并且优选的是Bourne shell的``
(也向后兼容实现)。 - Bash具有进程替换(请参阅进程替换)。
- 击自动分配,其提供有关当前用户的信息的变量(
UID
,EUID
,和GROUPS
),当前主机(HOSTTYPE
,OSTYPE
,MACHTYPE
,和HOSTNAME
),并且在运行的bash的实例(BASH
,BASH_VERSION
,和BASH_VERSINFO
)。有关详细信息,请参阅Bash变量。 - 该
IFS
变量仅用于分割扩展结果,而不是所有单词(请参阅单词拆分)。这关闭了一个长期的shell安全漏洞。 - 文件名扩展括号表达式代码使用'!'和'^'否定括号之间的字符集。Bourne shell仅使用'!”。
- Bash实现了一整套POSIX文件名扩展运算符,包括字符类,等价类和 整理符号(请参阅文件名扩展)。
- 当
extglob
启用shell选项时,Bash实现扩展模式匹配功能(请参阅模式匹配)。 - 可以使用具有相同名称的变量和函数;
sh
不会将两个名称空格分开。 - 允许Bash函数使用
local
内置函数使用局部变量 ,因此可以编写有用的递归函数(参见Bash Builtins)。 - 命令之前的变量赋值仅影响该命令,甚至是内置函数和函数(请参阅环境)。在
sh
,除非从文件系统执行命令,否则命令之前的所有变量赋值都是全局的。 - Bash对指定为操作数的文件名执行文件名扩展,以输入和输出重定向操作符(请参阅重定向)。
- Bash包含'<>'重定向操作符,允许打开文件进行读写,''&>'重定向运算符,用于将标准输出和标准错误定向到同一文件(请参阅重定向)。
- Bash包括'<<<'重定向运算符,允许将字符串用作命令的标准输入。
- Bash实现''[n] <&word'和'[n]>&word'重定向运算符,将一个文件描述符移动到另一个。
- Bash在重定向运算符中使用它们时会特别处理许多文件名(请参阅重定向)。
- Bash可以使用重定向运算符打开与任意机器和服务的网络连接(请参阅重定向)。
- 该
noclobber
选项可用于避免使用输出重定向覆盖现有文件(请参阅Set Builtin)。''> |'重定向运算符可用于覆盖noclobber
。 - Bash
cd
和pwd
builtins(参见Bourne Shell Builtins)各自采取-L 和 -P 在逻辑模式和物理模式之间切换的选项。 - Bash允许函数覆盖具有相同名称的内置函数,并通过
builtin
和command
builtins 提供对函数内该内置函数的访问 (参见Bash Builtins)。 - 所述
command
内置允许当执行指令查询的功能选择性失效(见击内置命令)。 - 可以使用
enable
内置函数启用或禁用单个内置函数(请参阅Bash Builtins)。 - Bash
exec
builtin采用了其他选项,允许用户控制传递给执行命令的环境内容,以及该命令的第0个参数是什么(参见Bourne Shell Builtins)。 - 可以使用Shell函数将Shell函数导出到子节点
export -f
(请参阅Shell函数)。 - Bash
export
,readonly
和declare
内置可以采取-F 作用于shell函数的选项,a -p 显示以可用作shell输入的格式设置的各种属性的变量的选项,a -n 删除各种变量属性的选项,'名称=值'同时设置变量属性和值的参数。 - Bash
hash
内置允许名称与任意文件名相关联,即使通过搜索$PATH
使用' 找不到该文件名也是如此hash -p'(参见Bourne Shell Builtins)。 - Bash包含一个
help
内置的快速参考shell设施(参见Bash Builtins)。 - 所述
printf
内置可供显示格式的输出(见击内置命令)。 read
内置的Bash (参见Bash Builtins)将读取一行以'结尾'\'随着 -r选项,REPLY
如果没有提供非选项参数,将使用该变量作为默认值。Bashread
内置也接受一个提示字符串-p 选项并将在给定时使用Readline获取该行 -e选项。该read
内建也有更多的选项来控制输入:-s 选项将在读取时关闭输入字符的回显 -tread
如果输入未在指定的秒数内到达,则选项将允许超时 -n 选项将只允许读取指定数量的字符而不是整行,并且 -d 选项将读取直到特定字符而不是换行符。- 该
return
内建可用于中止与所执行的脚本的执行.
或source
内建命令(参见Bourne Shell的内置命令)。 - Bash包含
shopt
内置函数,可以更好地控制shell可选功能(请参阅The Shopt Builtin),并允许在shell调用时设置和取消设置这些选项(请参阅调用Bash)。 - Bash具有更多可选的行为,可以通过
set
内置控制(参见Set Builtin)。 - ''-X'(X跟踪)执行执行跟踪时,option显示除简单命令之外的命令(请参阅Set Builtin)。
- 该
test
内建(参见Bourne Shell的内置命令)略有不同,因为它实现了POSIX算法,其指定基于参数的数目的行为。 - Bash包含
caller
内置,它显示任何活动子例程调用的上下文(shell函数或使用.
或source
内置函数执行的脚本)。这支持bash调试器。 - 该
trap
内建(参见Bourne Shell的内置命令)允许一个DEBUG
伪信号说明书中,相似的EXIT
。使用DEBUG
陷阱指定的命令在每个简单命令,for
命令,case
命令,select
命令,每个算术for
命令之前以及在shell函数中执行第一个命令之前执行。的DEBUG
,除非该函数已经给出了捕集器不是由shell函数继承trace
属性或functrace
使用选项已被启用shopt
内建。该extdebug
外壳选项对附加效果DEBUG
陷阱。该
trap
内建(参见Bourne Shell的内置命令)可将ERR
伪信号说明书中,相似的EXIT
和DEBUG
。使用ERR
陷阱指定的命令在简单命令失败后执行,但有一些例外。ERR
除非启用-o errtrace
了set
内置选项,否则shell函数不会继承该陷阱 。该
trap
内建(参见Bourne Shell的内置命令)允许一个RETURN
伪信号说明书中,相似的EXIT
和DEBUG
。使用RETURN
陷阱指定的命令在执行shell函数或shell脚本执行.
或source
返回之后执行之前执行 。的RETURN
,除非该函数已经给出了捕集器不是由shell函数继承trace
属性或functrace
使用选项已被启用shopt
内建。 - Bash
type
内置版本更为广泛,并提供了有关其找到的名称的更多信息(请参阅Bash Builtins)。 - Bash
umask
内置允许一个-p选项,使输出以可以umask
作为输入重用的命令的形式显示(请参阅Bourne Shell Builtins)。 - 巴什实现了一个
csh
样目录栈,并提供pushd
,popd
以及dirs
内建命令来操纵它(见目录栈)。Bash还使目录堆栈可见为DIRSTACK
shell变量的值 。 - Bash在交互时解释提示字符串中特殊的反斜杠转义字符(请参阅控制提示)。
- Bash限制模式更有用(参见The Restricted Shell); SVR4.2 shell限制模式太有限了。
- 该
disown
内建可以删除从内壳作业表的作业(参见作业控制内置命令)或抑制的发送SIGHUP
给作业时shell退出作为的结果SIGHUP
。 - Bash包含许多功能,以支持shell脚本的单独调试器。
- SVR4.2 shell有两个特权相关的内置(
mldmode
和priv
)在Bash中不存在。 - Bash没有
stop
或者newgrp
内置。 - Bash不使用
SHACCT
变量或执行shell记帐。 - SVR4.2
sh
使用TIMEOUT
像Bash一样的变量TMOUT
。
B.1与SVR4.2 Shell的实现差异
由于Bash是一个全新的实现,它不会受到SVR4.2 shell的许多限制。例如:
- 重定向进入或退出shell控制结构(如
if
orwhile
语句)时,Bash不会分叉子shell 。 - Bash不允许不平衡的报价。
EOF
在某些情况下,SVR4.2 shell将默默地插入所需的结束报价。这可能是一些难以发现的错误的原因。 - SVR4.2 shell使用基于陷印的巴洛克式内存管理方案
SIGSEGV
。如果shell是从一个SIGSEGV
被阻塞的进程启动的 (例如,通过使用system()
C库函数调用),那么它就会出现异常错误。 - 在一个值得怀疑的安全尝试中,SVR4.2 shell在没有调用的情况下调用 -p选项,如果它们小于某个魔法阈值,通常为100 ,将改变其真实有效的UID和GID。这可能会导致意外结果。
- 该SVR4.2外壳不允许用户陷阱
SIGSEGV
,SIGALRM
或SIGCHLD
。 - 该SVR4.2外壳不允许
IFS
,MAILCHECK
,PATH
,PS1
,或者PS2
变量被取消设置。 - SVR4.2外壳对待'^'作为无证相当于'|”。
- Bash在调用时允许多个选项参数(
-x -v
); SVR4.2 shell只允许一个选项参数(-xv
)。事实上,如果第二个参数以''开头,那么shell转储核心的某些版本- ”。 - 如果任何内置函数失败,SVR4.2 shell将退出脚本; Bash仅在其中一个POSIX特殊内置程序失败时退出脚本,并且仅在某些失败时退出,如POSIX标准中所列举的那样。
- 调用时,SVR4.2 shell的行为会有所不同
jsh
(它打开作业控制)。
下一篇:索引,上一篇:与Bourne Shell的主要区别,Up:Top [ 目录 ] [ 索引 ]
附录C GNU自由文档许可证
版权所有©2000,2001,2002,2007,2008 Free Software Foundation, Inc。http://fsf.org/ 允许每个人复制和分发逐字副本 此许可证文件,但不允许更改它。
- 前言
本许可证的目的是在自由意义上制作免费的手册,教科书或其他功能性和有用的文件:保证每个人在商业或非商业上复制和重新分发它的有效自由,无论是否经过修改。其次,本许可证为作者和出版商保留了一种获得工作信誉的方式,同时不被视为对其他人所做的修改负责。
本许可证是一种“copyleft”,这意味着文档的衍生作品本身必须是自由的。它补充了GNU通用公共许可证,这是为自由软件设计的copyleft许可证。
我们设计此许可证是为了将其用于免费软件的手册,因为免费软件需要免费文档:免费程序应附带手册,提供与软件相同的自由。但本许可证不仅限于软件手册; 它可以用于任何文本作品,无论主题是什么,或者是否作为印刷书出版。我们建议本许可证主要用于目的是指导或参考的作品。
- 适用性和定义
本许可证适用于任何介质中的任何手册或其他作品,其中包含版权所有者声明可以根据本许可证条款分发的通知。此类通知授予全球范围内免版税许可证,持续时间不受限制,可在此处规定的条件下使用该作品。下面的“文件”是指任何此类手册或作品。任何公众成员都是被许可人,并被称为“你”。如果您以要求获得版权法许可的方式复制,修改或分发作品,则表示您接受许可。
本文档的“修改版本”是指包含文档或其中一部分的任何作品,可以逐字复制,也可以修改和/或翻译成另一种语言。
“次要部分”是文档的命名附录或前端部分,专门处理文档的出版商或作者与文档的整体主题(或相关事项)之间的关系,并且不包含任何可能直接下降的内容。在整个主题内。(因此,如果文件部分是数学教科书,则第二部分可能无法解释任何数学。)这种关系可能是与主题或相关事项或法律,商业,哲学,伦理的历史联系问题。或关于他们的政治立场。
“不可变章节”是指在文件根据本许可证发布的通知中指定其标题的某些次要章节,以及不可变章节的标题。如果某个部分不符合上述Secondary的定义,则不允许将其指定为Invariant。文档可能包含零不变部分。如果文档没有识别任何不可变章节,则没有。
“封面文本”是指在文档根据本许可证发布的通知中列为“封面文本”或“封底文本”的某些短文本。封面文本最多可以是5个单词,封底文本最多可以是25个单词。
文档的“透明”副本是指机器可读的副本,以一般公众可以使用的格式表示,适用于使用通用文本编辑器直接修改文档或(对于由像素组成的图像)通用绘制程序或(用于图纸)一些广泛使用的绘图编辑器,适用于输入文本格式器或自动翻译成适合输入文本格式器的各种格式。以透明文件格式制作的副本,其标记或缺少标记,已被安排阻止或阻止读者随后的修改,这不是透明的。如果用于任何大量文本,则图像格式不是透明的。不是“透明”的副本称为“不透明”。
透明副本的合适格式的示例包括没有标记的纯 ASCII,Texinfo输入格式,LaTeX输入格式,使用公共可用 DTD的SGML或XML,以及为人类修改而设计的符合标准的简单HTML,PostScript或PDF。透明图像格式的示例包括PNG,XCF和 JPG。不透明格式包括专有格式,只能由专有文字处理器,被读取和编辑SGML或 XML的量,DTD和/或处理工具通常不可用,并且由一些文字处理器生成的机器生成的HTML,PostScript或PDF仅用于输出目的。
对于印刷书籍,“标题页”是指标题页本身,以及需要清楚地保存本许可证要求出现在标题页中的材料所需的后续页面。对于没有任何标题页的格式的作品,“标题页”表示在作品标题的最突出外观附近的文本,在文本正文的开头之前。
“出版商”是指向公众分发文件副本的任何个人或实体。
“Entitled XYZ”部分是指文档的命名子单元,其标题要么是XYZ,要么是在用另一种语言翻译XYZ的文本后面的括号中包含XYZ。(此处XYZ代表下面提到的特定部分名称,例如“致谢”,“奉献”,“背书”或“历史”。)修改文档时“保留标题”这一部分意味着它根据此定义,仍然是“授权XYZ”部分。
该文件可能包括通知旁边的保证免责声明,其中声明本许可适用于该文件。这些保修免责声明被视为本许可证中的引用,但仅限于放弃保证:这些保证免责声明可能具有的任何其他含义无效且对本许可证的含义没有影响。
- VERBATIM复制
您可以在任何媒体上以商业或非商业方式复制和分发本文档,前提是本许可证,版权声明以及本许可证适用于本文档的许可声明均以所有副本复制,并且您不添加任何其他条件本许可证的那些。您不得使用技术措施来阻止或控制您制作或分发的副本的阅读或进一步复制。但是,您可以接受赔偿以换取副本。如果您分发足够多的副本,则还必须遵守第3节中的条件。
您也可以在上述相同条件下借出副本,并可以公开展示副本。
- 复制数量
如果您发布文档的印刷副本(或通常具有印刷封面的媒体中的副本),编号超过100,并且文档的许可声明需要封面文本,则必须将副本附在封面上,并且清晰,清晰地显示所有这些封面文本:封面上的封面文字和封底上的封底封面文字。两个封面还必须清楚明确地将您识别为这些副本的出版商。封面必须呈现完整的标题,标题的所有单词都同样突出和可见。您可以在封面上添加其他材料。复制仅限于封面的更改,只要它们保留文档的标题并满足这些条件,就可以在其他方面被视为逐字复制。
如果任何一个封面所需的文字太大而不能清晰地贴合,那么你应该将第一个(合适的数量)列在实际的封面上,并将其余部分继续放在相邻的页面上。
如果您发布或分发编号超过100的文档的不透明副本,则必须包含机器可读的透明副本以及每个不透明副本,或者在每个不透明副本中或与每个不透明副本一起显示通用网络的计算机网络位置 - 使用public可以使用公共标准网络协议下载文档的完整透明副本,无需添加材料。如果您使用后一种选择,则必须采取合理谨慎的步骤,当您开始分发数量不透明的副本时,以确保此透明副本在指定位置可以访问,直到您最后一次分发之后至少一年该版本的不透明副本(直接或通过您的代理商或零售商)向公众发布。
要求(但不要求)在重新分发任何大量副本之前与文档的作者联系,以便他们有机会向您提供文档的更新版本。
- MODIFICATIONS
您可以在上述第2节和第3节的条件下复制和分发文档的修改版本,前提是您准确地在本许可下发布修改版本,其中修改版本充当文档的角色,从而许可分发和修改修改版本给拥有它的副本的人。此外,您必须在修改版本中执行以下操作:
- 在标题页(以及封面,如果有的话)中使用与文档不同的标题,以及先前版本的标题(如果有的话,应在文档的“历史记录”部分中列出)。如果该版本的原始发布者授予许可,您可以使用与先前版本相同的标题。
- 在标题页上列出作为作者,一个或多个负责修改版本中修改的作者身份的人或实体,以及该文档的至少五个主要作者(如果其少于五),除非他们释放你的要求。
- 在标题页面上声明修改版本的发布者的名称,作为发布者。
- 保留文档的所有版权声明。
- 在其他版权声明旁边为您的修改添加适当的版权声明。
- 在版权声明后立即包含许可声明,允许公众根据本许可条款使用修改版本,其格式如下附录所示。
- 在该许可声明中保留文档许可声明中给出的不可变章节和所需封面文本的完整列表。
- 包括本许可证的未经更改的副本。
- 保留标题为“历史”的部分,保留其标题,并在其上添加一个项目,至少说明标题页上给出的修改版本的标题,年份,新作者和出版商。如果文档中没有标题为“历史”的部分,请创建一个说明其标题页上给出的文档的标题,年份,作者和出版商,然后添加描述上一句中所述的修改版本的项目。
- 保留文档中给出的网络位置(如果有),以便公开访问文档的透明副本,同样保留文档中为其所基于的先前版本提供的网络位置。这些可以放在“历史”部分。您可以省略在文档本身之前至少发布四年的作品的网络位置,或者它所引用的版本的原始发布者是否给予权限。
- 对于任何标题为“致谢”或“奉献”的部分,保留该部分的标题,并在该部分中保留其中给出的每个贡献者确认和/或奉献的所有实质内容和语气。
- 保留文档的所有不可变章节,在其文本和标题中保持不变。章节号或等同词不被视为章节标题的一部分。
- 删除任何标题为“背书”的部分。此类部分可能未包含在修改版本中。
- 不要将任何现有部分重新命名为“背书”或与任何不可变部分冲突。
- 保留任何保修免责声明。
如果修改版本包含新的前端部分或附录,这些部分或附录有资格作为次要部分并且不包含从文档中复制的材料,您可以选择将部分或全部这些部分指定为不变的。为此,请将其标题添加到修改版本的许可证通知中的不可变章节列表中。这些标题必须与任何其他章节标题不同。
您可以添加一个名为“背书”的部分,前提是它不包含各方对您的修改版本的认可 - 例如,同行评审声明或该文本已被组织批准为标准的权威定义。
您可以在修改版本的封面文本列表的末尾添加最多五个单词作为封面文本,最多25个单词作为封底文本。只有一个封面文本和一个封底文本可以通过(或通过任何一个实体的安排)添加。如果该文件已包含同一封面的封面文字,以前由您或您代表的同一实体所作出的安排,则不得添加另一封面; 但您可以在添加旧版本的上一个发布者的明确许可下替换旧版本。
本许可证的作者和出版者不得通过本许可证授权使用其名称进行宣传,或声称或暗示认可任何修改版本。
- 合并文件
您可以将文档与根据本许可证发布的其他文档(根据上述第4节中定义的条款)合并修改版本,前提是您在所有原始文档的所有不可变章节中包含未经修改的所有文档,并将它们全部列出作为合并工作的不变部分,在其许可声明中,并保留所有保修免责声明。
合并后的工作只需要包含本许可证的一个副本,并且可以用单个副本替换多个相同的不变制部分。如果有多个具有相同名称但内容不同的不可变部分,则通过在括号中添加该部分的原作者或出版者的名称(如果已知),使每个此类部分的标题唯一,或者唯一号码。对组合作品的许可通知中的不可变章节列表中的章节标题进行相同的调整。
在组合中,您必须在各种原始文档中组合任何名为“历史”的部分,形成一个名为“历史”的部分; 同样合并任何标题为“致谢”的部分,以及任何标题为“奉献”的部分。您必须删除所有标题为“背书”的部分。
- 文件集
您可以制作一份由本许可证下发布的文档和其他文档组成的集合,并使用集合中包含的单个副本替换本许可证的各个副本,前提是您遵守本许可证的规则在所有其他方面逐字复制每份文件。
您可以从此类集合中提取单个文档,并在本许可证下单独分发,前提是您将本许可证的副本插入到提取的文档中,并在所有其他方面遵循本许可证关于该文档的逐字复制。
- 与独立工作的集合
如果编辑产生的版权不用于限制合法权利,则将文件或其衍生物与其他单独和独立的文件或作品汇编在一个存储或分发介质的卷上或卷上,称为“聚合”。编辑的用户超出了个人作品所允许的范围。当文档包含在聚合中时,本许可证不适用于聚合中的其他工作,这些工作本身不是文档的衍生作品。
如果第3节的封面文本要求适用于本文档的这些副本,那么如果该文档少于整个集合的一半,则可以将文档的封面文本放在将文档包含在集合中的封面上,或者如果文件是电子形式,则电子等同于封面。否则它们必须出现在支撑整个骨料的印刷盖上。
- 翻译
翻译被视为一种修改,因此您可以根据第4节的条款分发文档的翻译。用翻译替换不变的部分需要获得版权所有者的特别许可,但您可以包括部分或全部不可变部分的翻译。这些不变章节的原始版本。您可以包括本许可证的翻译,以及文档中的所有许可证通知以及任何保修免责声明,前提是您还包括本许可证的原始英文版本以及这些通知和免责声明的原始版本。如果本许可的翻译版本与原始版本或通知或免责声明之间存在分歧,则以原始版本为准。
如果文件中的某个部分被命名为“致谢”,“奉献”或“历史”,则保留其标题(第1部分)的要求(第4节)通常需要更改实际标题。
- 终止
除非本许可证明确规定,否则您不得复制,修改,再许可或分发本文档。任何以其他方式复制,修改,再许可或分发它的行为均属无效,并将自动终止您在本许可下的权利。
但是,如果您停止所有违反本许可的行为,则特定版权所有者的许可将暂时(a)临时恢复,除非版权所有者明确并最终终止您的许可,并且(b)永久性地,如果版权所有者失败在停止后60天之前通过一些合理的方式通知您违规行为。
此外,如果版权所有者通过某种合理的方式通知您违规行为,则您的特定版权所有者的许可将永久恢复,这是您第一次收到该版权所有者违反本许可(任何工作)的通知,并且您在收到通知后30天之前解决了违规行为。
根据本节终止您的权利并不会终止根据本许可证收到您的副本或权利的各方的许可。如果您的权利已被终止且未永久恢复,则收到部分或全部相同材料的副本并不表示您有权使用它。
- 本许可证的未来修订
自由软件基金会可能会不时发布GNU自由文档许可证的新修订版本。这些新版本在精神上与现有版本类似,但可能在细节上有所不同以解决新问题或疑虑。见 http://www.gnu.org/copyleft/。
每个版本的许可证都有一个可区分的版本号。如果文档指定本许可证的特定编号版本“或任何更高版本”适用于此,您可以选择遵循该指定版本或已发布的任何更新版本的条款和条件(不是草案)由自由软件基金会提供。如果文档未指定此许可证的版本号,您可以选择自由软件基金会发布的任何版本(而不是草稿)。如果文档指定代理可以决定可以使用此许可的未来版本,则该代理的公开接受版本声明将永久授权您为该文档选择该版本。
- 重新授权
“大规模多作者协作站点”(或“MMC站点”)是指任何万维网服务器,它发布受版权保护的作品,并为任何人编辑这些作品提供了突出的设施。任何人都可以编辑的公共wiki就是这种服务器的一个例子。网站中包含的“大规模多作者协作”(或“MMC”)是指在MMC网站上发布的任何一组受版权保护的作品。
“CC-BY-SA”指Creative Commons Corporation发布的Creative Commons Attribution-Share Alike 3.0许可证,这是一家在加利福尼亚州旧金山拥有主要营业地点的非营利性公司,以及未来的Copyleft版本该组织发布的许可证。
“合并”是指将文档全部或部分作为另一文档的一部分发布或重新发布。
如果MMC根据本许可证获得许可,并且如果所有根据本许可证首次在本MMC以外的地方发布的作品,并且随后全部或部分合并到MMC中,则MMC“符合再许可条件”,(1)没有涵盖文本或不变部分,(2)因此在2008年11月1日之前纳入。
如果MMC有资格获得再许可,MMC网站的运营商可以在2009年8月1日之前的任何时间在同一网站上的CC-BY-SA下重新发布网站中包含的MMC。
附录:如何将此许可证用于您的文档
要在您编写的文档中使用本许可,请在文档中包含许可副本,并在标题页后面添加以下版权和许可声明:
版权所有(C) 年份 您的姓名。 授予复制,分发和/或修改本文档的权限 根据GNU自由文档许可证1.3版的条款 或自由软件基金会发布的任何更新版本; 没有不变的部分,没有封面文字,也没有封底 文本。许可证的副本包含在标题为``GNU的部分中 免费文档许可证''。
如果您有不可变章节,封面文本和封底文本,请将“with ... Texts。”行替换为:
随着不变章节列出他们的标题,用 前封面文本列表,以及封底文本 是列表。
如果你有没有封面文本的不可变部分,或者三者的其他组合,请合并这两种选择以适应这种情况。
如果您的文档包含程序代码的重要示例,我们建议您根据您选择的自由软件许可证(例如GNU通用公共许可证)并行发布这些示例,以允许它们在自由软件中使用。
上一篇:GNU自由文档许可证,上:顶部 [ 目录 ] [ 索引 ]
附录D索引
• 内在指数: | Bash内置命令的索引。 | |
• 保留字索引: | Bash保留字的索引。 | |
• 可变指数: | 快速参考可帮助您找到所需的变量。 | |
• 功能指数: | 可绑定Readline函数的索引。 | |
• 概念指数: | 本手册中描述的概念的一般索引。 |
D.1 Shell Builtin命令索引
跳到: | 。 : [ A B C D E F G H J K L M P R S T U W |
---|
跳到: | 。 : [ A B C D E F G H J K L M P R S T U W |
---|
D.2壳牌保留字索引
跳到: | ! [ ] { } C D E F I S T U W |
---|
索引条目 | 部分 | ||
---|---|---|---|
! | |||
! : |
管道 | ||
[ | |||
[[ : |
条件构造 | ||
] | |||
]] : |
条件构造 | ||
{ | |||
{ : |
命令分组 | ||
} | |||
} : |
命令分组 | ||
C | |||
case : |
条件构造 | ||
d | |||
do : |
循环结构 | ||
done : |
循环结构 | ||
Ë | |||
elif : |
条件构造 | ||
else : |
条件构造 | ||
esac : |
条件构造 | ||
F | |||
fi : |
条件构造 | ||
for : |
循环结构 | ||
function : |
Shell函数 | ||
一世 | |||
if : |
条件构造 | ||
in : |
条件构造 | ||
小号 | |||
select : |
条件构造 | ||
Ť | |||
then : |
条件构造 | ||
time : |
管道 | ||
ü | |||
until : |
循环结构 | ||
w ^ | |||
while : |
循环结构 | ||
跳到: | ! [ ] { } C D E F I S T U W |
---|
D.3参数和变量索引
跳到: | ! # $ * - 0 ? @ _ A B C D E F G H I K L M O P R S T U V. |
---|
跳到: | ! # $ * - 0 ? @ _ A B C D E F G H I K L M O P R S T U V. |
---|
D.4功能指数
跳到: | A B C D E F G H I K M N O P Q R S T U Y. |
---|
跳到: | A B C D E F G H I K M N O P Q R S T U Y. |
---|
D.5概念指数
跳到: | A B C D E F H I J K L M N O P Q R S T V W Y. |
---|
跳到: | A B C D E F H I J K L M N O P Q R S T V W Y. |
---|