bash - 参考手册、选项、命令示例


姓名

bash - GNU Bourne-Again shell

概要

bash [options] [command_string | file]

版权

Bash 的版权 (C) 1989-2020 属于 Free Software Foundation, Inc.。

描述

Bash 是一种与 sh 兼容的命令语言解释器,它执行从标准输入或文件读取的命令。 Bash 还融合了 Korn 和 C shell(ksh 和 csh)的有用功能)。

Bash 旨在成为 IEEE POSIX 规范(IEEE 标准 1003.1)的 Shell 和实用程序部分的一致实现。默认情况下,Bash 可以配置为符合 POSIX。

选项

set 内置命令的描述中记录的所有单字符 shell 选项(包括 -o)都可以在调用 shell 时用作选项。此外,bash 在调用时会解释以下选项:

-c

如果存在-c选项,则从第一个非选项参数command_string读取命令。如果 command_string 之后有参数,则第一个参数将分配给 $0,任何剩余参数将分配给位置参数。对 $0 的赋值设置了 shell 的名称,该名称用于警告和错误消息。

-i

如果存在 -i 选项,则 shell 是交互式的。

-l

使 bash 的行为就像它已作为登录 shell 被调用一样(请参阅下面的INVOCATION)。

-r

如果存在 -r 选项,则 shell 会受限(请参阅下面的 RESTRICTED SHELL)。

-s

如果存在 -s 选项,或者选项处理后没有剩余参数,则从标准输入读取命令。此选项允许在调用交互式 shell 或通过管道读取输入时设置位置参数。

-D

在标准输出上打印以 $ 开头的所有双引号字符串的列表。当当前语言环境不是 C 或 POSIX 时,这些字符串需要进行语言翻译。这意味着 -n 选项;不会执行任何命令。

[-+]O [shopt_option]

shopt_option 是 shopt 内置命令接受的 shell 选项之一(请参阅下面的 SHELL BUILTIN COMMANDS)。如果 shopt_option 存在,-O 设置该选项的值; +O 取消设置。如果未提供 shopt_option,则 shopt 接受的 shell 选项的名称和值将打印在标准输出上。如果调用选项为+O,则输出将以可重复用作输入的格式显示。

--

-- 表示选项结束并禁用进一步的选项处理。 -- 之后的任何参数都被视为文件名和参数。 - 参数相当于 --。

Bash 还解释许多多字符选项。这些选项必须出现在命令行上,然后才能识别单字符选项。

--debugger

安排在 shell 启动之前执行调试器配置文件。打开扩展调试模式(请参阅下面内置的 shopt 的 extdebug 选项的说明)。

--dump-po-strings

相当于-D,但输出采用GNU gettext po(可移植对象)文件格式。

--dump-strings

相当于-D。

--help

在标准输出上显示使用消息并成功退出。

--init-file file
--rcfile file

如果 shell 是交互式的,则从文件而不是标准个人初始化文件~/.bashrc执行命令(请参阅下面的INVOCATION)。

--login

相当于-l。

--noediting

当 shell 是交互式的时,不要使用 GNU readline 库来读取命令行。

--noprofile

不要读取系统范围的启动文件 /etc/profile 或任何个人初始化文件~/.bash_profile、~/.bash_login >,或~/.profile。默认情况下,bash 在作为登录 shell 调用时读取这些文件(请参阅下面的INVOCATION)。

--norc

如果 shell 是交互式的,请勿读取和执行个人初始化文件 ~/.bashrc。如果 shell 作为 sh 调用,则默认情况下此选项处于启用状态。

--posix

更改默认操作与 POSIX 标准不同的 bash 行为以匹配标准(posix 模式)。请参阅下面的另请参见,获取详细说明 posix 模式如何影响 bash 行为的文档的参考。

--restricted

shell 受到限制(请参阅下面的RESTRICTED SHELL)。

--verbose

相当于-v。

--version

在标准输出上显示此 bash 实例的版本信息并成功退出。

论点

如果选项处理后仍有参数,并且既没有提供 -c 也没有提供 -s 选项,则假定第一个参数是包含 shell 命令的文件的名称。如果以这种方式调用 bash,$0 将设置为文件名,位置参数将设置为其余参数。 Bash 从此文件读取并执行命令,然后退出。 Bash的退出状态是脚本中执行的最后一个命令的退出状态。如果没有执行任何命令,则退出状态为 0。首先尝试打开当前目录中的文件,如果没有找到文件,则 shell 在 PATH 中的目录中搜索剧本。

召唤

登录 shell 的参数零的第一个字符是 -,或者以 --login 选项开头。

交互式 shell 是在没有非选项参数的情况下启动的(除非指定了-s),并且没有-c 选项,其标准输入和错误都连接到终端(由 isatty(3) 确定),或者以 -i 选项启动。

如果 bash 是交互式的,则设置 PS1 并且 $- 包括 i,允许 shell 脚本或启动文件测试这个状态。

以下段落描述了 bash 如何执行其启动文件。如果任何文件存在但无法读取,bash 会报告错误。波形符在文件名中扩展,如下所述扩展部分中的波形符扩展。

当 bash 作为交互式登录 shell 或带有 --login 选项的非交互式 shell 被调用时,它首先从文件读取并执行命令 /etc/profile,如果该文件存在。读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,并且从第一个存在且可读的命令读取并执行命令。启动 shell 时可以使用 --noprofile 选项来禁止此行为。

当交互式登录 shell 退出或非交互式登录 shell 执行 exit 内置命令时,bash 会从文件 ~/.bash_logout 中读取并执行命令,如果存在的话。

当启动非登录 shell 的交互式 shell 时,bash 会从 ~/.bashrc 读取并执行命令(如果该文件存在)。这可以通过使用--norc选项来抑制。 --rcfile file 选项将强制 bash 从 file 而不是 ~ 读取并执行命令/.bashrc。

例如,当 bash 以非交互方式启动时,要运行 shell 脚本,它会在环境中查找变量 BASH_ENV,如果它出现在其中,则扩展其值,然后使用扩展值作为要读取和执行的文件的名称。 Bash 的行为就像执行了以下命令:

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

但 PATH 变量的值不用于搜索文件名。

如果使用名称 sh 调用 bash,它会尝试尽可能模仿 sh 历史版本的启动行为,同时符合POSIX 标准也是如此。当作为交互式登录 shell 或带有 --login 选项的非交互式 shell 调用时,它首先尝试从 /etc/profile 和 <~/.profile,按此顺序。 --noprofile 选项可用于抑制此行为。当使用名称 sh 作为交互式 shell 调用时,bash 会查找变量 ENV,如果已定义则扩展其值,并使用扩展值作为要读取和执行的文件的名称。由于作为 sh 调用的 shell 不会尝试从任何其他启动文件读取和执行命令,因此 --rcfile 选项无效。使用名称 sh 调用的非交互式 shell 不会尝试读取任何其他启动文件。当作为 sh 调用时,bash 在读取启动文件后进入 posix 模式。

当bash在posix模式下启动时,与--posix命令行选项一样,它遵循启动文件的POSIX标准。在此模式下,交互式 shell 扩展 ENV 变量,并从名称为扩展值的文件中读取和执行命令。不读取其他启动文件。

Bash 尝试确定它何时使用连接到网络连接的标准输入运行,例如由远程 shell 守护程序(通常是 rshd)或安全 shell 守护程序执行时sshd。如果bash确定它正在以这种方式运行,它会从~/.bashrc读取并执行命令(如果该文件存在并且可读)。如果作为 sh 调用,它不会执行此操作。 --norc 选项可用于抑制此行为,--rcfile 选项可用于强制读取另一个文件,但 rshd 都不是 和 sshd 通常都会使用这些选项调用 shell 或允许指定它们。

如果 shell 启动时有效用户(组)id 不等于真实用户(组)id,并且未提供 -p 选项,则不会读取启动文件,也不会执行 shell 功能从环境继承的 SHELLOPTS、BASHOPTS、CDPATH 和 GLOBIGNORE 变量(如果它们出现在环境中) 、 被忽略,有效用户 ID 设置为真实用户 ID。如果在调用时提供 -p 选项,则启动行为是相同的,但不会重置有效用户 ID。

定义

本文档的其余部分使用以下定义。

blank

空格或制表符。

word

被 shell 视为单个单元的字符序列。也称为令牌。

name

仅由字母数字字符和下划线组成的单词,并以字母字符或下划线开头。也称为标识符。

metacharacter

当不加引号时,用于分隔单词的字符。以下之一:

| & ; ( ) < > space tab newline
control operator

执行控制功能的令牌。它是以下符号之一:

|| & && ; ;; ;& ;;& ( ) | |& <newline>

保留字

保留字是对 shell 有特殊含义的字。以下单词在不加引号时被识别为保留单词,并且是命令的第一个单词(请参见下面的 SHELL GRAMMAR)、case 的第三个单词或 select< 命令(仅in有效),或for命令的第三个单词(仅in和do有效):

! case coproc do done elif else esac fi for function if in select then until while { } time [[ ]]

外壳文法

简单命令

简单命令是一系列可选变量赋值,后跟空白分隔的单词和重定向,并由控制运算符终止。第一个字指定要执行的命令,并作为参数零传递。其余单词作为参数传递给调用的命令。

简单命令的返回值是其退出状态,如果命令由信号n终止,则返回值为128+n 。

管道

管道是由控制运算符|或|&之一分隔的一个或多个命令的序列。管道的格式为:

[time [-p]] [ ! ] command [ [|⎪|&] command2 ... ]

command 的标准输出通过管道连接到command2 的标准输入。此连接在命令指定的任何重定向之前执行(请参阅下面的重定向)。如果使用|&,则command的标准错误除了其标准输出之外,还通过管道;它是 2>&1 | 的简写。将标准错误隐式重定向到标准输出是在命令指定的任何重定向之后执行的。

管道的返回状态是最后一个命令的退出状态,除非启用了 pipefail 选项。如果启用了pipefail,则管道的返回状态是最后一个(最右边)以非零状态退出的命令的值,如果所有命令都成功退出,则返回零。如果保留字!位于管道之前,则该管道的退出状态是上述退出状态的逻辑非。 shell 在返回值之前等待管道中的所有命令终止。

如果时间保留字位于管道之前,则管道终止时会报告其执行所消耗的时间以及用户和系统时间。 -p 选项将输出格式更改为 POSIX 指定的格式。当 shell 处于 posix 模式时,如果下一个标记以“-”开头,它不会将 time 识别为保留字。 TIMEFORMAT 变量可以设置为指定如何显示计时信息的格式字符串;请参阅下面Shell 变量下TIMEFORMAT 的说明。

当 shell 处于 posix 模式时,时间 后面可能会跟一个换行符。在这种情况下,shell 显示 shell 及其子级消耗的总用户时间和系统时间。 TIMEFORMAT变量可用于指定时间信息的格式。

管道中的每个命令都作为单独的进程执行(即在子 shell 中)。有关子 shell 环境的描述,请参阅命令执行环境。如果使用 shopt 内置函数启用 lastpipe 选项(请参阅下面 shopt 的描述),则管道的最后一个元素可以由外壳进程。

列表

列表是由运算符 ;、&、&& 之一分隔的一个或多个管道的序列,或 ||,并可选择以 ;、& 或 <newline> 之一终止。

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

列表中可能会出现一系列的一个或多个换行符,而不是用分号来分隔命令。

如果命令由控制运算符 & 终止,则 shell 会在子 shell 的后台中执行该命令。 shell 不会等待命令完成,返回状态为 0。这些称为异步命令。由 ; 分隔的命令按顺序执行; shell 依次等待每个命令终止。返回状态是最后执行的命令的退出状态。

AND 和 OR 列表是一个或多个管道的序列,分别由 && 和 || 控制运算符分隔。 AND 和 OR 列表以左关联性执行。 AND 列表的形式为

command1 && command2

当且仅当命令 1 返回退出状态为零(成功)时,才会执行命令 2。

OR 列表的形式为

command1 || command2

当且仅当命令 1 返回非零退出状态时,才会执行命令 2。 AND 和 OR 列表的返回状态是列表中最后执行的命令的退出状态。

复合命令

复合命令是以下命令之一。在大多数情况下,命令描述中的列表可以通过一个或多个换行符与命令的其余部分分隔开,并且后面可以用换行符代替分号。

(list)

list 在子 shell 环境中执行(请参阅下面的命令执行环境)。影响 shell 环境的变量分配和内置命令在命令完成后不再有效。返回状态是list的退出状态

{ list; }

list 只是在当前 shell 环境中执行。 列表必须以换行符或分号终止。这称为组命令。返回状态是list的退出状态。请注意,与元字符 ( 和 ) 不同,{ 和 } 是保留字并且必须出现在允许识别保留字的地方。由于它们不会导致断词,因此必须用空格或其他 shell 元字符将它们与列表分隔开。

((expression))

表达式根据下面算术评估下描述的规则进行评估。如果表达式的值非零,则返回状态为0;否则返回状态为 1。这与 let "表达式" 完全相同。

[[ expression ]]

根据条件表达式 表达式 的计算结果,返回 0 或 1 状态。表达式由下面条件表达式下描述的主要元素组成。 [[和]]之间的单词不进行分词和路径名扩展;执行波形符扩展、参数和变量扩展、算术扩展、命令替换、进程替换和引号删除。条件运算符(例如 -f)必须不加引号才能被识别为主运算符。

当与 [[ 一起使用时,< 和 > 运算符使用当前区域设置按字典顺序排序。

当使用 == 和 != 运算符时,运算符右侧的字符串被视为模式,并根据下面 Pattern 下描述的规则进行匹配匹配,就像启用了 extglob shell 选项一样。 = 运算符相当于==。如果启用 nocasematch shell 选项,则执行匹配时将不考虑字母字符的大小写。如果字符串与模式匹配 (==) 或不匹配 (!=),则返回值为 0,否则返回值为 1。模式的任何部分都可以被引用,以强制引用的部分作为字符串进行匹配。

另外还有一个二元运算符 =~,其优先级与 == 和 != 相同。使用时,运算符右侧的字符串被视为 POSIX 扩展正则表达式并进行相应匹配(使用通常在 regcomp 和 regexec 中描述的 POSIX regcomp 接口>正则表达式(3))。如果字符串与模式匹配,则返回值为 0,否则返回值为 1。如果正则表达式在语法上不正确,则条件表达式的返回值为 2。如果启用 nocasematch shell 选项,则执行匹配时不考虑字母字符的大小写。模式的任何部分都可以被引用,以强制引用的部分作为字符串进行匹配。正则表达式中的括号表达式必须小心对待,因为正常的引号字符在括号之间会失去其含义。如果模式存储在 shell 变量中,则引用变量扩展会强制将整个模式作为字符串进行匹配。

如果该模式与字符串的任何部分匹配,则该模式将匹配。使用 ^ 和 $ 正则表达式运算符锚定模式,以强制其匹配整个字符串。数组变量BASH_REMATCH记录字符串的哪些部分与模式匹配。 BASH_REMATCH 索引为 0 的元素包含与整个正则表达式匹配的字符串部分。正则表达式中带括号的子表达式匹配的子字符串保存在其余的 BASH_REMATCH 索引中。 BASH_REMATCH 中索引为 n 的元素是与第 n 个括号子表达式匹配的字符串部分。

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

( expression )

返回表达式的值。这可用于覆盖运算符的正常优先级。

! expression

如果表达式为假,则为真。

expression1 && expression2

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

expression1 || expression2

如果表达式1或表达式2为真,则为真。

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

for name [ [ in [ word ... ] ] ; ] do list ; done

in 之后的单词列表将展开,生成一个项目列表。变量name依次设置为该列表的每个元素,并且list每次都会被执行。如果省略 in word,则 for 命令会对设置的每个位置参数执行 list 一次(请参阅如下参数)。返回状态是最后执行的命令的退出状态。如果 in 后面的项展开导致空列表,则不执行任何命令,并且返回状态为 0。

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

首先,算术表达式 expr1 根据下面算术评估下描述的规则进行评估。然后重复计算算术表达式expr2,直到其计算结果为零。每次 expr2 计算结果为非零值时,list 就会被执行,并且算术表达式 expr3 也会被计算。如果省略任何表达式,则其行为就好像其计算结果为 1。返回值是 list 中执行的最后一个命令的退出状态,如果任何表达式无效,则返回 false。

select name [ in word ] ; do list ; done

in 之后的单词列表将展开,生成一个项目列表。扩展单词集打印在标准错误上,每个单词前面都有一个数字。如果省略 in 单词,则打印位置参数(请参阅下面的参数)。然后将显示 PS3 提示符,并从标准输入中读取一行。如果该行包含与显示的单词之一相对应的数字,则 name 的值将设置为该单词。如果该行为空,则再次显示文字和提示。如果读取到 EOF,则命令完成。读取的任何其他值都会导致 name 设置为 null。读取的行保存在变量REPLY中。 列表在每次选择后执行,直到执行break命令。 select的退出状态是list中执行的最后一个命令的退出状态,如果没有执行命令则为零。

case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac

case 命令首先扩展单词,并尝试使用模式匹配中描述的匹配规则依次将其与每个模式进行匹配 下面。 单词使用波形符扩展、参数和变量扩展、算术扩展、命令替换、过程替换和引号删除来扩展。检查的每个模式都使用波形符扩展、参数和变量扩展、算术扩展、命令替换和进程替换来扩展。如果启用 nocasematch shell 选项,则执行匹配时将不考虑字母字符的大小写。当找到匹配项时,就会执行相应的列表。如果使用 ;; 运算符,则在第一个模式匹配之后不会尝试后续匹配。使用 ;& 代替 ;; 会导致继续执行与下一组模式关联的列表。使用 ;;& 代替 ;; 会使 shell 测试语句中的下一个模式列表(如果有),并执行任何关联的列表 如果匹配成功,则继续执行 case 语句,就像模式列表不匹配一样。如果没有模式匹配,则退出状态为零。否则,它是列表中最后执行的命令的退出状态。

if list; then list; [ elif list; then list; ] ... [ else list; ] fi

if 列表被执行。如果其退出状态为零,则执行 then list。否则,依次执行每个elif list,如果其退出状态为零,则执行相应的then list被执行并且命令完成。否则,else列表将被执行(如果存在)。退出状态是最后执行的命令的退出状态,如果没有条件测试为真,则退出状态为零。

while list-1; do list-2; done
until list-1; do list-2; done

只要列表 list-1 中的最后一个命令返回零退出状态,while 命令就会连续执行列表 list-2。 until 命令与 while 命令相同,只是测试被否定:只要最后一个命令在 list-2 中,就会执行list-1 返回非零退出状态。 while 和 until 命令的退出状态是 list-2 中执行的最后一个命令的退出状态,如果没有执行则为零。

协进程

coprocess 是一个 shell 命令,前面带有 coproc 保留字。协进程在子 shell 中异步执行,就像使用 & 控制运算符终止命令一样,并在执行 shell 和协进程之间建立双向管道。

协进程的格式为:

coproc [NAME] command [redirections]

这将创建一个名为NAME的协进程。如果未提供NAME,则默认名称为COPROC。如果命令是一个简单命令(见上文),则不得提供NAME;否则,它被解释为简单命令的第一个单词。当执行协进程时,shell 在执行 shell 的上下文中创建一个名为 NAME 的数组变量(请参阅下面的数组)。 命令的标准输出通过管道连接到执行外壳中的文件描述符,并且该文件描述符被分配给NAME[0]。 命令的标准输入通过管道连接到执行外壳中的文件描述符,并且该文件描述符被分配给NAME[1]。该管道是在命令指定的任何重定向之前建立的(请参阅下面的REDIRECTION)。文件描述符可以用作 shell 命令的参数以及使用标准字扩展的重定向。除了为执行命令和进程替换而创建的文件描述符之外,文件描述符在子 shell 中不可用。为执行协进程而生成的 shell 的进程 ID 可用作变量 NAME_PID 的值。 wait 内置命令可用于等待协进程终止。

由于协进程是作为异步命令创建的,因此 coproc 命令始终返回成功。协进程的返回状态是命令的退出状态。

外壳函数定义

shell 函数是一个像简单命令一样调用的对象,并使用一组新的位置参数执行复合命令。 shell函数声明如下:

fname () compound-command [redirection]
function fname [()] compound-command [redirection]

这定义了一个名为fname的函数。保留字function是可选的。如果提供了function保留字,则括号是可选的。函数的主体是复合命令compound-command(请参阅上面的复合命令)。该命令通常是 { 和 } 之间的命令列表,但也可以是上面复合命令下列出的任何命令,但有一个例外:如果函数 使用了保留字,但不提供括号,需要大括号。只要将 fname 指定为简单命令的名称,就会执行 compound-command 。在 posix 模式 下,fname 必须是有效的 shell 名称,并且不能是 POSIX 特殊内置函数之一的名称。在默认模式下,函数名称可以是任何不带引号且不包含 $ 的 shell 单词。定义函数时指定的任何重定向(请参阅下面的REDIRECTION)都会在执行该函数时执行。函数定义的退出状态为零,除非发生语法错误或已存在同名的只读函数。执行时,函数的退出状态是函数体中执行的最后一个命令的退出状态。 (请参阅下面的功能。)

评论

在非交互式 shell 中,或启用了内置 shopt 的 interactive_comments 选项的交互式 shell 中(请参阅下面的 SHELL BUILTIN COMMANDS) ,以 # 开头的单词会导致该单词以及该行上的所有剩余字符被忽略。未启用 interactive_comments 选项的交互式 shell 不允许发表评论。默认情况下,交互式 shell 中的 interactive_comments 选项处于启用状态。

报价

引用用于删除 shell 中某些字符或单词的特殊含义。引号可用于禁用对特殊字符的特殊处理,以防止保留字被识别为此类,并防止参数扩展。

上面定义下列出的每个元字符对 shell 都有特殊含义,如果要代表其自身,则必须用引号引起来。

当使用命令历史扩展功能时(请参阅下面的历史扩展),历史扩展字符,通常是!,必须被引用以防止历史扩展。

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

不带引号的反斜杠 (\) 是转义字符。它保留后面的下一个字符的字面值,但 <newline> 除外。如果出现 \<newline> 对,并且反斜杠本身没有被引号引起来,则 \<newline> 被视为续行(即,将其从输入流并被有效忽略)。

将字符括在单引号中可保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠也是如此。

将字符括在双引号中会保留引号内所有字符的字面值,但 $、`、\ 除外,并且当历史扩展已启用,!。当 shell 处于 posix 模式时,即使启用了历史扩展,双引号内的 ! 也没有特殊含义。字符 $ 和 ` 在双引号内保留其特殊含义。仅当反斜杠后跟以下字符之一时,反斜杠才保留其特殊含义:$、`、 " 、\ 或 <newline>。双引号可以通过在双引号内加上反斜杠来引用。如果启用,将执行历史扩展,除非 ! 出现在双引号使用反斜杠转义。! 前面的反斜杠不会被删除。

特殊参数 * 和 @ 在双引号中时具有特殊含义(请参阅下面的参数)。

$'string' 形式的单词会被特殊处理。该单词扩展为字符串,并按照 ANSI C 标准指定的方式替换反斜杠转义字符。反斜杠转义序列(如果存在)按如下方式解码:

\a

警报(响铃)

\b

退格键

\e
\E

转义字符

\f

换页

\n

新队

\r

回车

\t

水平制表符

\v

垂直制表符

\\

反斜杠

\'

单引号

\"

双引号

\?

问号

\nnn

值为八进制值 nnn 的八位字符(一到三个八进制数字)

\xHH

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

\uHHHH

Unicode (ISO/IEC 10646) 字符,其值为十六进制值 HHHH(一到四个十六进制数字)

\UHHHHHHHH

Unicode (ISO/IEC 10646) 字符,其值为十六进制值 HHHHHHHH(一到八个十六进制数字)

\cx

一个 control-x 字符

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

前面带有美元符号的双引号字符串 ($"string") 将导致根据当前区域设置翻译该字符串。 gettext 基础结构使用 LC_MESSAGES 和 TEXTDOMAIN shell 变量执行消息目录查找和转换。如果当前区域设置是 C 或 POSIX,或者没有可用的翻译,则忽略美元符号。如果字符串被翻译并替换,则替换内容将被双引号括起来。

参数

参数是存储值的实体。它可以是名称、数字或下面特殊参数下列出的特殊字符之一。 变量是由名称表示的参数。变量有一个值和零个或多个属性。属性是使用declare内置命令分配的(请参阅下面SHELL BUILTIN COMMANDS中的declare)。

如果参数已被赋值,则该参数被设置。空字符串是有效值。一旦设置了变量,就只能通过使用unset内置命令来取消设置(请参阅下面的SHELL BUILTIN COMMANDS)。

可以通过以下形式的语句将变量分配给变量

name=[value]

如果未给出值,则为该变量分配空字符串。所有值都会经历波形符扩展、参数和变量扩展、命令替换、算术扩展和引号删除(请参阅下面的扩展)。如果变量设置了整数属性,则值将被计算为算术表达式,即使未使用 $ ((...)) 扩展(请参阅下面的算术扩展)。不执行分词,但 "$@" 除外,如下特殊参数中所述。不执行路径名扩展。赋值语句也可以作为别名、声明、排版、导出、只读<的参数出现。 和本地内置命令(声明命令)。在 posix 模式下,这些内建函数可能出现在命令中的一个或多个内建命令实例之后,并保留这些赋值语句属性。

在赋值语句将值赋给 shell 变量或数组索引的上下文中,+= 运算符可用于追加或添加到变量的先前值。这包括内置命令的参数,例如接受赋值语句(声明命令)的declare。当 += 应用于已设置 integer 属性的变量时,value 将被计算为算术表达式,并添加到变量的当前值中,该值也会被计算。当使用复合赋值将 += 应用于数组变量时(请参阅下面的数组),该变量的值不会取消设置(与使用=时一样),并且新值会附加到从以下位置开始的数组中:比数组的最大索引大一(对于索引数组)或作为附加键值对添加到关联数组中。当应用于字符串值变量时,value 将扩展并附加到变量的值中。

可以使用 declare 或 local 内置命令的 -n 选项为变量分配 nameref 属性(请参阅下面的 declare 和 local 的描述)来创建 nameref 或对另一个变量的引用。这允许间接操纵变量。每当 nameref 变量被引用、赋值、取消设置或修改其属性时(除了使用或更改 nameref 属性本身),操作实际上是在 nameref 变量值指定的变量上执行的。 nameref 通常在 shell 函数中使用来引用其名称作为参数传递给函数的变量。例如,如果将变量名作为第一个参数传递给 shell 函数,则运行

declare -n ref=$1

函数内部创建一个 nameref 变量ref,其值是作为第一个参数传递的变量名称。对 ref 的引用和赋值,以及对其属性的更改,均被视为对其名称作为 $1 传递的变量的引用、赋值和属性修改。如果for循环中的控制变量具有nameref属性,则单词列表可以是shell变量列表,并且将为列表中的每个单词建立一个名称引用,依次,当循环被执行。数组变量不能被赋予 nameref 属性。但是,nameref 变量可以引用数组变量和下标数组变量。可以使用 unset 内置函数的 -n 选项来取消设置 Namerefs。否则,如果以 nameref 变量的名称作为参数来执行 unset,则 nameref 变量引用的变量将被取消设置。

位置参数

位置参数是由一个或多个数字表示的参数,而不是单个数字 0。位置参数是在调用 shell 时从 shell 的参数中分配的,并且可以使用 set 重新分配内置命令。位置参数不能用赋值语句分配。当执行 shell 函数时,位置参数会被临时替换(请参阅下面的函数)。

当展开由多个数字组成的位置参数时,必须将其括在大括号中(请参阅下面的EXPANSION)。

特殊参数

shell 对几个参数进行了特殊处理。这些参数仅供参考;不允许向他们分配。

*

扩展到位置参数,从 1 开始。当扩展不在双引号内时,每个位置参数都会扩展为一个单独的单词。在执行它的上下文中,这些单词会受到进一步的单词分割和路径名扩展。当扩展发生在双引号内时,它会扩展为单个单词,每个参数的值由 IFS 特殊变量的第一个字符分隔。也就是说,“$*”相当于“$1c$2c ...”,其中 c 是 IFS 变量值的第一个字符。如果未设置IFS,则参数之间用空格分隔。如果 IFS 为 null,则连接参数时不插入分隔符。

@

扩展到位置参数,从 1 开始。在执行单词拆分的上下文中,这会将每个位置参数扩展为单独的单词;如果不在双引号内,这些单词将受到分词的影响。在不执行单词拆分的上下文中,这会扩展为单个单词,每个位置参数由空格分隔。当扩展发生在双引号内时,每个参数都会扩展为一个单独的单词。也就是说,“$@”相当于“$1”、“$2”...如果双引号扩展出现在单词内,第一个参数的扩展与原始单词的开头部分连接,最后一个参数的扩展与原始单词的最后部分连接。当没有位置参数时,“$@”和$@将扩展为空(即,它们被删除)。

#

扩展为十进制位置参数的数量。

?

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

-

扩展为调用时指定的当前选项标志,通过 set 内置命令或 shell 本身设置的选项标志(例如 -i 选项)。

$

扩展为 shell 的进程 ID。在() 子 shell 中,它扩展为当前 shell 的进程 ID,而不是子 shell。

!

扩展为最近放入后台的作业的进程 ID,无论是作为异步命令执行还是使用 bg 内置函数执行(请参阅下面的JOB CONTROL)。

0

扩展为 shell 或 shell 脚本的名称。这是在 shell 初始化时设置的。如果使用命令文件调用 bash,则 $0 将设置为该文件的名称。如果 bash 使用 -c 选项启动,则 $0 设置为要执行的字符串之后的第一个参数(如果存在) 。否则,它被设置为用于调用 bash 的文件名,由参数零指定。

外壳变量

以下变量由 shell 设置:

_

在 shell 启动时,设置为用于调用在环境或参数列表中传递的 shell 或正在执行的 shell 脚本的路径名。随后,扩展至在扩展后在前台执行的上一个简单命令的最后一个参数。还设置为用于调用执行的每个命令并放置在导出到该命令的环境中的完整路径名。检查邮件时,该参数保存当前正在检查的邮件文件的名称。

BASH

扩展为用于调用此 bash 实例的完整文件名。

BASHOPTS

以冒号分隔的已启用 shell 选项列表。列表中的每个单词都是 shopt 内置命令的 -s 选项的有效参数(请参阅下面的 SHELL BUILTIN COMMANDS)。 BASHOPTS 中显示的选项是 shopt 报告为on的选项。如果 bash 启动时环境中存在此变量,则在读取任何启动文件之前将启用列表中的每个 shell 选项。该变量是只读的。

BASHPID

扩展为当前 bash 进程的进程 ID。在某些情况下,这与 $$ 不同,例如不需要重新初始化 bash 的子 shell。对 BASHPID 的分配无效。如果 BASHPID 未设置,它将失去其特殊属性,即使随后重置也是如此。

BASH_ALIASES

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

BASH_ARGC

一个数组变量,其值是当前 bash 执行调用堆栈的每个帧中的参数数量。当前子例程(使用 . 或 source 执行的 shell 函数或脚本)的参数数量位于堆栈顶部。当执行子例程时,传递的参数数量被推送到BASH_ARGC。 shell 仅在扩展调试模式下设置 BASH_ARGC(请参阅下面内置的 shopt 选项的说明)。在 shell 开始执行脚本后设置 extdebug,或者在未设置 extdebug 时引用此变量,可能会导致值不一致。

BASH_ARGV

一个数组变量,包含当前 bash 执行调用堆栈中的所有参数。最后一个子程序调用的最终参数位于栈顶;初始调用的第一个参数位于底部。当执行子例程时,提供的参数被推送到BASH_ARGV。 shell 仅在扩展调试模式下设置 BASH_ARGV(请参阅下面内置的 shopt 选项的说明)。在 shell 开始执行脚本后设置 extdebug,或者在未设置 extdebug 时引用此变量,可能会导致值不一致。

BASH_ARGV0

引用时,该变量将扩展为 shell 或 shell 脚本的名称(与 $0 相同;请参阅上面特殊参数 0 的说明)。分配给 BASH_ARGV0 会导致分配给 $0 的值也分配给 $0。如果 BASH_ARGV0 未设置,它将失去其特殊属性,即使随后重置也是如此。

BASH_CMDS

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

BASH_COMMAND

当前正在执行或即将执行的命令,除非 shell 正在执行作为陷阱结果的命令,在这种情况下,它是在陷阱时执行的命令。如果 BASH_COMMAND 未设置,它将失去其特殊属性,即使随后重置也是如此。

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 环境中加一。初始值为 0。如果未设置 BASH_SUBSHELL,它将失去其特殊属性,即使随后重置也是如此。

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 实例版本的字符串。

COMP_CWORD

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

COMP_KEY

用于调用当前完成函数的键(或键序列的最终键)。

COMP_LINE

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

COMP_POINT

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

COMP_TYPE

设置为与导致调用完成函数的尝试完成类型相对应的整数值:TAB,用于正常完成,?,用于在连续选项卡后列出完成, !,用于列出部分单词补全的替代项,@,用于在单词未被修改时列出补全,或 %,用于菜单补全。此变量仅在由可编程完成工具调用的 shell 函数和外部命令中可用(请参阅下面的可编程完成)。

COMP_WORDBREAKS

readline 库在执行单词完成时将其视为单词分隔符的字符集。如果未设置 COMP_WORDBREAKS,它将失去其特殊属性,即使随后重置也是如此。

COMP_WORDS

一个数组变量(参见下面的数组),由当前命令行中的各个单词组成。如上所述,使用 COMP_WORDBREAKS 将行拆分为单词,就像 readline 将其拆分一样。此变量仅在由可编程完成工具调用的 shell 函数中可用(请参阅下面的可编程完成)。

COPROC

创建一个数组变量(请参阅下面的数组),用于保存未命名协进程(请参阅上面的协进程)的输出和输入的文件描述符。

DIRSTACK

包含目录堆栈当前内容的数组变量(请参阅下面的数组)。目录按照内置 dirs 显示的顺序出现在堆栈中。分配给该数组变量的成员可用于修改堆栈中已有的目录,但必须使用 pushd 和 popd 内置函数来添加和删除目录。对此变量的赋值不会更改当前目录。如果DIRSTACK未设置,它将失去其特殊属性,即使随后重置也是如此。

EPOCHREALTIME

每次引用此参数时,它都会扩展为自 Unix Epoch 以来的秒数(参见time(3)),作为具有微秒粒度的浮点值。对 EPOCHREALTIME 的赋值将被忽略。如果EPOCHREALTIME未设置,它将失去其特殊属性,即使随后重置也是如此。

EPOCHSECONDS

每次引用此参数时,它都会扩展为自 Unix Epoch 以来的秒数(请参阅time(3))。对 EPOCHSECONDS 的赋值将被忽略。如果EPOCHSECONDS未设置,它将失去其特殊属性,即使随后重置也是如此。

EUID

扩展为当前用户的有效用户 ID,在 shell 启动时初始化。该变量是只读的。

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 内置函数使用此信息显示当前的调用堆栈。

GROUPS

包含当前用户所属组列表的数组变量。对GROUPS的分配无效。如果GROUPS未设置,它将失去其特殊属性,即使随后重置也是如此。

HISTCMD

当前命令的历史编号或历史列表中的索引。对 HISTCMD 的分配将被忽略。如果HISTCMD未设置,它将失去其特殊属性,即使随后重置也是如此。

HOSTNAME

自动设置为当前主机的名称。

HOSTTYPE

自动设置为唯一描述正在执行 bash 的机器类型的字符串。默认值取决于系统。

LINENO

每次引用此参数时,shell 都会替换一个十进制数字,表示脚本或函数中当前的连续行号(从 1 开始)。当不在脚本或函数中时,不保证替换的值有意义。如果LINENO未设置,它将失去其特殊属性,即使随后重置也是如此。

MACHTYPE

自动设置为一个字符串,以标准 GNU cpu-company-system 格式完整描述正在执行 bash 的系统类型。默认值取决于系统。

MAPFILE

创建一个数组变量(请参阅下面的数组),用于在未提供变量名称时保存内置mapfile读取的文本。

OLDPWD

由 cd 命令设置的上一个工作目录。

OPTARG

由getopts内置命令处理的最后一个选项参数的值(请参阅下面的SHELL BUILTIN COMMANDS)。

OPTIND

getopts 内置命令要处理的下一个参数的索引(请参阅下面的 SHELL BUILTIN COMMANDS)。

OSTYPE

自动设置为描述正在执行 bash 的操作系统的字符串。默认值取决于系统。

PIPESTATUS

一个数组变量(参见下面的数组),包含最近执行的前台管道(可能只包含单个命令)中进程的退出状态值列表。

PPID

shell 父进程的进程 ID。该变量是只读的。

PWD

由 cd 命令设置的当前工作目录。

RANDOM

每次引用此参数时,它都会扩展为 0 到 32767 之间的随机整数。为 RANDOM 分配一个值会初始化(种子)随机数序列。如果RANDOM未设置,它将失去其特殊属性,即使随后重置也是如此。

READLINE_LINE

readline 行缓冲区的内容,与“bind -x”一起使用(请参阅下面的SHELL BUILTIN COMMANDS)。

READLINE_MARK

readline 行缓冲区中标记(保存的插入点)的位置,与“bind -x”一起使用(请参阅下面的SHELL BUILTIN COMMANDS)。插入点和标记之间的字符通常称为区域。

READLINE_POINT

readline 行缓冲区中插入点的位置,与“bind -x”一起使用(请参阅下面的SHELL BUILTIN COMMANDS)。

REPLY

当不提供参数时,设置为 read 内置命令读取的输入行。

SECONDS

每次引用此参数时,都会返回自 shell 调用以来的秒数。如果将值分配给SECONDS,则后续引用时返回的值是自分配以来的秒数加上所分配的值。 shell 调用时的秒数和当前时间始终通过查询系统时钟来确定。如果SECONDS未设置,它将失去其特殊属性,即使随后重置也是如此。

SHELLOPTS

以冒号分隔的已启用 shell 选项列表。列表中的每个单词都是 set 内置命令的 -o 选项的有效参数(请参阅下面的 SHELL BUILTIN COMMANDS)。 SHELLOPTS 中出现的选项是由 set -o 报告为on的选项。如果 bash 启动时环境中存在此变量,则在读取任何启动文件之前将启用列表中的每个 shell 选项。该变量是只读的。

SHLVL

每次启动 bash 实例时加一。

SRANDOM

每次引用该变量时,它都会扩展为 32 位伪随机数。在支持 /dev/urandom 或 arc4random 的系统上,随机数生成器不是线性的,因此每个返回的数字与其前面的数字没有关系。随机数生成器无法播种,因此对该变量的赋值无效。如果SRANDOM未设置,它将失去其特殊属性,即使随后重置也是如此。

UID

扩展为当前用户的用户 ID,在 shell 启动时初始化。该变量是只读的。

shell 使用以下变量。在某些情况下,bash 会为变量分配一个默认值;这些案例如下。

BASH_COMPAT

该值用于设置 shell 的兼容性级别。请参阅下面的SHELL COMPATIBILITY MODE,了解各种兼容性级别及其效果的说明。该值可以是与所需兼容性级别相对应的十进制数(例如,4.2)或整数(例如,42)。如果 BASH_COMPAT 未设置或设置为空字符串,则兼容性级别将设置为当前版本的默认值。如果 BASH_COMPAT 设置的值不是有效兼容性级别之一,则 shell 会打印一条错误消息并将兼容性级别设置为当前版本的默认值。有效值对应于下面描述的兼容性级别

BSHELL兼容性模式。例如,4.2 和 42 是有效值,对应于 compat42 shopt 选项,并将兼容性级别设置为 42。当前版本也是有效值。

BASH_ENV

如果在 bash 执行 shell 脚本时设置此参数,则其值将被解释为包含初始化 shell 的命令的文件名,如 ~/.bashrc 中。 BASH_ENV 的值在被解释为文件名之前经过参数扩展、命令替换和算术扩展。

PATH 不用于搜索结果文件名。

BASH_XTRACEFD

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

CDPATH

cd 命令的搜索路径。这是一个以冒号分隔的目录列表,shell 在其中查找由 cd 命令指定的目标目录。示例值为“.:~:/usr”。

CHILD_MAX

设置 shell 要记住的退出子状态值的数量。 Bash 不允许该值降低到 POSIX 规定的最小值以下,并且有一个不得超过的最大值(当前为 8192)。最小值取决于系统。

COLUMNS

由 select 复合命令用来确定打印选择列表时的终端宽度。如果启用了 checkwinsize 选项,或者在交互式 shell 中收到 SIGWINCH,则自动设置。

COMPREPLY

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

EMACS

如果当 shell 以值“t”启动时 bash 在环境中找到此变量,则假定 shell 正在 Emacs shell 缓冲区中运行并禁用行编辑。

ENV

当在 posix 模式下调用交互式 shell 时,扩展和执行与 BASH_ENV 类似(请参阅上面的 INVOCATION)。

EXECIGNORE

以冒号分隔的 shell 模式列表(请参阅模式匹配),定义使用 PATH 的命令搜索要忽略的文件名列表。出于通过 PATH 查找完成和命令执行的目的,完整路径名与这些模式之一匹配的文件不被视为可执行文件。这不会影响 [、test 和 [[ 命令的行为。命令哈希表中的完整路径名不受 EXECIGNORE 的约束。使用此变量可以忽略设置了可执行位但不是可执行文件的共享库文件。模式匹配遵循 extglob shell 选项的设置。

FCEDIT

fc 内置命令的默认编辑器。

FIGNORE

执行文件名补全时要忽略的以冒号分隔的后缀列表(请参阅下面的READLINE)。后缀与 FIGNORE 中的条目之一匹配的文件名将从匹配文件名列表中排除。示例值为“.o:~”。

FUNCNEST

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

GLOBIGNORE

以冒号分隔的模式列表,定义路径名扩展要忽略的文件名集。如果与路径名扩展模式匹配的文件名也与 GLOBIGNORE 中的模式之一匹配,则会将其从匹配列表中删除。

HISTCONTROL

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

HISTFILE

保存命令历史记录的文件的名称(请参阅下面的HISTORY)。默认值为~/.bash_history。如果未设置,则 shell 退出时不会保存命令历史记录。

HISTFILESIZE

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

HISTIGNORE

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

HISTSIZE

命令历史记录中要记住的命令数(请参阅下面的历史记录)。如果值为 0,则命令不会保存在历史列表中。小于零的数值会导致每个命令都保存在历史列表中(没有限制)。 shell 在读取任何启动文件后将默认值设置为 500。

HISTTIMEFORMAT

如果此变量已设置且不为空,则其值将用作 strftime(3) 的格式字符串,以打印与 history 显示的每个历史条目关联的时间戳内置的。如果设置了此变量,时间戳将写入历史文件,以便可以跨 shell 会话保留它们。这使用历史注释字符来区分时间戳和其他历史行。

HOME

当前用户的主目录; cd 内置命令的默认参数。执行波形符扩展时也会使用此变量的值。

HOSTFILE

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

IFS

内部字段分隔符,用于扩展后的单词拆分,以及使用 read 内置命令将行拆分为单词。默认值为``<space><tab><newline>''。

IGNOREEOF

控制交互式 shell 在收到 EOF 字符作为唯一输入时的操作。如果设置,则该值是连续 EOF 字符的数量,在 bash 退出之前必须将其作为输入行上的第一个字符键入。如果变量存在但没有数值,或者没有值,则默认值为 10。如果不存在,EOF 表示 shell 输入结束。

INPUTRC

readline 启动文件的文件名,覆盖默认的 ~/.inputrc (请参阅下面的READLINE)。

INSIDE_EMACS

如果该变量在 shell 启动时出现在环境中,则 bash 假定它在 Emacs shell 缓冲区内运行,并且可能会禁用行编辑,具体取决于 TERM 的值。

LANG

用于确定未使用以 LC_ 开头的变量专门选择的任何类别的区域设置类别。

LC_ALL

此变量会覆盖 LANG 和任何其他指定区域设置类别的 LC_ 变量的值。

LC_COLLATE

此变量确定对路径名扩展结果进行排序时使用的排序规则,并确定范围表达式、等价类以及路径名扩展和模式匹配中的排序序列的行为。

LC_CTYPE

该变量确定路径名扩展和模式匹配中字符的解释以及字符类的行为。

LC_MESSAGES

此变量确定用于翻译前面带有 $ 的双引号字符串的区域设置。

LC_NUMERIC

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

LC_TIME

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

LINES

由 select 复合命令用来确定打印选择列表的列长度。如果启用了 checkwinsize 选项,或者在交互式 shell 中收到 SIGWINCH,则自动设置。

MAIL

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

MAILCHECK

指定 bash 检查邮件的频率(以秒为单位)。默认值为 60 秒。当需要检查邮件时,外壳程序会在显示主提示符之前执行此操作。如果未设置此变量,或者将其设置为不大于或等于零的数字,则 shell 将禁用邮件检查。

MAILPATH

要检查邮件的以冒号分隔的文件名列表。当邮件到达特定文件时要打印的消息可以通过用“?”分隔文件名和消息来指定。当在消息文本中使用时,$_ 扩展为当前邮件文件的名称。例子:

MAILPATH='/var/mail/bfox?"You have mail":~/shell-mail?"$_ has mail!"'

Bash 可以配置为此变量提供默认值(默认情况下没有值),但它使用的用户邮件文件的位置取决于系统(例如, )。

/var/mail/$USER
OPTERR

如果设置为值 1,bash 将显示由 getopts 内置命令生成的错误消息(请参阅下面的 SHELL BUILTIN COMMANDS)。

每次调用 shell 或执行 shell 脚本时,OPTERR 都会初始化为 1。

PATH

命令的搜索路径。它是一个以冒号分隔的目录列表,shell 在其中查找命令(请参阅下面的命令执行)。 PATH 值中的零长度 (null) 目录名表示当前目录。空目录名称可能显示为两个相邻的冒号,或者开头或结尾的冒号。默认路径与系统相关,由安装bash的管理员设置。一个共同的价值观是

/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
POSIXLY_CORRECT

如果此变量在 bash 启动时位于环境中,则 shell 在读取启动文件之前进入 posix 模式,就像 --posix 调用一样已提供选项。如果在 shell 运行时设置它,bash 将启用 posix 模式,就像命令 set -o posix 已被执行一样。当 shell 进入 posix 模式时,如果尚未设置该变量,它会设置该变量。

PROMPT_COMMAND

如果此变量已设置并且是一个数组,则每个设置元素的值将在发出每个主提示之前作为命令执行。如果已设置但不是数组变量,则其值将用作要执行的命令。

PROMPT_DIRTRIM

如果设置为大于零的数字,则该值将用作展开 \w 和 \W 提示字符串转义时要保留的尾随目录组件的数量(请参阅<下面是强>提示)。删除的字符将替换为省略号。

PS0

该参数的值会在读取命令之后和执行命令之前由交互式 shell 扩展(请参阅下面的提示)并显示。

PS1

该参数的值被扩展(参见下面的PROMPTING)并用作主要提示字符串。默认值为``\s-\v\$''。

PS2

该参数的值与PS1一样扩展,并用作辅助提示字符串。默认值为``> ''。

PS3

该参数的值用作select命令的提示(参见上面的SHELL GRAMMAR)。

PS4

此参数的值与 PS1 一样扩展,并且在执行跟踪期间显示每个命令 bash 之前打印该值。根据需要,PS4 扩展值的第一个字符会被重复多次,以指示多个间接级别。默认值为``+ ''。

SHELL

该变量扩展为 shell 的完整路径名。如果 shell 启动时未设置,bash 会为其分配当前用户登录 shell 的完整路径名。

TIMEFORMAT

此参数的值用作格式字符串,指定如何显示以 time 保留字为前缀的管道的计时信息。 % 字符引入了扩展为时间值或其他信息的转义序列。转义序列及其含义如下;大括号表示可选部分。

%%

字面意思%。

%[p][l]R

以秒为单位的经过时间。

%[p][l]U

在用户模式下花费的 CPU 秒数。

%[p][l]S

在系统模式下花费的 CPU 秒数。

%P

CPU 百分比,计算公式为 (%U + %S)/%R。

可选的p是指定精度的数字,即小数点后的小数位数。值为 0 会导致不输出小数点或分数。最多可以指定小数点后三位;大于 3 的 p 值将更改为 3。如果未指定 p,则使用值 3。

可选的l指定更长的格式,包括分钟,格式为MMmSS.FFs。 p 的值决定是否包含分数。

如果未设置此变量,bash 的行为就像其值为 $'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS' 。如果该值为空,则不显示计时信息。显示格式字符串时会添加尾随换行符。

TMOUT

如果设置为大于零的值,则 TMOUT 将被视为 read 内置函数的默认超时。如果输入未到达,select命令将终止

当输入来自终端时的TMOUT秒。在交互式 shell 中,该值被解释为发出主提示后等待一行输入的秒数。如果未到达完整的输入行,Bash 将在等待该秒数后终止。

TMPDIR

如果设置,bash 使用其值作为目录名称,bash 在其中创建临时文件以供 shell 使用。

auto_resume

该变量控制 shell 如何与用户和作业控件交互。如果设置了此变量,则不带重定向的单字简单命令将被视为恢复现有已停止作业的候选命令。不允许有歧义;如果存在多个以键入的字符串开头的作业,则选择最近访问的作业。在这种情况下,已停止作业的名称是用于启动它的命令行。如果设置为值exact,则提供的字符串必须与已停止作业的名称完全匹配;如果设置为 substring,则提供的字符串需要与已停止作业名称的子字符串匹配。 子字符串值提供类似于%?作业标识符的功能(请参阅下面的作业控制)。如果设置为任何其他值,则提供的字符串必须是已停止作业名称的前缀;这提供了类似于%字符串作业标识符的功能。

histchars

控制历史扩展和标记化的两个或三个字符(请参阅下面的历史扩展)。第一个字符是历史扩展字符,该字符标志着历史扩展的开始,通常为“!”。第二个字符是快速替换字符,它用作重新运行先前输入的命令的简写,将命令中的一个字符串替换为另一个字符串。默认值为“^”。可选的第三个字符是当作为单词的第一个字符找到时指示该行的其余部分是注释的字符,通常为“#”。历史注释字符会导致该行中剩余单词的历史替换被跳过。它不一定会导致 shell 解析器将该行的其余部分视为注释。

数组

Bash 提供一维索引和关联数组变量。任何变量都可以用作索引数组; declare 内置函数将显式声明一个数组。数组的大小没有最大限制,也没有对成员进行连续索引或分配的要求。索引数组使用整数(包括算术表达式)引用,并且是从零开始的;使用任意字符串引用关联数组。除非另有说明,索引数组索引必须是非负整数。

如果使用语法名称[下标]=值分配任何变量,则会自动创建索引数组。 下标被视为必须计算为数字的算术表达式。要显式声明索引数组,请使用declare -a name(请参阅下面的SHELL BUILTIN COMMANDS)。 declare -a name[下标]也被接受; 下标被忽略。

关联数组是使用declare -A name创建的。

可以使用 declare 和 readonly 内置函数为数组变量指定属性。每个属性适用于数组的所有成员。

数组使用以下形式的复合赋值进行赋值:name=(value1 ... valuen),其中每个值可以采用[下标]=字符串的形式。索引数组赋值除了字符串之外不需要任何东西。列表中的每个值都使用下面EXPANSION下描述的所有外壳扩展进行扩展。当分配给索引数组时,如果提供了可选的括号和下标,则该索引被分配给;否则,分配的元素的索引是该语句分配的最后一个索引加一。索引从零开始。

当分配给关联数组时,复合赋值中的单词可以是需要下标的赋值语句,也可以是被解释为交替键和值序列的单词列表:名称 =( key1 value1 key2 value2 ...)。这些的处理方式与 name=( [key1]=value1 [key2 ]=值2 ...)。列表中的第一个单词决定如何解释其余单词;列表中的所有分配必须属于同一类型。使用键/值对时,键不能缺失或为空;最终缺失值被视为空字符串。

declare 内置函数也接受此语法。可以使用上面介绍的名称[下标]=值语法来分配各个数组元素。分配给索引数组时,如果 name 的下标为负数,则该数字将被解释为相对于大于 name 的最大索引的 1,因此负索引计数从数组末尾向后,索引 -1 引用最后一个元素。

数组的任何元素都可以使用 $ {name[下标]} 引用。需要使用大括号以避免与路径名扩展发生冲突。如果下标是@或*,则该词将扩展到name的所有成员。仅当单词出现在双引号内时,这些下标才会有所不同。如果单词用双引号引起来,则 $ {name[*]} 扩展为单个单词,每个数组成员的值由 IFS 的第一个字符分隔> 特殊变量,并且 $ {name[@]} 将 name 的每个元素扩展为单独的单词。当没有数组成员时,$ {name[@]} 扩展为空。如果双引号扩展发生在单词内,则第一个参数的扩展与原始单词的开头部分连接,最后一个参数的扩展与原始单词的最后部分连接。这类似于特殊参数*和@的扩展(参见上面的特殊参数)。 $ {#name[下标]} 扩展为 $ {name[下标> 的长度]}。如果下标为*或@,则扩展为数组中元素的数量。如果用于引用索引数组元素的下标计算结果为小于零的数字,则它被解释为相对于大于数组最大索引的1,因此负索引从数组末尾,索引 -1 引用最后一个元素。

引用不带下标的数组变量相当于引用下标为 0 的数组。任何使用有效下标的变量引用都是合法的,如果需要,bash 将创建一个数组。

如果下标已被赋值,则数组变量被视为已设置。空字符串是有效值。

可以获得数组的键(索引)以及值。 $ {!姓名[@]} 和 $ {!姓名[*]} 扩展为数组变量 name 中分配的索引。双引号中的处理类似于双引号中特殊参数 @ 和 * 的扩展。

unset 内置函数用于销毁数组。对于索引数组和关联数组,unset name[下标] 会销毁索引下标 处的数组元素。索引数组的负下标的解释如上所述。取消设置数组变量的最后一个元素不会取消设置该变量。 unset name,其中 name 是一个数组,或 unset name[下标],其中下标是*或@,删除整个数组。

当使用带有下标的变量名作为命令的参数时(例如使用 unset),而不使用上述单词扩展语法,该参数将受到路径名扩展的影响。如果不需要扩展路径名,则应引用该参数。

declare、local 和 readonly 内置函数均接受 -a 选项来指定索引数组和 < Strong>-A 选项指定关联数组。如果提供了两个选项,则 -A 优先。 read 内置函数接受 -a 选项将从标准输入读取的单词列表分配给数组。 set 和 declare 内置函数以允许将数组值重新用作赋值的方式显示数组值。

扩张

扩展是在命令行上被分割成单词后执行的。执行的扩展有七种:大括号扩展、波形符扩展、参数和变量扩展、命令替换、 算术扩展、分词和路径名扩展。

展开的顺序是:大括号展开;波形符扩展、参数和变量扩展、算术扩展和命令替换(以从左到右的方式完成);分词;和路径名扩展。

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

执行这些扩展后,原始单词中存在的引号字符将被删除,除非它们本身已被引用(引号删除)。

只有大括号扩展、分词、路径名扩展才能增加扩展的字数;其他扩展将单个单词扩展为单个单词。唯一的例外是“$@”和“$ {name[@]} ”的扩展”,并且在大多数情况下,$* 和 $ {name[*]}如上所述(参见参数)。

支撑扩张

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

大括号扩展可以嵌套。每个扩展字符串的结果都没有排序;从左到右的顺序被保留。例如,a{d,c,b}e 扩展为“ade ace abe”。

序列表达式采用以下形式:{x..y[..<incr]},其中 x 和 y 是整数或单个字符,incr > 是一个可选增量,是一个整数。当提供整数时,表达式将扩展为 x 和 y 之间的每个数字(含)。提供的整数可以以 0 为前缀,以强制每个项具有相同的宽度。当 x 或 y 以零开头时,shell 会尝试强制所有生成的术语包含相同数量的数字,并在必要时进行零填充。当提供字符时,表达式将使用默认的 C 语言环境按字典顺序扩展为 x 和 y 之间的每个字符(包含这两个字符)。请注意,x 和 y 必须属于同一类型。当提供增量时,它被用作每项之间的差。默认增量为 1 或 -1(视情况而定)。

大括号扩展在任何其他扩展之前执行,并且其他扩展特有的任何字符都将保留在结果中。它是严格的文本。 Bash 不会对扩展上下文或大括号之间的文本应用任何语法解释。

格式正确的大括号扩展必须包含不带引号的左大括号和右大括号,以及至少一个不带引号的逗号或有效的序列表达式。任何错误形成的大括号扩展都保持不变。 { 或 , 可以用反斜杠引用,以防止其被视为大括号表达式的一部分。为了避免与参数扩展发生冲突,字符串 $ { 不被视为符合大括号扩展的条件,并且会禁止大括号扩展,直到结束 }。

当要生成的字符串的公共前缀比上面的示例长时,此构造通常用作简写:

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

或者

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

大括号扩展与 sh 的历史版本略有不兼容。当左大括号或右大括号作为单词的一部分出现时,sh 不会对其进行特殊处理,并将它们保留在输出中。由于大括号扩展,Bash 从单词中删除大括号。例如,在 sh 中输入的单词作为 file{1,2} 在输出中显示相同。同样的单词经过bash扩展后输出为file1 file2。如果需要与 sh 严格兼容,请使用 +B 选项启动 bash 或使用 +B 禁用大括号扩展> set 命令的选项(请参阅下面的SHELL BUILTIN COMMANDS)。

波形符扩展

如果单词以不带引号的波形符字符 (`~') 开头,则第一个不带引号的斜杠之前的所有字符(或所有字符,如果没有不带引号的斜杠)都被视为波形符-前缀。如果波形符前缀中的任何字符均未加引号,则波形符前缀中跟随波形符的字符将被视为可能的登录名。如果此登录名是空字符串,则波浪号将替换为 shell 参数 HOME 的值。如果未设置 HOME,则会替换执行 shell 的用户的主目录。否则,波形符前缀将替换为与指定登录名关联的主目录。

如果波形符前缀是“~+”,则 shell 变量 PWD 的值将替换波形符前缀。如果波形符前缀是“~-”,则 shell 变量 OLDPWD 的值(如果已设置)将被替换。如果波浪号前缀中波浪号后面的字符由数字 N 组成,并且可以选择以“+”或“-”作为前缀,则波浪号前缀将替换为目录中的相应元素堆栈,因为它将由使用波形符前缀作为参数调用的 dirs 内置函数显示。如果波浪号前缀中波浪号后面的字符由不带前导“+”或“-”的数字组成,则假定为“+”。

如果登录名无效,或者波形符扩展失败,则单词保持不变。

每个变量赋值都会检查紧跟在 : 或第一个 = 后面的未加引号的波形符前缀。在这些情况下,还会执行波形符扩展。因此,可以在对 PATH、MAILPATH 和 CDPATH 的分配中使用带波形符的文件名,并且 shell 分配扩展值。

当满足变量赋值条件的单词(如上面参数中所述)作为简单命令的参数出现时,Bash 还会对单词执行波形符扩展。在 posix 模式 下,除了上面列出的声明命令之外,Bash 不会执行此操作。

参数扩展

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

使用大括号时,匹配的结束大括号是第一个未被反斜杠转义的“}”,或者在带引号的字符串中,并且不在嵌入的算术扩展、命令替换或参数扩展中。

${parameter}

参数的值被替换。当 parameter 是一个多于一位数字的位置参数时,或者当 parameter 后跟一个不被解释为其名称一部分的字符时,需要使用大括号。 参数是如上所述的shell参数PARAMETERS)或数组引用(Arrays)。

如果parameter的第一个字符是感叹号(!),并且parameter不是nameref,则它引入了间接级别。 Bash 使用扩展剩余参数形成的值作为新的参数;然后将其扩展,并且该值将用于扩展的其余部分,而不是原始参数的扩展。这称为间接扩展。该值可以进行波形符扩展、参数扩展、命令替换和算术扩展。如果 parameter 是 nameref,则它将扩展为 parameter 引用的参数的名称,而不是执行完整的间接扩展。例外情况是 $ {!前缀*} 和 $ {! name[@]} 如下所述。感叹号必须紧跟在左大括号之后才能引入间接关系。

在下面的每种情况下,单词都会受到波形符扩展、参数扩展、命令替换和算术扩展的影响。

当不执行子字符串扩展时,使用下面记录的形式(例如,:-),bash测试未设置或为空的参数。省略冒号会导致仅测试未设置的参数。

${parameter:-word}

使用默认值。如果参数未设置或为空,则替换单词的扩展。否则,参数的值将被替换。

${parameter:=word}

指定默认值。如果parameter未设置或为空,则word的扩展将分配给parameter。然后替换参数的值。位置参数和特殊参数不能以这种方式分配。

${parameter:?word}

如果为空或未设置,则显示错误。如果 parameter 为 null 或未设置,则 word 的扩展(如果 word 不存在,则显示一条消息)写入标准错误,如果 shell 不是交互式的,则退出。否则,参数的值将被替换。

${parameter:+word}

使用替代值。如果参数为空或未设置,则不会替换任何内容,否则单词的扩展将被替换。

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

子字符串扩展。从 offset 指定的字符开始,扩展到 parameter 值的最多 length 个字符。如果参数为@、以@或*下标的索引数组或关联数组名称,则结果如下所述有所不同。如果省略 length,则扩展为 parameter 值的子字符串,从 offset 指定的字符开始,一直延伸到值的末尾。 长度和偏移是算术表达式(参见下面的算术评估)。

如果 offset 的计算结果为小于零的数字,则该值将用作距 parameter 值末尾的字符偏移量。如果 length 计算结果为小于零的数字,则将其解释为距 parameter 值末尾的字符偏移量,而不是字符数,并且扩展是 offset 和结果之间的字符。请注意,负偏移量必须与冒号分隔至少一个空格,以避免与 :- 扩展混淆。

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

如果 parameter 是一个索引数组名称,下标为 @ 或 *,则结果是以 $ {parameter 开头的数组的 length 成员[偏移]}。负偏移量是相对于比指定数组的最大索引大的值而言的。如果 length 计算结果为小于零的数字,则这是一个扩展错误。

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

除非使用位置参数,否则子字符串索引从零开始,在这种情况下,索引默认从 1 开始。如果 offset 为 0,并且使用位置参数,则 $0 将作为列表的前缀。

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

名称匹配前缀。扩展为名称以前缀开头的变量名称,并以第一个字符分隔

IFS 特殊变量。当使用 @ 且扩展出现在双引号内时,每个变量名称都会扩展为一个单独的单词。

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

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

${#parameter}

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

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

删除匹配的前缀模式。就像在路径名扩展中一样,单词被扩展以产生一个模式,并使用模式匹配中描述的规则与参数的扩展值进行匹配以下。如果模式与 parameter 值的开头匹配,则扩展的结果是具有最短匹配模式的 parameter 的扩展值(`` #'' 大小写)或最长的匹配模式(``##'' 大小写)已删除。如果参数为@或*,则模式移除操作将依次应用于每个位置参数,并且扩展是结果列表。如果参数是一个下标为@或*的数组变量,则模式删除操作将依次应用于数组的每个成员,并且扩展是结果列表。

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

删除匹配的后缀模式。就像在路径名扩展中一样,单词被扩展以产生一个模式,并使用模式匹配中描述的规则与参数的扩展值进行匹配以下。如果模式与 parameter 扩展值的尾部部分匹配,则扩展的结果是具有最短匹配模式的 parameter 扩展值(``%'' 情况)或最长的匹配模式(``%%'' 情况)已删除。如果参数为@或*,则模式移除操作将依次应用于每个位置参数,并且扩展是结果列表。如果参数是一个下标为@或*的数组变量,则模式删除操作将依次应用于数组的每个成员,并且扩展是结果列表。

${parameter/pattern/string}

模式替换。 pattern 被扩展以生成一个模式,就像在路径名扩展中一样,Parameter 被扩展,并且 pattern 与其值的最长匹配被替换为字符串。使用下面的模式匹配中描述的规则来执行匹配。如果pattern以/开头,则pattern的所有匹配项都将替换为string。通常只替换第一个匹配项。如果模式以#开头,则它必须在参数的扩展值的开头匹配。如果模式以%开头,则它必须在参数扩展值的末尾匹配。如果string为空,则删除pattern的匹配项,并且可以省略pattern后面的/。如果启用 nocasematch shell 选项,则执行匹配时将不考虑字母字符的大小写。如果参数为@或*,则替换操作将依次应用于每个位置参数,并且扩展是结果列表。如果parameter是下标为@或*的数组变量,则依次对数组的每个成员进行替换操作,并进行扩展是结果列表。

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

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

${parameter@operator}

参数转换。扩展要么是参数值的转换,要么是参数本身的信息,具体取决于运算符的值。每个运算符都是一个字母:

U

扩展是一个字符串,它是 parameter 的值,其中小写字母字符转换为大写字母。

u

扩展是一个字符串,它是 parameter 的值,其中第一个字符转换为大写(如果是字母)。

L

扩展是一个字符串,它是 parameter 的值,其中大写字母字符转换为小写字母。

Q

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

E

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

P

扩展是一个字符串,它是扩展 parameter 值的结果,就好像它是一个提示字符串(请参阅下面的PROMPTING)。

A

扩展是一个赋值语句或声明命令形式的字符串,如果对其求值,将重新创建参数及其属性和值。

K

生成 parameter 值的可能引用版本,不同之处在于它将索引数组和关联数组的值打印为带引号的键值对序列(请参阅上面的数组) )。

a

扩展是一个由表示参数属性的标志值组成的字符串。

如果参数为@或*,则该操作依次应用于每个位置参数,并且扩展是结果列表。如果parameter是下标为@或*的数组变量,则依次对数组的每个成员进行运算,扩展为结果列表。

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

命令替换

命令替换允许命令的输出替换命令名称。有两种形式:

$(command )

或者

`command`

Bash 通过在子 shell 环境中执行命令来执行扩展,并将命令替换替换为命令的标准输出,并删除所有尾随换行符。嵌入的换行符不会被删除,但它们可能会在分词过程中被删除。命令替换 $ (cat file) 可以替换为等效但更快的 $ (< >文件)。

当使用旧式反引号形式的替换时,反斜杠保留其字面含义,除非后面跟有 $、` 或 \。前面没有反斜杠的第一个反引号终止命令替换。当使用 $ ( command ) 形式时,括号内的所有字符组成命令;没有一个受到特殊对待。

命令替换可以嵌套。要在使用反引号形式时进行嵌套,请使用反斜杠转义内部反引号。

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

算术扩展

算术展开允许计算算术表达式并替换结果。算术展开式的格式为:

$((expression))

表达式被视为位于双引号内,但括号内的双引号不会被特殊处理。表达式中的所有标记都会经历参数和变量扩展、命令替换和引号删除。结果被视为要计算的算术表达式。算术展开式可以嵌套。

评估根据下面算术评估下列出的规则进行。如果表达式无效,bash将打印一条消息指示失败并且不会发生替换。

流程替代

进程替换允许使用文件名引用进程的输入或输出。它采用 <(list ) 或 >(list )。进程list是异步运行的,其输入或输出显示为文件名。该文件名作为扩展结果作为参数传递给当前命令。如果使用 >(list ) 形式,写入文件将为 list 提供输入。如果使用 <(list ) 形式,则应读取作为参数传递的文件以获得 list 的输出。支持命名管道 (FIFO) 或/dev/fd 命名打开文件方法的系统支持进程替换。

如果可用,进程替换与参数和变量扩展、命令替换和算术扩展同时执行。

分词

shell 会扫描未出现在双引号内的参数扩展、命令替换和算术扩展的结果,以进行分词。

shell 将 IFS 的每个字符视为分隔符,并使用这些字符作为字段终止符将其他扩展的结果拆分为单词。如果未设置 IFS,或其值恰好是默认值 <space><tab><newline>,则 <space> 序列先前扩展结果开头和结尾处的 、 <tab> 和 <newline> 将被忽略,并且任何 IFS 序列不在开头或结尾的字符用于分隔单词。如果 IFS 的值不是默认值,则为空白字符 space、tab 和 newline 的序列只要空白字符在 IFS 的值中(IFS 空白字符),单词的开头和结尾就会被忽略。 IFS 中非 IFS 空白的任何字符以及任何相邻的 IFS 空白字符共同界定字段。 IFS 空白字符序列也被视为分隔符。如果IFS的值为空,则不会发生分词。

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

请注意,如果没有发生扩展,则不会执行拆分。

路径名扩展

分词后,除非设置了 -f 选项,否则 bash 会扫描每个单词中的字符 *、? > 和[。如果出现这些字符之一,并且未加引号,则该单词将被视为模式,并替换为与该模式匹配的按字母顺序排序的文件名列表(请参阅模式匹配 ) 如下)。如果没有找到匹配的文件名,并且未启用 shell 选项 nullglob,则该单词将保持不变。如果设置了 nullglob 选项,并且未找到匹配项,则该单词将被删除。如果设置了 failglob shell 选项,并且未找到匹配项,则会打印一条错误消息并且不执行该命令。如果启用了 shell 选项 nocaseglob,则执行匹配时将不考虑字母字符的大小写。当模式用于路径名扩展时,名称开头或紧跟在斜杠后面的字符 ``.'' 必须显式匹配,除非 shell 选项 dotglob > 已设置。文件名 ``.'' 和 ``..'' 必须始终显式匹配,即使设置了 dotglob 也是如此。在其他情况下,``.'' 字符不会被特殊处理。匹配路径名时,斜杠字符必须始终与模式中的斜杠显式匹配,但在其他匹配上下文中,它可以与特殊模式字符匹配,如下模式匹配中所述。有关 nocaseglob、nullglob、 的说明,请参阅下面 SHELL BUILTIN COMMANDS 下的 shopt 说明。 failglob 和 dotglob shell 选项。

GLOBIGNORE shell 变量可用于限制与模式匹配的文件名集。如果设置了 GLOBIGNORE,则将从匹配列表中删除也与 GLOBIGNORE 中的模式之一匹配的每个匹配文件名。如果设置了 nocaseglob 选项,则将根据 GLOBIGNORE 中的模式进行匹配,而不考虑大小写。当设置 GLOBIGNORE 并且不为空时,文件名 . 和 .. 始终被忽略。但是,将 GLOBIGNORE 设置为非空值会启用 dotglob shell 选项,因此以 . 开头的所有其他文件名都会匹配。要获得忽略以 . 开头的文件名的旧行为,请将 .* 设为 GLOBIGNORE 中的模式之一。 dotglob 选项在以下情况下被禁用:

GLOBIGNORE 未设置。模式匹配遵循 extglob shell 选项的设置。

模式匹配

除了下面描述的特殊模式字符之外,模式中出现的任何字符都与自身匹配。 NUL 字符不能出现在模式中。反斜杠转义后面的字符;匹配时转义的反斜杠将被丢弃。如果要按字面匹配特殊模式字符,则必须用引号引起来。

特殊模式字符的含义如下:

*

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

?

匹配任何单个字符。

[...]

匹配任何一个包含的字符。由连字符分隔的一对字符表示范围表达式;使用当前语言环境的整理序列和字符集,匹配位于这两个字符之间的任何字符(包括这两个字符)。如果 [ 后面的第一个字符是 ! 或 ^,则匹配任何未括起来的字符。范围表达式中字符的排序顺序由当前区域设置以及 LC_COLLATE 或 LC_ALL shell 变量(如果设置)的值确定。要获得范围表达式的传统解释(其中 [a-d] 相当于 [abcd]),请将 LC_ALL shell 变量的值设置为 C,或启用 globasciiranges shell 选项。 - 可以通过将其作为集合中的第一个或最后一个字符来进行匹配。 ] 可以通过将其作为集合中的第一个字符来进行匹配。

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

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

字符类匹配属于该类的任何字符。 word 字符类匹配字母、数字和字符 _。

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

在 [ 和 ] 中,语法 [.symbol.] 与排序规则匹配符号符号。

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

?( pattern-list )

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

*( pattern-list )

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

+( pattern-list )

匹配给定模式的一次或多次出现

@( pattern-list )

匹配给定模式之一

!( pattern-list )

匹配除给定模式之一之外的任何内容

针对长字符串的复杂扩展模式匹配速度很慢,尤其是当模式包含交替并且字符串包含多个匹配项时。对较短的字符串使用单独的匹配,或使用字符串数组而不是单个长字符串可能会更快。

报价删除

在前面的扩展之后,所有未加引号的字符 \、' 和  "  均被删除,这些字符不是由上述扩展之一产生的。

重定向

在执行命令之前,可以使用 shell 解释的特殊符号重定向其输入和输出。重定向允许命令的文件句柄被复制、打开、关闭、引用不同的文件,并且可以更改命令读取和写入的文件。重定向还可用于修改当前 shell 执行环境中的文件句柄。以下重定向运算符可以在简单命令之前或出现在简单命令中的任何位置,也可以在命令之后。重定向按照它们出现的顺序从左到右进行处理。

每个重定向前面可能带有文件描述符编号,但前面可能带有 {varname} 形式的单词。在这种情况下,对于除 >&- 和 <&- 之外的每个重定向运算符,shell 都会分配一个大于或等于 10 的文件描述符,并将其分配给 varname。如果 >&- 或 <&- 前面有 {varname},则 varname 的值定义要关闭的文件描述符。如果提供了 {varname},则重定向将持续超出命令的范围,从而允许 shell 程序员自己管理文件描述符。

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

在下面的描述中,除非另有说明,否则重定向运算符后面的单词将进行大括号扩展、波形符扩展、参数和变量扩展、命令替换、算术扩展、引号删除、路径名扩展和分词。如果它扩展到多个单词,bash 会报告错误。

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

ls > dirlist 2>&1

将标准输出和标准错误定向到文件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是有效的主机名或互联网地址,port是整数端口号或服务名称,则bash尝试打开相应的UDP套接字。

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

使用大于 9 的文件描述符的重定向应谨慎使用,因为它们可能与 shell 内部使用的文件描述符发生冲突。

重定向输入

输入重定向会导致名称由 word 扩展产生的文件打开以在文件描述符 n 上读取,或者在标准输入(文件描述符 0)上读取,如果 n 未指定。

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

[n]<word

重定向输出

输出重定向会导致名称由 word 扩展产生的文件打开,以便在文件描述符 n 上写入,或者标准输出(文件描述符 1)(如果 >n 未指定。如果文件不存在则创建;如果它确实存在,则会被截断为零大小。

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

[n]>word

如果重定向运算符为>,并且已启用set内置函数的noclobber选项,则如果文件名结果为重定向将失败从 word 的扩展中存在并且是一个常规文件。如果重定向运算符是 >|,或者重定向运算符是 > 并且 set 内置的 noclobber 选项命令未启用,即使以 word 命名的文件存在,也会尝试重定向。

附加重定向输出

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

附加输出的一般格式是:

[n]>>word

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

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

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

&>word

和

>&word

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

>word 2>&1

使用第二种形式时,单词可能不会扩展为数字或-。如果是这样,出于兼容性原因,其他重定向运算符将适用(请参阅下面的复制文件描述符)。

附加标准输出和标准错误

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

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

&>>word

这在语义上等价于

>>word 2>&1

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

这里的文件

这种类型的重定向指示 shell 从当前源读取输入,直到看到仅包含分隔符(没有尾随空格)的行。到该点读取的所有行都将用作命令的标准输入(或文件描述符 n,如果指定了 n)。

这里文档的格式是:

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

不对单词执行任何参数和变量扩展、命令替换、算术扩展或路径名扩展。如果word的任何部分被引用,分隔符是对word删除引号的结果,并且此处文档中的行不是扩大了。如果 word 未加引号,则此处文档的所有行都会进行参数扩展、命令替换和算术扩展,字符序列 \<newline> 将被忽略,并且\ 必须用于引用字符 \、$ 和 `。

如果重定向运算符为<<-,则所有前导制表符将从输入行和包含分隔符的行中删除。这允许 shell 脚本中的此处文档以自然的方式缩进。

这里是字符串

Here 文档的一个变体,格式为:

[n]<<<word

单词经历波形符扩展、参数和变量扩展、命令替换、算术扩展和引号删除。不执行路径名扩展和分词。结果以单个字符串的形式提供给标准输入上的命令(如果指定了 n,则为文件描述符 n)。

复制文件描述符

重定向运算符

[n]<&word

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

运营商

[n]>&word

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

移动文件描述符

重定向运算符

[n]<&digit-

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

类似地,重定向运算符

[n]>&digit-

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

打开文件描述符进行读写

重定向运算符

[n]<>word

导致名称为 word 扩展的文件打开,以便在文件描述符 n 上进行读写操作,如果 n 则在文件描述符 0 上打开> 未指定。如果该文件不存在,则创建该文件。

别名

别名允许在用作简单命令的第一个单词时用字符串替换单词。 shell 维护一个别名列表,可以使用 alias 和 unalias 内置命令设置和取消设置(请参阅下面的SHELL BUILTIN COMMANDS)。每个简单命令的第一个单词(如果未加引号)将被检查以查看它是否有别名。如果是这样,该单词将被别名的文本替换。字符 /、$、` 和 = 以及任何 shell 元字符 或上面列出的引号字符可能不会出现在别名中。替换文本可以包含任何有效的 shell 输入,包括 shell 元字符。替换文本的第一个单词会进行别名测试,但与正在扩展的别名相同的单词不会再次扩展。这意味着可以将 ls 别名为 ls -F,例如,bash 不会尝试递归地扩展替换文本。如果别名值的最后一个字符是空白,则还会检查别名后面的下一个命令字是否有别名扩展。

别名是使用 alias 命令创建和列出的,并使用 unalias 命令删除。

没有在替换文本中使用参数的机制。如果需要参数,则应使用 shell 函数(请参阅下面的函数)。

当 shell 非交互式时,别名不会展开,除非使用 shopt 设置 expand_aliases shell 选项(请参阅 shopt 下的说明>外壳内置命令如下)。

有关别名的定义和使用的规则有些令人困惑。在执行该行或复合命令上的任何命令之前,Bash 始终读取至少一个完整的输入行以及构成复合命令的所有行。别名在读取命令时展开,而不是在执行命令时展开。因此,与另一个命令出现在同一行的别名定义在读取下一行输入之前不会生效。该行上别名定义后面的命令不受新别名的影响。执行函数时,此行为也是一个问题。别名在读取函数定义时展开,而不是在执行函数时展开,因为函数定义本身就是一个命令。因此,函数中定义的别名只有在执行该函数之后才可用。为了安全起见,请始终将别名定义放在单独的行上,并且不要在复合命令中使用别名。

对于几乎所有用途,别名都被 shell 函数取代。

功能

shell 函数的定义如上面 SHELL GRAMMAR 中所述,存储一系列命令以供以后执行。当 shell 函数的名称用作简单命令名称时,将执行与该函数名称关联的命令列表。函数在当前 shell 的上下文中执行;没有创建新进程来解释它们(与 shell 脚本的执行进行对比)。当执行函数时,函数的参数在其执行期间成为位置参数。特殊参数# 会更新以反映更改。特殊参数0不变。当函数执行时,FUNCNAME 变量的第一个元素设置为函数的名称。

函数及其调用者之间 shell 执行环境的所有其他方面都是相同的,但以下例外:DEBUG 和 RETURN 陷阱(请参阅陷阱< 内置在下面的 SHELL BUILTIN COMMANDS 下)不会被继承,除非该函数已被赋予 trace 属性(请参阅 declare 的描述)下面的内置函数)或 -o functrace shell 选项已通过 set 内置函数启用(在这种情况下,所有函数都会继承 DEBUG 和 >RETURN 陷阱),并且除非启用了 -o errtrace shell 选项,否则不会继承 ERR 陷阱。

函数的局部变量可以使用 local 内置命令来声明。通常,变量及其值在函数及其调用者之间共享。如果变量被声明为本地,则该变量的可见范围仅限于该函数及其子函数(包括它调用的函数)。局部变量“影子”变量与先前作用域中声明的同名变量。例如,在函数中声明的局部变量隐藏了同名的全局变量:引用和赋值引用局部变量,而全局变量保持不变。当函数返回时,全局变量再次可见。

shell 使用动态作用域来控制函数内变量的可见性。通过动态作用域,可见变量及其值是导致执行到达当前函数的函数调用序列的结果。函数看到的变量的值取决于其调用者(如果有)内的值,无论该调用者是“全局”作用域还是另一个 shell 函数。这也是局部变量声明“隐藏”的值,以及函数返回时恢复的值。

例如,如果变量 var 在函数 func1 中声明为局部变量,并且 func1 调用另一个函数 func2,从 func2 内部对 var 的引用将解析为 func1 中的局部变量 var,遮蔽任何名为的全局变量变量。

unset 内置函数也使用相同的动态作用域:如果变量是当前作用域的本地变量,unset 将取消设置它;否则,取消设置将引用在任何调用范围中找到的变量,如上所述。如果当前局部作用域的变量未设置,它将保持这种状态,直到在该作用域中重置该变量或直到函数返回。一旦函数返回,先前作用域中的变量的任何实例都将变得可见。如果取消设置作用于先前范围内的变量,则已隐藏的具有该名称的变量的任何实例都将变得可见。

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

如果在函数中执行内置命令return,则该函数将完成并在函数调用后继续执行下一个命令。与 RETURN 陷阱关联的任何命令都会在恢复执行之前执行。当函数完成时,位置参数和特殊参数#的值将恢复为函数执行之前的值。

函数名称和定义可以通过 declare 或 typeset 内置命令的 -f 选项列出。用于声明或排版的-F选项将仅列出函数名称(以及可选的源文件和行号,如果 extdebug shell 选项已启用)。可以导出函数,以便子 shell 自动使用 export 内置函数的 -f 选项定义它们。可以使用 unset 内置函数的 -f 选项来删除函数定义。

函数可以是递归的。 FUNCNEST 变量可用于限制函数调用堆栈的深度并限制函数调用的数量。默认情况下,不限制递归调用的次数。

算术评估

shell 允许在某些情况下计算算术表达式(请参阅 let 和 declare 内置命令、(( 复合命令和 算术扩展)。计算以固定宽度整数完成,不检查溢出,但除以 0 会被捕获并标记为错误。运算符及其优先级、结合性和值与在C语言中,下面的运算符列表被分组为等优先级运算符的级别,这些级别按照优先级递减的顺序列出。

id++ id--

变量后自增和后自减

- +

一元减号和加号

++id --id

变量预增和预减

! ~

逻辑和按位求反

**

求幂

* / %

乘法、除法、余数

+ -

加法、减法

<< >>

左移和右移

<= >= < >

比较

== !=

平等与不平等

&

按位与

^

按位异或

|

按位或

&&

逻辑与

||

逻辑或

expr?expr:expr

条件运算符

= *= /= %= += -= <<= >>= &= ^= |=

任务

expr1 , expr2

逗号

允许 Shell 变量作为操作数;参数扩展在计算表达式之前执行。在表达式中,shell 变量也可以通过名称引用,而不使用参数扩展语法。当通过名称引用而不使用参数扩展语法时,为 null 或未设置的 shell 变量的计算结果为 0。当引用变量时,或者为使用declare -i赋予整数属性的变量赋值时,变量的值将被计算为算术表达式。 null 值的计算结果为 0。shell 变量无需打开其整数属性即可在表达式中使用。

整型常量遵循C语言定义,没有后缀或字符常量。以 0 开头的常量被解释为八进制数。前导 0x 或 0X 表示十六进制。否则,数字采用 [base#]n 形式,其中可选的 base 是 2 到 64 之间的十进制数,表示算术基数,n 是该基数中的数字。如果省略 base#,则使用基数 10。指定n时,如果需要非数字,则大于9的数字按小写字母、大写字母、@和_的顺序表示。如果 base 小于或等于 36,则小写和大写字母可以互换使用来表示 10 到 35 之间的数字。

运算符按优先顺序进行计算。括号中的子表达式首先被求值,并且可能会覆盖上面的优先规则。

条件表达式

[[ 复合命令以及 test 和 [ 内置命令使用条件表达式来测试文件属性并执行字符串和算术比较。 test 和 [ 命令根据参数的数量确定它们的行为;有关任何其他特定于命令的操作,请参阅这些命令的描述。

表达式由以下一元或二元组成。 Bash 特别处理在表达式中使用的多个文件名。如果运行 bash 的操作系统提供了这些特殊文件,bash 将使用它们;否则它将通过以下行为在内部模拟它们:如果主参数之一的任何文件参数的形式为/dev/fd/n,则文件描述符 n 被检查。如果主参数之一的 file 参数是 /dev/stdin、/dev/stdout 或 /dev/ 之一stderr,分别检查文件描述符 0、1 或 2。

除非另有说明,否则对文件进行操作的主项将遵循符号链接并对链接的目标进行操作,而不是对链接本身进行操作。

当与 [[ 一起使用时,< 和 > 运算符使用当前区域设置按字典顺序排序。 test 命令使用 ASCII 顺序进行排序。

-a file

如果文件存在则为真。

-b file

如果文件存在并且是块特殊文件,则为真。

-c file

如果 file 存在并且是字符特殊文件,则为 True。

-d file

如果文件存在并且是目录,则为真。

-e file

如果文件存在则为真。

-f file

如果文件存在并且是常规文件,则为真。

-g file

如果文件存在并且设置了组ID,则为真。

-h file

如果文件存在并且是符号链接,则为真。

-k file

如果文件存在并且其“粘性”位被设置,则为真。

-p file

如果文件存在并且是命名管道(FIFO),则为真。

-r file

如果文件存在并且可读,则为真。

-s file

如果文件存在并且大小大于零,则为真。

-t fd

如果文件描述符 fd 打开并且引用终端,则为 True。

-u file

如果文件存在并且其set-user-id位被设置,则为真。

-w file

如果文件存在并且可写,则为真。

-x file

如果文件存在并且可执行,则为真。

-G file

如果文件存在并且由有效组ID拥有,则为真。

-L file

如果文件存在并且是符号链接,则为真。

-N file

如果文件存在并且自上次读取以来已被修改,则为真。

-O file

如果文件存在并且由有效用户 ID 拥有,则为 True。

-S file

如果文件存在并且是一个套接字,则为真。

file1 -ef file2

如果 file1 和 file2 引用相同的设备和索引节点号,则为 true。

file1 -nt file2

如果file1比file2更新(根据修改日期),或者file1存在而file2不存在,则为真。

file1 -ot file2

如果file1早于file2,或者file2存在而file1不存在,则为真。

-o optname

如果启用了 shell 选项optname,则为 True。请参阅下面内置 set 的 -o 选项说明下的选项列表。

-v varname

如果设置了 shell 变量 varname(已分配值),则为 True。

-R varname

如果 shell 变量 varname 已设置并且是名称引用,则为 True。

-z string

如果字符串的长度为零,则为真。

string
-n string

如果字符串的长度非零,则为真。

string1 == string2
string1 = string2

如果字符串相等则为 True。 = 应与 test 命令一起使用以实现 POSIX 一致性。当与 [[ 命令一起使用时,将执行如上所述的模式匹配(复合命令)。

string1 != string2

如果字符串不相等,则为 True。

string1 < string2

如果 string1 按字典顺序排序在 string2 之前,则为 True。

string1 > string2

如果 string1 按字典顺序排序在 string2 之后,则为 true。

arg1 OP arg2

OP 是 -eq、-ne、-lt、-le 之一、-gt 或 -ge。如果 arg1 等于、不等于、小于、小于或等于、大于或大于或等于 arg2,这些算术二元运算符返回 true,分别。 Arg1 和 arg2 可以是正整数或负整数。与 [[ 命令一起使用时,Arg1 和 Arg2 将作为算术表达式进行计算(请参阅上面的算术计算) 。

简单的命令扩展

当执行一个简单的命令时,shell 按照以下顺序从左到右执行以下扩展、赋值和重定向。

  1. 解析器标记为变量赋值的单词(命令名称前面的单词)和重定向将被保存以供以后处理。

  2. 不是变量赋值或重定向的单词会被扩展。如果扩展后仍有任何单词,则第一个单词将被视为命令名称,其余单词将被视为参数。

  3. 重定向按照上面重定向中的描述执行。

  1. 每个变量赋值中 = 之后的文本在赋值给变量之前都会经过波形符扩展、参数扩展、命令替换、算术扩展和引号删除。

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

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

如果扩展后留下命令名,则按如下所述继续执行。否则,命令退出。如果其中一个扩展包含命令替换,则该命令的退出状态是最后执行的命令替换的退出状态。如果没有命令替换,该命令将以零状态退出。

命令执行

将命令拆分为单词后,如果生成简单命令和可选参数列表,则将执行以下操作。

如果命令名称不包含斜杠,shell 会尝试查找它。如果存在具有该名称的 shell 函数,则会按照上面函数中的描述调用该函数。如果名称与函数不匹配,shell 会在 shell 内置函数列表中搜索它。如果找到匹配项,则调用该内置函数。

如果名称既不是 shell 函数也不是内置函数,并且不包含斜杠,则 bash 会搜索 PATH 的每个元素,以查找包含该名称的可执行文件的目录。 Bash 使用哈希表来记住可执行文件的完整路径名(请参阅下面SHELL BUILTIN COMMANDS 下的哈希)。仅当在哈希表中未找到该命令时,才会对 PATH 中的目录执行完整搜索。如果搜索不成功,shell 将搜索名为 command_not_found_handle 的已定义 shell 函数。如果该函数存在,则会在单独的执行环境中调用它,并使用原始命令和原始命令的参数作为其参数,并且该函数的退出状态将成为该子 shell 的退出状态。如果未定义该函数,shell 将打印一条错误消息并返回退出状态 127。

如果搜索成功,或者命令名称包含一个或多个斜杠,则 shell 会在单独的执行环境中执行指定的程序。参数 0 设置为给定的名称,命令的其余参数设置为给定的参数(如果有)。

如果由于文件不是可执行格式且文件不是目录而导致执行失败,则假定它是一个 shell 脚本,即包含 shell 命令的文件。生成一个子 shell 来执行它。该子 shell 重新初始化自身,因此效果就像调用了一个新 shell 来处理脚本一样,但父 shell 记住的命令位置除外(请参阅下面 下的 hash SHELL BUILTIN COMMANDS)由子进程保留。

如果程序是以#!开头的文件,则第一行的其余部分指定该程序的解释器。 shell 在本身不处理此可执行格式的操作系统上执行指定的解释器。解释器的参数由一个可选参数组成,后面是程序第一行的解释器名称,后面是程序名称,最后是命令参数(如果有)。

命令执行环境

shell有一个执行环境,它由以下部分组成:

  • 打开由 shell 在调用时继承的文件,通过提供给 exec 内置函数的重定向进行修改

  • 由 cd、pushd 或 popd 设置的当前工作目录,或在调用时由 shell 继承

  • 由 umask 设置或从 shell 的父级继承的文件创建模式掩码

  • trap 设置的当前陷阱

  • 通过变量赋值或使用 set 设置或从环境中的 shell 父级继承的 shell 参数

  • 在执行期间定义的 shell 函数或从环境中的 shell 父级继承的 shell 函数

  • 调用时启用的选项(默认情况下或使用命令行参数)或通过 set

  • shopt启用的选项

  • 使用 alias 定义的 shell 别名

  • 各种进程ID,包括后台作业的进程ID、$$的值和PPID的值。当要执行除内置函数或 shell 函数之外的简单命令时,将在由以下内容组成的单独执行环境中调用它。除非另有说明,这些值都是从 shell 继承的。

  • shell 的打开文件,以及通过重定向到命令指定的任何修改和添加

  • 当前工作目录

  • 文件创建模式掩码

  • 标记为导出的 shell 变量和函数,以及为命令导出的变量,在环境中传递

  • shell 捕获的陷阱将重置为从 shell 的父级继承的值,并且 shell 忽略的陷阱将被忽略

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

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

为执行命令替换而生成的子 shell 继承了父 shell 的 -e 选项的值。当不在 posix 模式下时,bash 会清除此类子 shell 中的 -e 选项。

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

环境

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

shell 提供了多种操作环境的方法。在调用时,shell 会扫描自己的环境,并为找到的每个名称创建一个参数,自动将其标记为导出到子进程。执行的命令继承环境。 export 和 declare -x 命令允许在环境中添加和删除参数和函数。如果环境中参数的值被修改,新值将成为环境的一部分,替换旧值。任何执行的命令继承的环境由 shell 的初始环境组成,其值可以在 shell 中修改,减去 unset 命令删除的任何对,加上通过 export 添加的任何内容strong> 和 声明 -x 命令。

任何简单命令或函数的环境都可以通过在其前面添加参数分配来临时增强,如上面参数中所述。这些赋值语句仅影响该命令所看到的环境。

如果设置了-k选项(请参阅下面的set内置命令),则所有参数分配都将放置在命令的环境中,不仅仅是命令名称之前的那些。

当bash调用外部命令时,变量_被设置为该命令的完整文件名并传递到该命令的环境中。

退出状态

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

对于 shell 而言,以零退出状态退出的命令已成功。退出状态为零表示成功。非零退出状态表示失败。当命令因致命信号 N 而终止时,bash 使用 128+N 的值作为退出状态。

如果未找到命令,则为执行该命令而创建的子进程将返回状态 127。如果找到命令但不可执行,则返回状态为 126。

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

如果成功,Shell 内置命令将返回状态 0 (true);如果执行时发生错误,则返回非零 (false)。所有内置函数都会返回退出状态 2 来指示不正确的使用、通常无效的选项或缺少参数。

Bash 本身返回最后执行的命令的退出状态,除非发生语法错误,在这种情况下它会以非零值退出。另请参阅下面的 exit 内置命令。

信号

当bash是交互式的,在没有任何陷阱的情况下,它会忽略SIGTERM(这样kill 0不会杀死交互式shell),并且SIGINT 被捕获并处理(以便 wait 内置函数是可中断的)。在所有情况下,bash都会忽略SIGQUIT。如果作业控制有效,bash 会忽略 SIGTTIN、SIGTTOU 和 SIGTSTP。

由 bash 运行的非内置命令将信号处理程序设置为 shell 从其父级继承的值。当作业控制无效时,除了这些继承的处理程序之外,异步命令还会忽略 SIGINT 和 SIGQUIT 。由于命令替换而运行的命令会忽略键盘生成的作业控制信号 SIGTTIN、SIGTTOU 和 SIGTSTP。

默认情况下,shell 在收到 SIGHUP 后退出。在退出之前,交互式 shell 会向所有正在运行或已停止的作业重新发送 SIGHUP。停止的作业将被发送 SIGCONT 以确保它们收到 SIGHUP。为了防止 shell 向特定作业发送信号,应该使用内置的 disown 将其从作业表中删除(请参阅下面的 SHELL BUILTIN COMMANDS)或将其标记为 not使用disown -h接收SIGHUP。

如果已使用 shopt 设置了 huponexit shell 选项,则在交互式登录时,bash 会向所有作业发送 SIGHUP外壳退出。

如果 bash 正在等待命令完成并收到已设置陷阱的信号,则在命令完成之前不会执行陷阱。当bash通过内置的wait等待异步命令时,接收到已设置陷阱的信号将导致wait内置命令立即返回,退出状态大于 128,然后立即执行陷阱。

作业控制

作业控制是指有选择地停止(挂起)进程的执行并在稍后继续(恢复)进程的能力。用户通常通过操作系统内核的终端驱动程序和 bash 联合提供的交互界面来使用此功能。

shell 将一个作业与每个管道关联起来。它保存当前正在执行的作业的表,可以使用 jobs 命令列出该表。当 bash 异步启动作业时(在后台),它会打印如下行:

[1] 25647

表示该作业的作业号为 1,并且与该作业关联的管道中最后一个进程的进程 ID 为 25647。单个管道中的所有进程都是同一作业的成员。 Bash 使用作业抽象作为作业控制的基础。

为了便于实现作业控制的用户界面,操作系统维护了当前终端进程组ID的概念。该进程组的成员(进程组 ID 等于当前终端进程组 ID 的进程)接收键盘生成的信号,例如 SIGINT。这些进程被认为位于前台。 后台进程是那些进程组ID与终端的进程组ID不同的进程;这些进程不受键盘生成的信号的影响。仅允许前台进程从终端读取数据,或者如果用户使用 stty tostop 指定,则向终端写入数据。尝试从终端读取(当 stty tostop 生效时写入)终端的后台进程会被内核的终端驱动程序发送一个 SIGTTIN (SIGTTOU) 信号,除非捕获,暂停进程。

如果运行 bash 的操作系统支持作业控制,则 bash 包含使用它的工具。在进程运行时键入挂起字符(通常为^Z、Control-Z)会导致该进程停止并将控制权返回给bash 。键入延迟暂停字符(通常是^Y,Control-Y)会导致进程在尝试从终端读取输入时停止,并将控制权返回到重击。然后,用户可以操纵该作业的状态,使用bg命令在后台继续它,使用fg命令在前台继续它,或者使用bg命令在后台继续它。 >kill 命令来杀死它。 ^Z 立即生效,并具有导致挂起的输出和 typeahead 被丢弃的额外副作用。

有多种方法可以在 shell 中引用作业。字符%引入了工作规范(jobspec)。作业编号n可以被称为%n。还可以使用用于启动作业的名称的前缀或使用出现在其命令行中的子字符串来引用作业。例如,%ce 指的是命令名称以 ce 开头的已停止作业。如果一个前缀与多个作业匹配,bash 会报告错误。另一方面,使用 %?ce 表示在其命令行中包含字符串 ce 的任何作业。如果子字符串匹配多个作业,bash 会报告错误。符号 %% 和 %+ 指的是 shell 的当前作业概念,它是最后一个在前台停止的作业或在后台启动。 之前的工作可以使用%-来引用。如果只有一个作业,%+ 和 %- 都可以用来指代该作业。在与作业相关的输出中(例如 jobs 命令的输出),当前作业始终用 + 标记,前一个作业用 - 标记。单个%(没有随附的工作规范)也指当前工作。

只需命名一个作业即可将其带入前台:%1 是 ``fg %1'' 的同义词,将作业 1 从后台带入前台前景。同样,``%1 &'' 在后台恢复作业 1,相当于 ``bg %1''。

每当作业改变状态时,shell 都会立即学习。通常,bash 会等到要打印提示时才报告作业状态的更改,以免中断任何其他输出。如果启用 set 内置命令的 -b 选项,bash 会立即报告此类更改。对于每个退出的子进程,都会执行 SIGCHLD 上的任何陷阱。

如果在作业停止时尝试退出bash(或者,如果已使用内置shopt启用了checkjobs shell选项,则运行),shell 会打印一条警告消息,并且如果启用了 checkjobs 选项,则会列出作业及其状态。然后可以使用jobs命令来检查它们的状态。如果在没有干预命令的情况下第二次尝试退出,shell 不会打印另一个警告,并且任何停止的作业都会终止。

当 shell 使用 wait 内置函数等待作业或进程,并且启用了作业控制时,wait 将在作业更改状态时返回。 -f 选项使 wait 等待作业或进程终止后再返回。

提示

以交互方式执行时,bash 在准备好读取命令时显示主提示符 PS1,在需要更多输入时显示辅助提示符 PS2来完成一个命令。 Bash 在读取命令之后但在执行之前显示 PS0。当启用 -x 选项时,Bash 在跟踪每个命令之前如上所述显示 PS4。 Bash 允许通过插入一些反斜杠转义的特殊字符来自定义这些提示字符串,这些字符的解码如下:

\a

ASCII 响铃字符 (07)

\d

“工作日月日”格式的日期(例如“5 月 26 日星期二”)

\D{format}

格式被传递给strftime(3),结果被插入到提示字符串中;空的格式会产生特定于区域设置的时间表示。大括号是必需的

\e

ASCII 转义字符 (033)

\h

主机名到第一个“.”

\H

主机名

\j

当前由 shell 管理的作业数量

\l

shell 终端设备名称的基本名称

\n

新队

\r

回车

\s

shell 的名称,$0 的基本名称(最后一个斜杠后面的部分)

\t

24 小时制 HH:MM:SS 格式的当前时间

\T

12 小时制 HH:MM:SS 格式的当前时间

\@

当前时间(12 小时 am/pm 格式)

\A

24 小时制 HH:MM 格式的当前时间

\u

当前用户的用户名

\v

bash 的版本(例如 2.00)

\V

bash 的发布,版本 + 补丁级别(例如 2.00.0)

\w

当前工作目录,$HOME 用波形符缩写(使用 PROMPT_DIRTRIM 变量的值)

\W

当前工作目录的基本名称,$HOME 用波形符缩写

\!

该命令的历史编号

\#

该命令的命令编号

\$

如果有效 UID 为 0,则为 #,否则为 $

\nnn

八进制数 nnn 对应的字符

\\

反斜杠

\[

开始一系列非打印字符,可用于将终端控制序列嵌入到提示中

\]

结束非打印字符序列

命令编号和历史编号通常是不同的:命令的历史编号是它在历史列表中的位置,其中可能包括从历史文件恢复的命令(参见下面的HISTORY),而命令number 是当前 shell 会话期间执行的命令序列中的位置。字符串解码后,会通过参数扩展、命令替换、算术扩展和引号删除等方式进行扩展,具体取决于 promptvars shell 选项的值(请参阅 shopt< 命令位于下面的 SHELL BUILTIN COMMANDS 下)。如果字符串的转义部分出现在命令替换中或包含单词扩展的特殊字符,这可能会产生不需要的副作用。

阅读线

这是使用交互式 shell 时处理读取输入的库,除非在 shell 调用时给出 --noediting 选项。当使用 read 内置选项的 -e 选项时,也会使用行编辑。默认情况下,行编辑命令与 Emacs 类似。还提供 vi 风格的行编辑界面。可以随时使用 set 内置选项的 -o emacs 或 -o vi 选项启用行编辑(请参阅SHELL BUILTIN命令如下)。要在 shell 运行后关闭行编辑,请使用 set 内置选项的 +o emacs 或 +o vi 选项。

读行符号

在本节中,Emacs 风格的符号用于表示击键。控制键用 C-key 表示,例如,C-n 表示 Control-N。同样,meta 键用 M-key 表示,因此 M-x 表示 Meta-X。 (在没有 meta 键的键盘上,M-x 表示 ESC x,即按 Escape 键,然后按 x 键。这使得 ESC 成为元前缀。组合 M-C-x 表示 ESC-Control-x,或者按 Escape 键,然后按住 Control 键的同时按 x 键。)

Readline 命令可能会被赋予数字参数,这些参数通常充当重复计数。然而,有时,争论的符号才是重要的。将负参数传递给向前执行的命令(例如,kill-line)会导致该命令向后执行。下面列出了其参数行为与此不同的命令。

当命令被描述为删除文本时,删除的文本将被保存以供将来检索(猛拉)。删除的文本保存在删除环中。连续击杀会使文本累积成一个单元,可以一次性将其全部拉出。不终止文本的命令会分隔终止环上的文本块。

读行初始化

Readline 是通过将命令放入初始化文件(inputrc 文件)中来自定义的。该文件的名称取自INPUTRC 变量的值。如果未设置该变量,则默认值为 ~/.inputrc。如果该文件不存在或无法读取,则最终默认为/etc/inputrc。当使用 readline 库的程序启动时,会读取初始化文件,并设置键绑定和变量。 readline 初始化文件中只允许使用一些基本结构。空行将被忽略。以# 开头的行是注释。以$ 开头的行表示条件结构。其他行表示键绑定和变量设置。

默认的键绑定可以通过 inputrc 文件进行更改。使用此库的其他程序可能会添加自己的命令和绑定。

例如,放置

M-Control-u: universal-argument

或者

C-Meta-u: universal-argument

进入inputrc将使M-C-u执行readline命令universal-argument。

可以识别以下符号字符名称:RUBOUT、DEL、ESC、LFD、NEWLINE、RET、RETURN、SPC、SPACE 和 TAB。

除了命令名称之外,readline 还允许将键绑定到按下键时插入的字符串(宏)。

Readline 按键绑定

inputrc 文件中控制键绑定的语法很简单。所需要的只是命令的名称或宏的文本以及它应绑定到的键序列。该名称可以通过以下两种方式之一指定:作为符号键名称,可能带有 Meta- 或 Control- 前缀,或者作为键序列。

当使用键名: 函数名或宏形式时,键名是拼写为以下内容的键的名称英语。例如:

Control-u: universal-argument
Meta-Rubout: backward-kill-word
Control-o: "> output"

在上面的例子中,C-u绑定到函数universal-argument,M-DEL绑定到函数backward-kill -word,并且 C-o 必然会运行右侧表达的宏(即,将文本“>输出”插入到该行中)。

在第二种形式中,“keyseq”: 函数名称或宏,keyseq与keyname不同 如上所述,表示整个按键序列的字符串可以通过将序列放在双引号内来指定。可以使用一些 GNU Emacs 风格的键转义,如下例所示,但无法识别符号字符名称。

"\C-u": universal-argument
"\C-x\C-r": re-read-init-file
"\e[11~": "Function Key 1"

在此示例中,C-u 再次绑定到函数 universal-argument。 C-x C-r 绑定到函数 re-read-init-file,ESC [ 1 1 ~ 绑定到插入文本 ``功能键 1''。

全套 GNU Emacs 风格的转义序列是

\C-

控制前缀

\M-

元前缀

\e

转义字符

\\

反斜杠

\"

字面意思“

\'

字面意思 '

除了 GNU Emacs 风格的转义序列之外,还可以使用第二组反斜杠转义:

\a

警报(响铃)

\b

退格键

\d

删除

\f

换页

\n

新队

\r

回车

\t

水平制表符

\v

垂直制表符

\nnn

八位字符,其值为八进制值 nnn(一到三位数字)

\xHH

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

输入宏文本时,必须使用单引号或双引号来指示宏定义。不带引号的文本被假定为函数名称。在宏体中,上述反斜杠转义被扩展。反斜杠将引用宏文本中的任何其他字符,包括“和'。

Bash 允许使用 bind 内置命令显示或修改当前的 readline 键绑定。在交互使用期间,可以通过使用内置命令的-o选项来切换编辑模式(请参阅下面的SHELL BUILTIN COMMANDS)。

读取行变量

Readline 具有可用于进一步自定义其行为的变量。可以使用以下形式的语句在 inputrc 文件中设置变量

set variable-name value

或使用bind内置命令(请参阅下面的SHELL BUILTIN COMMANDS)。

除非另有说明,readline 变量可以采用值On 或Off(不考虑大小写)。无法识别的变量名称将被忽略。当读取变量值时,空值或 null 值、“on”(不区分大小写)和“1”相当于On。所有其他值等同于关闭。变量及其默认值是:

bell-style (audible)

控制当 readline 想要敲响终端铃声时会发生什么。如果设置为none,readline 永远不会响铃。如果设置为可见,readline 将使用可见的响铃(如果可用)。如果设置为声音,readline 会尝试敲响终端的铃声。

bind-tty-special-chars (On)

如果设置为开,readline 会尝试将内核终端驱动程序专门处理的控制字符绑定到其 readline 等效项。

blink-matching-paren (Off)

如果设置为打开,则在插入右括号时,readline 会尝试将光标短暂移动到左括号。

colored-completion-prefix (Off)

如果设置为开,则在列出完成时,readline 使用不同的颜色显示可能的完成集的公共前缀。颜色定义取自LS_COLORS环境变量的值。

colored-stats (Off)

如果设置为开,readline 使用不同的颜色显示可能的完成,以指示其文件类型。颜色定义取自LS_COLORS环境变量的值。

comment-begin (``#'')

执行 readline insert-comment 命令时插入的字符串。该命令在 emacs 模式下绑定到 M-#,在 vi 命令模式下绑定到 #。

completion-display-width (-1)

执行完成时用于显示可能匹配的屏幕列数。如果该值小于 0 或大于终端屏幕宽度,则该值将被忽略。值为 0 将导致每行显示一个匹配项。默认值为-1。

completion-ignore-case (Off)

如果设置为开,readline 会以不区分大小写的方式执行文件名匹配和完成。

completion-map-case (Off)

如果设置为开启,并且启用completion-ignore-case,则 readline 会处理连字符 (-) 和下划线 (_) 在执行不区分大小写的文件名匹配和完成时等效。

completion-prefix-display-length (0)

未经修改显示的可能完成列表的公共前缀的字符长度。当设置为大于零的值时,在显示可能的补全时,长于该值的公共前缀将被替换为省略号。

completion-query-items (100)

这确定何时询问用户查看由possible-completions命令生成的可能完成的数量。它可以设置为任何大于或等于零的整数值。如果可能的完成次数大于或等于该变量的值,readline 将询问用户是否希望查看它们;否则它们只会列在终端上。

convert-meta (On)

如果设置为开,readline 将通过剥离第八位并添加转义字符前缀(实际上,使用转义作为元前缀将第八位设置为 ASCII 键序列的字符转换为 ASCII 键序列。)。默认值为开启,但如果语言环境包含八位字符,readline 会将其设置为关闭。

disable-completion (Off)

如果设置为开,readline 将禁止单词补全。完成字符将被插入到行中,就像它们已映射到自插入一样。

echo-control-characters (On)

当设置为开时,在表明支持它的操作系统上,readline 会回显与键盘生成的信号相对应的字符。

editing-mode (emacs)

控制 readline 是否以类似于 Emacs 或 vi 的一组键绑定开头。 编辑模式可以设置为emacs或vi。

emacs-mode-string (@)

如果启用了 show-mode-in-prompt 变量,则当 emacs 编辑模式处于活动状态时,该字符串将立即显示在主提示符的最后一行之前。该值像键绑定一样扩展,因此可以使用标准的元和控制前缀以及反斜杠转义序列集。使用 \1 和 \2 转义符来开始和结束非打印字符序列,可用于将终端控制序列嵌入到模式字符串中。

enable-bracketed-paste (On)

当设置为开时,readline将以某种方式配置终端,使其能够将每个粘贴作为单个字符串插入到编辑缓冲区中,而不是将每个字符视为已被读取从键盘。这可以防止粘贴的字符被解释为编辑命令。

enable-keypad (Off)

当设置为开时,readline 将在调用时尝试启用应用程序键盘。有些系统需要它来启用箭头键。

enable-meta-key (On)

当设置为开时,readline 将尝试启用终端在调用时声称支持的任何元修饰键。在许多终端上,元密钥用于发送八位字符。

expand-tilde (Off)

如果设置为开,则当 readline 尝试完成单词时会执行波浪号扩展。

history-preserve-point (Off)

如果设置为开,历史记录代码会尝试将点放置在使用上一个历史记录或下一个历史记录检索的每条历史记录行上的相同位置。

history-size (unset)

设置历史记录列表中保存的最大历史记录条数。如果设置为零,则任何现有历史记录条目都将被删除,并且不会保存新条目。如果设置为小于零的值,则历史条目的数量不受限制。默认情况下,历史条目数设置为 HISTSIZE shell 变量的值。如果尝试将 history-size 设置为非数字值,则历史记录条目的最大数量将设置为 500。

horizontal-scroll-mode (Off)

当设置为开时,使 readline 使用单行进行显示,当输入变得比屏幕宽度长时,在单屏幕行上水平滚动输入,而不是换行到新行。对于高度为 1 的终端,此设置会自动启用。

input-meta (Off)

如果设置为开,readline 将启用八位输入(即,它不会从读取的字符中去除第八位),无论终端声称它可以支持什么。名称meta-flag是该变量的同义词。默认值为关闭,但如果区域设置包含八位字符,readline 会将其设置为打开。

isearch-terminators (``C-[C-J'')

应终止增量搜索而不随后将该字符作为命令执行的字符串。如果未给该变量赋值,则字符 ESC 和 C-J 将终止增量搜索。

keymap (emacs)

设置当前的 readline 键盘映射。有效的键盘映射名称集是emacs、emacs-standard、emacs-meta、emacs-ctlx、vi、 vi-command 和vi-insert。 vi 相当于 vi-command; emacs 相当于 emacs-standard。默认值为emacs; editing-mode 的值也会影响默认键盘映射。

keyseq-timeout (500)

指定 readline 在读取不明确的按键序列时等待字符的持续时间(可以使用到目前为止读取的输入形成完整的按键序列,或者可以采用额外的输入来完成更长的按键序列) 。如果在超时时间内没有收到输入,readline 将使用较短但完整的按键序列。该值以毫秒为单位指定,因此值 1000 意味着 readline 将等待一秒钟以获取其他输入。如果此变量设置为小于或等于零的值,或者设置为非数字值,readline 将等待,直到按下另一个键来决定要完成哪个键序列。

mark-directories (On)

如果设置为开,完整的目录名称会附加斜杠。

mark-modified-lines (Off)

如果设置为开,则已修改的历史记录行会在前面显示星号 (*)。

mark-symlinked-directories (Off)

如果设置为开,则作为目录符号链接的完整名称会附加斜杠(取决于mark-directories 的值)。

match-hidden-files (On)

当此变量设置为On时,会导致 readline 匹配名称以“.”开头的文件。 (隐藏文件)执行文件名补全时。如果设置为关闭,则前导“.”必须由用户在要完成的文件名中提供。

menu-complete-display-prefix (Off)

如果设置为开,菜单完成功能会在循环浏览列表之前显示可能的完成功能列表的公共前缀(可能为空)。

output-meta (Off)

如果设置为开,readline 将直接显示第八位设置的字符,而不是作为元前缀转义序列。默认值为关闭,但如果区域设置包含八位字符,readline 会将其设置为打开。

page-completions (On)

如果设置为开启,readline 使用内部more 类似的寻呼机一次显示一屏可能的完成情况。

print-completions-horizontally (Off)

如果设置为开,readline 将显示按字母顺序水平排序的匹配项的补全内容,而不是沿屏幕向下排序。

revert-all-at-newline (Off)

如果设置为On,则在执行accept-line时,readline将在返回之前撤消对历史行的所有更改。默认情况下,历史记录行可以被修改,并在调用 readline 时保留单独的撤消列表。

show-all-if-ambiguous (Off)

这会改变完成函数的默认行为。如果设置为开启,则具有多个可能完成的单词会导致立即列出匹配项,而不是敲响铃声。

show-all-if-unmodified (Off)

这会以类似于 show-all-if-ambiguously 的方式改变完成函数的默认行为。如果设置为开启,则具有多个可能完成但没有任何可能的部分完成(可能的完成不共享公共前缀)的单词会导致立即列出匹配项,而不是敲响铃声。

show-mode-in-prompt (Off)

如果设置为开,则在提示开头添加一个字符串,指示编辑模式:emacs、vi 命令或 vi 插入。模式字符串是用户可设置的(例如,emacs-mode-string)。

skip-completed-text (Off)

如果设置为开,这会改变在行中插入单个匹配项时的默认完成行为。它仅在单词中间执行补全时才有效。如果启用,readline 不会从完成中插入与正在完成的单词中的点之后的字符相匹配的字符,因此光标后面的单词部分不会重复。

vi-cmd-mode-string ((cmd))

如果启用了 show-mode-in-prompt 变量,则当 vi 编辑模式处于活动状态并且处于命令模式时,该字符串将立即显示在主提示符的最后一行之前。该值像键绑定一样扩展,因此可以使用标准的元和控制前缀以及反斜杠转义序列集。使用 \1 和 \2 转义符来开始和结束非打印字符序列,可用于将终端控制序列嵌入到模式字符串中。

vi-ins-mode-string ((ins))

如果启用了 show-mode-in-prompt 变量,则当 vi 编辑模式处于活动状态且处于插入模式时,该字符串将立即显示在主提示的最后一行之前。该值像键绑定一样扩展,因此可以使用标准的元和控制前缀以及反斜杠转义序列集。使用 \1 和 \2 转义符来开始和结束非打印字符序列,可用于将终端控制序列嵌入到模式字符串中。

visible-stats (Off)

如果设置为开,则在列出可能的完成时,将在文件名中附加一个由 stat(2) 报告的表示文件类型的字符。

Readline 条件结构

Readline 实现了一种与 C 预处理器的条件编译功能类似的功能,它允许根据测试结果执行键绑定和变量设置。使用了四个解析器指令。

$if

$if 构造允许根据编辑模式、所使用的终端或使用 readline 的应用程序进行绑定。测试文本在任何比较运算符之后都会延伸到行尾;除非另有说明,不需要任何字符来隔离它。

mode

$if指令的mode=形式用于测试readline是否处于emacs或vi模式。这可以与 set keymap 命令结合使用,例如,仅在 emacs-standard 和 emacs-ctlx 键盘映射中设置绑定如果 readline 在 emacs 模式下启动。

term

term= 形式可用于包含特定于终端的键绑定,也许可以绑定终端功能键输出的键序列。 = 右侧的单词会根据终端的全名以及第一个 - 之前的终端名称部分进行测试。例如,这允许 sun 匹配 sun 和 sun-cmd。

version

版本测试可用于执行与特定阅读行版本的比较。 版本扩展到当前的阅读行版本。比较运算符集包括=、(和==)、!=、<=、 >>=、< 和 >。运算符右侧提供的版本号由主版本号、可选的小数点和可选的次版本号(例如,7.1)组成。如果省略次要版本,则假定为0。运算符可以通过空格与字符串 version 和版本号参数分隔开。

application

application 构造用于包含特定于应用程序的设置。使用 readline 库的每个程序都会设置应用程序名称,并且初始化文件可以测试特定值。这可用于将按键序列绑定到对特定程序有用的函数。例如,以下命令添加一个键序列来引用 bash 中的当前或上一个单词:

$if Bash
# Quote the current or previous word
"\C-xq": "\eb\"\ef\""
$endif
variable

variable 构造为 readline 变量和值提供简单的相等测试。允许的比较运算符有 =、== 和 !=。变量名与比较运算符之间必须用空格分隔;运算符可以通过空格与右侧的值分隔开。字符串和布尔变量都可以被测试。布尔变量必须针对 on 和 off 值进行测试。

$endif

如上例所示,此命令终止 $if 命令。

$else

如果测试失败,则执行 $if 指令此分支中的命令。

$include

该指令采用单个文件名作为参数,并从该文件读取命令和绑定。例如,以下指令将读取 /etc/inputrc:

$include   /etc/inputrc

搜寻中

Readline 提供了用于在命令历史记录(请参阅下面的HISTORY)中搜索包含指定字符串的行的命令。有两种搜索模式:增量和非增量。

增量搜索在用户输入完搜索字符串之前开始。当输入搜索字符串的每个字符时,readline 会显示历史记录中与目前输入的字符串相匹配的下一个条目。增量搜索仅需要查找所需历史记录条目所需的字符数。 isearch-terminators 变量值中存在的字符用于终止增量搜索。如果该变量尚未分配值,则 Escape 和 Control-J 字符将终止增量搜索。 Control-G 将中止增量搜索并恢复原始行。当搜索终止时,包含搜索字符串的历史记录条目将成为当前行。

要在历史列表中查找其他匹配条目,请根据需要键入 Control-S 或 Control-R。这将在历史记录中向后或向前搜索与迄今为止键入的搜索字符串相匹配的下一个条目。绑定到 readline 命令的任何其他键序列都将终止搜索并执行该命令。例如,换行将终止搜索并接受该行,从而执行历史列表中的命令。

Readline 会记住最后一个增量搜索字符串。如果键入两个 Control-R 且没有任何中间字符定义新的搜索字符串,则使用任何记住的搜索字符串。

非增量搜索在开始搜索匹配的历史行之前读取整个搜索字符串。搜索字符串可以由用户键入或者是当前行内容的一部分。

Readline 命令名称

以下是命令名称及其绑定的默认键序列的列表。默认情况下,没有附带键序列的命令名称是未绑定的。在下面的描述中,point指的是当前光标位置,mark指的是set-mark命令保存的光标位置。点和标记之间的文本称为区域。

移动命令

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 元字符分隔。

previous-screen-line

尝试将点移动到上一个物理屏幕行上的同一物理屏幕列。如果当前 Readline 行不占用多于一根物理行,或者如果 point 不大于提示长度加上屏幕宽度,则这不会产生预期效果。

next-screen-line

尝试将点移动到下一个物理屏幕行上的同一物理屏幕列。如果当前 Readline 行不占用多于一行的物理行,或者当前 Readline 行的长度不大于提示长度加上屏幕宽度,则不会达到预期效果。

clear-display (M-C-l)

清除屏幕,如果可能的话,清除终端的回滚缓冲区,然后重绘当前行,将当前行保留在屏幕顶部。

clear-screen (C-l)

清空屏幕,然后重新绘制当前行,将当前行保留在屏幕顶部。使用参数时,刷新当前行而不清除屏幕。

redraw-current-line

刷新当前行。

操纵历史的命令

accept-line (Newline, Return)

无论光标在哪里,都接受该行。如果该行非空,则根据HISTCONTROL变量的状态将其添加到历史列表中。如果该行是修改的历史行,则将历史行恢复到其原始状态。

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-substring-search-backward

在历史记录中向后搜索当前行开头和当前光标位置(点)之间的字符串。搜索字符串可以匹配历史行中的任何位置。这是非增量搜索。

history-substring-search-forward

在历史记录中向前搜索当前行开头和该点之间的字符串。搜索字符串可以匹配历史行中的任何位置。这是非增量搜索。

yank-nth-arg (M-C-y)

将第一个参数插入到上一个命令(通常是上一行的第二个单词)的 point 处。使用参数 n,插入上一个命令中的第 n 个单词(上一个命令中的单词以单词 0 开头)。负参数会插入上一个命令末尾的第 n 个单词。一旦计算出参数 n,就会提取该参数,就像指定了“!n”历史扩展一样。

yank-last-arg (M-. , M-_ )

将最后一个参数插入到上一个命令中(上一个历史记录条目的最后一个单词)。对于数字参数,其行为与 yank-nth-arg 完全相同。对 yank-last-arg 的连续调用将在历史列表中向后移动,依次插入每行的最后一个单词(或第一次调用的参数指定的单词)。提供给这些连续调用的任何数字参数都决定了历史记录的移动方向。否定参数会切换历史的方向(向后或向前)。历史扩展工具用于提取最后一个单词,就像指定了“!$”历史扩展一样。

shell-expand-line (M-C-e)

像 shell 一样展开该行。这将执行别名和历史扩展以及所有 shell 字扩展。有关历史扩展的说明,请参阅下面的历史扩展。

history-expand-line (M-^)

在当前行执行历史扩展。有关历史扩展的说明,请参阅下面的历史扩展。

magic-space

对当前行进行历史扩展并插入一个空格。有关历史扩展的说明,请参阅下面的历史扩展。

alias-expand-line

在当前行上执行别名扩展。有关别名扩展的说明,请参阅上面的ALIASES。

history-and-alias-expand-line

在当前行上执行历史记录和别名扩展。

insert-last-argument (M-. , M-_ )

yank-last-arg 的同义词。

operate-and-get-next (C-o)

接受当前行来执行,并从历史记录中获取相对于当前行的下一行进行编辑。数字参数(如果提供)指定要使用的历史记录条目,而不是当前行。

edit-and-execute-command (C-x C-e)

在当前命令行上调用编辑器,并将结果作为 shell 命令执行。 Bash 尝试按顺序调用 $VISUAL、$EDITOR 和 emacs 作为编辑器。

更改文本的命令

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, C-v)

将键入的下一个字符逐字添加到该行。例如,这是插入 C-q 等字符的方法。

tab-insert (C-v TAB)

插入制表符。

self-insert (a, b, A, 1, !, ...)

插入键入的字符。

transpose-chars (C-t)

将点之前的字符向前拖动到点处的字符上,同时将点向前移动。如果 point 位于行尾,则转置 point 之前的两个字符。否定参数没有效果。

transpose-words (M-t)

将点之前的单词拖过点之后的单词,同时将点移动到该单词上。如果点位于行的末尾,则会调换行上的最后两个单词。

upcase-word (M-u)

当前(或后续)单词大写。对于否定参数,将前一个单词大写,但不移动点。

downcase-word (M-l)

将当前(或后续)单词小写。对于否定参数,将前一个单词小写,但不移动点。

capitalize-word (M-c)

将当前(或后续)单词大写。对于否定参数,将前一个单词大写,但不要移动点。

overwrite-mode

切换覆盖模式。使用显式正数字参数,切换到覆盖模式。使用显式非正数字参数,切换到插入模式。该命令仅影响emacs模式; vi 模式的覆盖方式有所不同。每次调用 readline() 都会以插入模式开始。在覆盖模式下,绑定到自插入的字符会替换该位置的文本,而不是将文本推到右侧。绑定到 backward-delete-char 的字符将点之前的字符替换为空格。缺省情况下,该命令未绑定。

杀戮和掠夺

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-Rubout)

杀掉点后面的字。单词边界与 backward-word 使用的边界相同。

shell-kill-word

杀死从点到当前单词的末尾,或者如果在单词之间,则杀死到下一个单词的末尾。单词边界与 shell-forward-word 使用的边界相同。

shell-backward-kill-word

杀掉点后面的字。字边界与 shell-backward-word 使用的边界相同。

unix-word-rubout (C-w)

删除 point 后面的单词,使用空格作为单词边界。被删除的文本保存在删除环上。

unix-filename-rubout

使用空格和斜杠字符作为单词边界,删除 point 后面的单词。被删除的文本保存在删除环上。

delete-horizontal-space (M-\)

删除点周围的所有空格和制表符。

kill-region

杀死当前区域中的文本。

copy-region-as-kill

将区域中的文本复制到终止缓冲区。

copy-backward-word

复制指向终止缓冲区之前的单词。单词边界与backward-word相同。

copy-forward-word

将 point 后面的单词复制到终止缓冲区。单词边界与forward-word相同。

yank (C-y)

将杀伤环的顶部拉入缓冲区中的点。

yank-pop (M-y)

旋转杀环,然后拉动新顶部。仅适用于 yank 或 yank-pop。

数字参数

digit-argument (M-0, M-1, ..., M--)

将此数字添加到已经累积的参数中,或开始一个新参数。 M--开始一个否定的论证。

universal-argument

这是指定参数的另一种方式。如果此命令后跟一位或多位数字(可选地带有前导减号),则这些数字定义参数。如果命令后跟数字,则再次执行 universal-argument 会结束数字参数,但会被忽略。作为一种特殊情况,如果该命令后紧跟着一个既不是数字也不是减号的字符,则下一个命令的参数计数将乘以四。参数计数最初为 1,因此第一次执行此函数会使参数计数为 4,第二次执行会使参数计数为 16,依此类推。

正在完成

complete (TAB)

尝试对点之前的文本执行补全。 Bash 尝试完成将文本视为变量(如果文本以 $ 开头)、用户名(如果文本以 ~ 开头)、主机名(如果文本以@开头),或依次命令(包括别名和函数)。如果这些都没有产生匹配,则尝试完成文件名。

possible-completions (M-?)

列出点之前文本的可能完成情况。

insert-completions (M-*)

在由可能的补全生成的点之前插入文本的所有补全。

menu-complete

与完整类似,但将要完成的单词替换为可能完成列表中的单个匹配项。重复执行菜单完成步骤遍历可能的完成列表,依次插入每个匹配项。完成列表末尾,响铃(以响铃式设置为准),恢复原文。 n 参数在匹配列表中向前移动 n 个位置;可以使用负参数在列表中向后移动。该命令旨在绑定到TAB,但默认情况下是未绑定的。

menu-complete-backward

与 menu-complete 相同,但向后移动可能的完成列表,就好像 menu-complete 被给予了否定参数。该命令默认未绑定。

delete-char-or-list

如果光标所在的字符不在行首或行尾,则删除该字符(如 delete-char)。如果位于行尾,则行为与可能的完成相同。该命令默认未绑定。

complete-filename (M-/)

尝试在点之前的文本上完成文件名。

possible-filename-completions (C-x /)

列出 point 之前文本的可能补全,将其视为文件名。

complete-username (M-~)

尝试完成点之前的文本,将其视为用户名。

possible-username-completions (C-x ~)

列出 point 之前文本的可能补全,将其视为用户名。

complete-variable (M-$)

尝试完成 point 之前的文本,将其视为 shell 变量。

possible-variable-completions (C-x $)

列出 point 之前文本的可能补全,将其视为 shell 变量。

complete-hostname (M-@)

尝试完成点之前的文本,将其视为主机名。

possible-hostname-completions (C-x @)

列出 point 之前文本的可能补全,将其视为主机名。

complete-command (M-!)

尝试完成点之前的文本,将其视为命令名称。命令完成尝试将文本与别名、保留字、shell 函数、shell 内置命令以及最终的可执行文件名按顺序进行匹配。

possible-command-completions (C-x !)

列出 point 之前文本的可能补全,将其视为命令名称。

dynamic-complete-history (M-TAB)

尝试完成点之前的文本,将文本与历史列表中的行进行比较,以查找可能的完成匹配。

dabbrev-expand

尝试对点之前的文本进行菜单补全,将文本与历史列表中的行进行比较,以查找可能的补全匹配。

complete-into-braces (M-{)

执行文件名补全并插入用大括号括起来的可能补全列表,以便 shell 可以使用该列表(请参阅上面的大括号扩展)。

键盘宏

start-kbd-macro (C-x ( )

开始保存输入到当前键盘宏中的字符。

end-kbd-macro (C-x ) )

停止保存输入到当前键盘宏中的字符并存储定义。

call-last-kbd-macro (C-x e)

重新执行最后定义的键盘宏,使宏中的字符看起来就像在键盘上键入的一样。

print-last-kbd-macro ()

打印以适合 inputrc 文件的格式定义的最后一个键盘宏。

各种各样的

re-read-init-file (C-x C-r)

读取 inputrc 文件的内容,并合并其中找到的任何绑定或变量赋值。

abort (C-g)

中止当前编辑命令并敲响终端铃声(以铃声风格设置为准)。

do-lowercase-version (M-A, M-B, M-x, ...)

如果元化字符x为大写,则运行与相应元化小写字符绑定的命令。如果 x 已经是小写,则行为未定义。

prefix-meta (ESC)

Metafy 键入的下一个字符。

ESC f 相当于Meta-f。

undo (C-_, C-x C-u)

增量撤消,每行单独记住。

revert-line (M-r)

撤消对此行所做的所有更改。这就像执行撤消命令足够多次以使行返回到其初始状态。

tilde-expand (M-&)

对当前单词执行波形符扩展。

set-mark (C-@, M-<space>)

将标记设置到点上。如果提供了数字参数,则标记将设置到该位置。

exchange-point-and-mark (C-x C-x)

将点与标记交换。当前光标位置设置为保存位置,旧光标位置保存为标记。

character-search (C-])

读取一个字符并将点移动到该字符的下一个出现位置。负计数会搜索之前出现的情况。

character-search-backward (M-C-])

读取一个字符并将点移动到该字符的上一个出现位置。负计数搜索后续出现的情况。

skip-csi-sequence

读取足够的字符来使用多键序列,例如为 Home 和 End 等键定义的字符。此类序列以控制序列指示符 (CSI) 开始,通常为 ESC-[。如果此序列绑定到“\[”,则生成此类序列的键将不起作用,除非显式绑定到 readline 命令,而不是将杂散字符插入编辑缓冲区。默认情况下这是未绑定的,但通常绑定到 ESC-[。

insert-comment (M-#)

如果没有数字参数,则 readline comment-begin 变量的值将插入到当前行的开头。如果提供了数字参数,则此命令充当切换:如果行开头的字符与 comment-begin 的值不匹配,则插入该值,否则插入 comment-begin 从行首删除。无论哪种情况,该行都会被接受,就像键入了换行符一样。 comment-begin 的默认值导致此命令将当前行设为 shell 注释。如果数字参数导致注释字符被删除,则该行将由 shell 执行。

glob-complete-word (M-g)

point 之前的单词被视为路径名扩展的模式,并隐式附加一个星号。此模式用于生成可能完成的匹配文件名列表。

glob-expand-word (C-x *)

point 之前的单词被视为路径名扩展的模式,并且插入匹配文件名的列表,替换该单词。如果提供数字参数,则在路径名扩展之前附加一个星号。

glob-list-expansions (C-x g)

显示由 glob-expand-word 生成的扩展列表,并重新绘制线条。如果提供数字参数,则在路径名扩展之前附加一个星号。

dump-functions

将所有函数及其键绑定打印到 readline 输出流。如果提供了数字参数,则输出的格式将使其成为 inputrc 文件的一部分。

dump-variables

将所有可设置的 readline 变量及其值打印到 readline 输出流。如果提供了数字参数,则输出的格式将使其成为 inputrc 文件的一部分。

dump-macros

打印绑定到宏的所有 readline 键序列及其输出的字符串。如果提供了数字参数,则输出的格式将使其成为 inputrc 文件的一部分。

display-shell-version (C-x C-v)

显示有关 bash 当前实例的版本信息。

可编程完成

当尝试对命令的参数进行单词补全时,该命令的补全规范(a compspec)已使用 complete 内置命令定义(请参阅SHELL BUILTIN COMMANDS< 下面),调用可编程完成设施。

首先,识别命令名称。如果命令字是空字符串(在空行开头尝试完成),则使用使用 -E 选项定义的任何 compspec 来完成。如果已为该命令定义了 compspec,则该 compspec 将用于生成该单词的可能补全列表。如果命令字是完整路径名,则首先搜索完整路径名的 compspec。如果未找到完整路径名的 compspec,则会尝试查找最后斜杠后面部分的 compspec。如果这些搜索未产生比较规范,则使用 -D 选项定义的任何比较规范将被用作默认值。如果没有默认的 compspec,bash 将尝试对命令字进行别名扩展,作为最后的手段,并尝试从任何成功的扩展中查找命令字的 compspec。

一旦找到一个 compspec,它就被用来生成匹配单词的列表。如果未找到 compspec,则会执行上面完成下所述的默认 bash 完成。

首先,使用 compspec 指定的操作。仅返回以正在完成的单词为前缀的匹配项。当使用-f或-d选项完成文件名或目录名时,shell变量FIGNORE用于过滤匹配项。

接下来生成由 -G 选项的路径名扩展模式指定的任何补全。由模式生成的单词不需要与正在完成的单词匹配。 GLOBIGNORE shell 变量不用于过滤匹配项,但使用 FIGNORE 变量。

接下来,考虑指定为 -W 选项参数的字符串。首先使用 IFS 特殊变量中的字符作为分隔符来分割字符串。壳牌引用受到尊重。然后使用大括号扩展、波形符扩展、参数和变量扩展、命令替换和算术扩展来扩展每个单词,如上面扩展中所述。使用上述单词拆分下描述的规则拆分结果。扩展的结果与正在完成的单词进行前缀匹配,并且匹配的单词成为可能的完成。

生成这些匹配项后,将调用使用 -F 和 -C 选项指定的任何 shell 函数或命令。调用命令或函数时,COMP_LINE、COMP_POINT、COMP_KEY 和 COMP_TYPE 变量的值如下:如上所述,Shell 变量。如果调用 shell 函数,还会设置 COMP_WORDS 和 COMP_CWORD 变量。当调用函数或命令时,第一个参数 ($1) 是其参数正在完成的命令的名称,第二个参数 ($2) 是正在完成的单词Completed,第三个参数 ($3) 是当前命令行上正在完成的单词之前的单词。不会根据正在完成的单词对生成的完成进行过滤;函数或命令在生成匹配时具有完全的自由。

首先调用使用 -F 指定的任何函数。该函数可以使用任何 shell 工具(包括下面描述的 compgen 内置函数)来生成匹配项。它必须将可能的补全放入 COMPREPLY 数组变量中,每个数组元素一个。

接下来,使用 -C 选项指定的任何命令都会在相当于命令替换的环境中调用。它应该将完成列表打印到标准输出,每行一个。如有必要,反斜杠可用于转义换行符。

生成所有可能的补全后,使用 -X 选项指定的任何过滤器都会应用于列表。过滤器是用于路径名扩展的模式;模式中的 & 将替换为正在完成的单词的文本。文字 & 可以用反斜杠转义;在尝试匹配之前,反斜杠被删除。任何与模式匹配的完成都将从列表中删除。前导 ! 否定该模式;在这种情况下,任何与模式不匹配的完成都将被删除。如果启用 nocasematch shell 选项,则执行匹配时将不考虑字母字符的大小写。

最后,使用 -P 和 -S 选项指定的任何前缀和后缀都将添加到完成列表的每个成员中,并将结果返回到 readline 完成代码,如下所示可能完成的列表。

如果先前应用的操作未生成任何匹配项,并且在定义 compspec 时向 complete 提供了 -o dirnames 选项,则将尝试完成目录名称。

如果在定义 compspec 时向 complete 提供了 -o plusdirs 选项,则会尝试完成目录名称,并将任何匹配项添加到其他操作的结果中。

默认情况下,如果找到 compspec,则它生成的任何内容都会作为可能完成的完整集返回到完成代码。不会尝试默认的 bash 补全,并且禁用文件名补全的 readline 默认值。如果在定义 compspec 时向 complete 提供了 -o bashdefault 选项,则在 compspec 未生成匹配项时会尝试使用 bash 默认补全。如果在定义 compspec 时向 complete 提供了 -o default 选项,则如果 compspec (以及,如果尝试的话,默认的 bash 补全)不会生成任何匹配项。

当 compspec 指示需要目录名称完成时,可编程完成函数会强制 readline 在完成的名称后附加斜杠,这些名称是目录的符号链接,受 mark-directories readline 变量的值影响,无论 mark-symlinked-directories readline 变量的设置如何。

有一些对动态修改补全的支持。当与 complete -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 默认

历史

当启用 set 内置函数的 -o History 选项时,shell 提供对命令历史记录(之前键入的命令列表)的访问。 HISTSIZE 变量的值用作要保存在历史列表中的命令数。保存最后一个 HISTSIZE 命令的文本(默认 500)。

shell 在参数和变量扩展之前将每个命令存储在历史列表中(参见上面的 EXPANSION),但在执行历史扩展之后,受 shell 变量 HISTIGNORE 的值影响和HISTCONTROL。

启动时,历史记录从变量 HISTFILE 命名的文件(默认 ~/.bash_history)初始化。如有必要,由 HISTFILE 值命名的文件将被截断,以使其包含的行数不超过 HISTFILESIZE 值指定的行数。如果未设置HISTFILESIZE,或设置为空、非数字值或小于零的数字值,则不会截断历史文件。

读取历史文件时,以历史注释字符开头并紧随其后的数字的行将被解释为后续历史行的时间戳。这些时间戳是否显示取决于HISTTIMEFORMAT变量的值。当启用历史记录的 shell 退出时,最后的 $HISTSIZE 行将从历史记录列表复制到 $HISTFILE。

如果启用了 histappend shell 选项(请参阅下面 SHELL BUILTIN COMMANDS 下的 shopt 的说明),这些行将附加到历史文件中,否则历史文件将被覆盖。如果未设置HISTFILE,或者历史文件不可写,则不会保存历史记录。如果设置了 HISTTIMEFORMAT 变量,则时间戳将写入历史文件,并用历史注释字符进行标记,因此可以在 shell 会话中保留它们。这使用历史注释字符来区分时间戳和其他历史行。

保存历史记录后,历史文件将被截断为不超过 HISTFILESIZE 行。如果未设置HISTFILESIZE,或设置为空、非数字值或小于零的数字值,则不会截断历史文件。

内置命令fc(参见下面的SHELL BUILTIN COMMANDS)可用于列出或编辑并重新执行历史列表的一部分。内置的history可用于显示或修改历史列表以及操作历史文件。使用命令行编辑时,在提供对历史列表的访问的每种编辑模式下都可以使用搜索命令。

shell 允许控制哪些命令保存在历史列表中。可以设置 HISTCONTROL 和 HISTIGNORE 变量以使 shell 仅保存输入命令的子集。 cmdhist shell 选项(如果启用)会导致 shell 尝试将多行命令的每一行保存在同一历史记录条目中,并在必要时添加分号以保持语法正确性。 lithist shell 选项使 shell 使用嵌入的换行符而不是分号来保存命令。有关设置和取消设置 shell 选项的信息,请参阅下面 SHELL BUILTIN COMMANDS 下的 shopt 内置命令的说明。

历史扩展

shell 支持历史扩展功能,类似于 csh 中的历史扩展。本节介绍可用的语法功能。默认情况下,交互式 shell 启用此功能,并且可以使用 set 内置命令的 +H 选项禁用此功能(请参阅SHELL BUILTIN COMMANDS以下)。默认情况下,非交互式 shell 不执行历史记录扩展。

历史扩展将历史列表中的单词引入到输入流中,从而可以轻松重复命令、将前一个命令的参数插入到当前输入行中,或者快速修复前一个命令中的错误。

历史扩展在读取完整行后立即执行,然后 shell 将其分解为单词,并且在每行上单独执行,而不考虑对先前行的引用。它分为两部分。第一个是确定在替换期间使用历史列表中的哪一行。第二种是选择该行的部分内容以包含到当前行中。从历史记录中选择的行是事件,该行中所执行的部分是单词。可以使用各种修饰符来操作选定的单词。该行以与读取输入时相同的方式分解为单词,因此用引号括起来的多个元字符分隔的单词被视为一个单词。历史扩展是通过历史扩展字符的出现来引入的,默认情况下为 ! 。只有反斜杠 ( \ ) 和单引号可以引用历史扩展字符,但如果历史扩展字符紧接在双引号字符串中的结束双引号之前,也将被视为带引号。

如果紧跟历史扩展字符,即使未加引号,也有几个字符会抑制历史扩展:空格、制表符、换行符、回车符和 =。如果启用 extglob shell 选项,( 也会抑制扩展。

可以使用内置的 shopt 设置的几个 shell 选项来定制历史扩展的行为。如果启用了 histverify shell 选项(请参阅下面内置的 shopt 的说明),并且正在使用 readline,则不会立即替换历史记录传递给 shell 解析器。相反,扩展的行会重新加载到readline编辑缓冲区中以进行进一步修改。如果正在使用readline,并且启用了histreedit shell选项,则失败的历史替换将被重新加载到readline编辑缓冲区中以进行更正。 history 内置命令的 -p 选项可用于在使用历史扩展之前查看它会做什么。 history 内置命令的 -s 选项可用于将命令添加到历史列表的末尾,而不实际执行它们,以便它们可供后续调用。

shell 允许控制历史扩展机制使用的各种字符(请参阅上面Shell 变量下对histchars 的描述)。 shell在写入历史文件时使用历史注释字符来标记历史时间戳。

事件指示符

事件指示符是对历史列表中命令行条目的引用。除非引用是绝对的,否则事件是相对于历史列表中的当前位置的。

!

启动历史记录替换,除非后面跟有空白、换行符、回车符、= 或 ((当使用 shopt 启用 extglob shell 选项时)强>内置)。

!n

请参阅命令行n。

!-n

指当前命令减去n。

!!

参考上一条命令。这是“!-1”的同义词。

!string

引用历史列表中当前位置之前的以字符串开头的最新命令。

!?string[?]

引用历史列表中当前位置之前包含字符串的最新命令。如果字符串后面紧跟一个换行符,则可以省略尾随的?。如果字符串丢失,则使用最近搜索的字符串;如果没有先前的搜索字符串,则会出现错误。

^string1^string2^

快速替换。重复上一个命令,将 string1 替换为 string2。相当于``!!:s^string1^string2^''(参见下面的修饰符)。

!#

到目前为止输入的整个命令行。

词指示符

单词指示符用于从事件中选择所需的单词。 : 将事件规范与单词指示符分开。如果单词指示符以 ^、$、*、- 或 开头,则可以省略>%。单词从行首开始编号,第一个单词用 0(零)表示。单词将插入到当前行中,并用单个空格分隔。

0 (zero)

第零个字。对于 shell,这是命令字。

n

第 n 个单词。

^

第一个论点。即单词1。

$

最后一个字。这通常是最后一个参数,但如果行中只有一个单词,则会扩展到第零个单词。

%

与最近的“?字符串?”匹配的第一个单词搜索,如果搜索字符串以属于单词一部分的字符开头。

x-y

一系列单词; “-y”缩写为“0-y”。

*

除第零个词外的所有词。这是“1-$”的同义词。如果事件中只有一个单词,则使用 * 并不是错误;在这种情况下,将返回空字符串。

x*

缩写为x-$。

x-

缩写x-$,如x*,但省略最后一个单词。如果缺少 x,则默认为 0。

如果提供的字指示符没有指定事件,则前一个命令将用作事件。

修饰符

在可选的词指示符之后,可能会出现一系列一个或多个以下修饰符,每个修饰符前面都有一个“:”。这些修改或编辑从历史事件中选择的一个或多个单词。

h

删除文件名尾部部分,仅保留头部。

t

删除所有前导文件名组件,保留尾部。

r

删除 .xxx 形式的尾随后缀,保留基本名称。

e

删除除尾随后缀之外的所有内容。

p

打印新命令但不执行它。

q

引用被替换的单词,避免进一步的替换。

x

与 q 一样引用替换的单词,但在空格和换行符处分解单词。 q 和 x 修饰符是互斥的;使用最后提供的一个。

s/old/new/

将事件行中第一次出现的 old 替换为 new。任何字符都可以用作分隔符来代替 /。如果最后的分隔符是事件行的最后一个字符,则它是可选的。分隔符可以用单个反斜杠在 old 和 new 中引用。如果 & 出现在 new 中,则它会被 old 替换。单个反斜杠将引用 &。如果 old 为 null,则将其设置为最后一个 old 替换的内容,或者,如果之前没有发生历史替换,则设置为最后一个字符串 !?字符串[?]搜索。如果new为空,则删除每个匹配的old。

&

重复之前的替换。

g

导致更改应用于整个事件线。它与“:s”结合使用(例如,“:gs/old/ new/') 或 `:&'。如果与“:s”一起使用,则可以使用任何分隔符来代替 /,并且如果最后的分隔符是事件行的最后一个字符,则它是可选的。 a 可以用作 g 的同义词。

G

将以下“s”或“&”修饰符应用于事件行中的每个单词一次。

shell 内置命令

除非另有说明,本节中记录的每个内置命令都接受前面带有 - 的选项,接受 -- 来表示选项的结束。 :、true、false 和 test/[ 内置函数不接受选项,并且不要特殊对待--。 退出、注销、返回、中断、继续、让 和 shift 内置函数接受并处理以 - 开头的参数,而不需要 --。其他接受参数但未指定为接受选项的内置函数将以 - 开头的参数解释为无效选项,并需要 -- 来防止这种解释。

: [arguments]

没有效果;除了扩展参数和执行任何指定的重定向之外,该命令不执行任何操作。返回状态为零。

.  filename [arguments]
source filename [arguments]

在当前 shell 环境中读取并执行 filename 中的命令,并返回从 filename 中执行的最后一个命令的退出状态。如果文件名不包含斜杠,则使用PATH中的文件名来查找包含文件名的目录。在 PATH 中搜索的文件不必是可执行的。当bash不处于posix模式时,如果PATH中没有找到文件,则搜索当前目录。如果关闭 shopt 内置命令的 sourcepath 选项,则不会搜索 PATH。如果提供任何参数,它们将在执行文件名时成为位置参数。

否则位置参数不变。如果启用-T选项,source将继承DEBUG上的任何陷阱;如果不是,任何 DEBUG 陷阱字符串都会在对 source 的调用周围保存和恢复,并且 source 会取消设置 DEBUG-T,并且源文件更改了 DEBUG 陷阱,则当 source 完成时将保留新值。返回状态是脚本中最后退出的命令的状态(如果没有执行命令则为 0),如果未找到或无法读取 filename,则返回 false。

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

不带参数或带有 -p 选项的 Alias 以 alias name=< 形式打印别名列表标准输出上的值。提供参数时,将为每个给定值的名称定义一个别名。 value 中的尾随空格会导致在扩展别名时检查下一个单词的别名替换。对于参数列表中未提供值的每个名称,将打印别名的名称和值。 Alias 返回 true,除非给出的名称尚未定义别名。

bg [jobspec ...]

在后台恢复每个暂停的作业jobspec,就像它是通过&启动的一样。如果jobspec不存在,则使用shell的当前作业概念。 bg jobspec 返回 0,除非在禁用作业控制时运行,或者在启用作业控制的情况下运行时,未找到或启动任何指定的 jobspec没有作业控制。

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变量。每个非选项参数都是一个命令,就像它出现在 .inputrc 中一样,但每个绑定或命令必须作为单独的参数传递;例如,'“\C-x\C-r”:重新读取初始化文件'。选项(如果提供)具有以下含义:

-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函数名称和绑定。

-P

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

-s

显示绑定到宏的readline键序列及其输出的字符串,以便可以重新读取它们。

-S

显示绑定到宏的readline键序列及其输出的字符串。

-v

以可以重新读取的方式显示readline变量名称和值。

-V

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

-f filename

从文件名读取按键绑定。

-q function

查询哪些键调用指定的函数。

-u function

取消绑定所有绑定到指定函数的键。

-r keyseq

删除keyseq的任何当前绑定。

-x keyseq:shell-command

每当输入 keyseq 时,都会执行 shell-command。当执行shell-command时,shell将READLINE_LINE变量设置为readline行缓冲区和READLINE_POINT的内容strong> 和 READLINE_MARK 变量分别指向插入点的当前位置和保存的插入点(标记)。

如果执行的命令更改了 READLINE_LINE、READLINE_POINT 或 READLINE_MARK 中任何一个的值,这些新值将反映在编辑状态中。

-X

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

除非给出无法识别的选项或发生错误,否则返回值为 0。

break [n]

从 for、while、until 或 select 循环中退出。如果指定了 n,则中断 n 个级别。 n 必须 ≥ 1。如果 n 大于封闭循环的数量,则退出所有封闭循环。返回值为 0,除非 n 不大于或等于 1。

builtin shell-builtin [arguments]

执行指定的 shell 内置命令,向其传递参数,并返回其退出状态。当定义一个与 shell 内置函数同名的函数时,这非常有用,保留函数内内置函数的功能。 cd 内置函数通常以这种方式重新定义。如果 shell-builtin 不是 shell 内置命令,则返回状态为 false。

caller [expr]

返回任何活动子例程调用的上下文(shell 函数或使用 . 或 source 内置函数执行的脚本)。如果没有expr,caller将显示当前子例程调用的行号和源文件名。如果提供非负整数作为expr,调用者将显示当前执行调用堆栈中与该位置相对应的行号、子例程名称和源文件。例如,此额外信息可用于打印堆栈跟踪。当前帧是第 0 帧。返回值为 0,除非 shell 未执行子例程调用或 expr 不对应于调用堆栈中的有效位置。

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

将当前目录更改为dir。如果未提供 dir,则 HOME shell 变量的值为默认值。 dir 之后的任何其他参数都将被忽略。变量CDPATH定义包含dir的目录的搜索路径:在CDPATH中的每个目录名称中搜索dir 。

CDPATH 中的备用目录名称由冒号 (:) 分隔。 CDPATH 中的空目录名称与当前目录相同,即“.”。如果 dir 以斜杠 (/) 开头,则不使用 CDPATH。 -P 选项使 cd 在遍历 dir 时以及处理 实例之前通过解析符号链接来使用物理目录结构。 在 dir 中(另请参阅 set 内置命令的 -P 选项); -L 选项强制符号链接在处理 dir 中的 .. 实例后解析链接。

如果..出现在dir中,则通过从dir中删除紧邻的前一个路径名组件来处理它,返回到斜杠或<的开头em>目录。如果-e选项与-P一起提供,并且在成功更改目录后无法成功确定当前工作目录,cd将返回不成功的状态。在支持它的系统上,-@ 选项将与文件关联的扩展属性呈现为目录。

在尝试更改目录之前,- 参数将转换为 $OLDPWD。如果使用 CDPATH 中的非空目录名称,或者如果 - 是第一个参数,并且目录更改成功,则新工作目录的绝对路径名是写入标准输出。如果目录更改成功,则返回值为true;否则为假。

command [-pVv] command [arg ...]

运行带有 args 的命令,抑制正常的 shell 函数查找。仅执行内置命令或在 PATH 中找到的命令。如果给出-p选项,则使用PATH的默认值搜索命令,保证找到所有标准公用事业。如果提供了-V或-v选项,则会打印命令的描述。

-v 选项会导致显示一个单词,指示用于调用命令的命令或文件名; -V 选项产生更详细的描述。如果提供了-V或-v选项,则如果找到命令,则退出状态为0,如果没有找到,则退出状态为1。如果两个选项均未提供并且发生错误或找不到命令,则退出状态为127。否则,命令内置命令的退出状态为<命令。

compgen [option] [word]

根据选项生成单词的可能的完成匹配,该选项可以是完整内置函数接受的任何选项,除外-p 和 -r,并将匹配项写入标准输出。当使用-F或-C选项时,可编程完成工具设置的各种shell变量虽然可用,但不会有有用的值。

匹配的生成方式与可编程完成代码直接从具有相同标志的完成规范生成匹配的方式相同。如果指定了 word,则仅显示与 word 匹配的补全内容。

除非提供了无效选项,或者未生成任何匹配项,否则返回值为 true。

complete [-abcdefgjksuv] [-o comp-option] [-DEI] [-A action] [-G globpat] [-W wordlist]
[-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] name [name ...]
complete -pr [-DEI] [name ...]

指定每个名称的参数应如何完成。如果提供了 -p 选项,或者没有提供任何选项,则现有的完成规范将以允许将其重新用作输入的方式打印。 -r 选项删除每个name 的完成规范,或者,如果没有提供name,则删除所有完成规范。 -D 选项指示其他提供的选项和操作应应用于“默认”命令完成;也就是说,尝试对先前未定义完成的命令进行完成。 -E 选项指示其他提供的选项和操作应应用于“空”命令完成;也就是说,尝试在空行上完成。 -I 选项指示其他提供的选项和操作应适用于完成行上的初始非赋值词,或者在命令分隔符(例如 ; 或 <)之后。|,通常是命令名称完成。如果提供多个选项,则-D选项优先于-E,并且两者都优先于-I。如果提供了 -D、-E 或 -I 中的任何一个,则忽略任何其他 name 参数;这些完成仅适用于选项指定的情况。

上面可编程完成下描述了尝试单词完成时应用这些完成规范的过程。

其他选项(如果指定)具有以下含义。 -G、-W 和 -X 选项的参数(如有必要,还有 -P > 和 -S 选项)应该在调用 complete 内置函数之前被引用以防止它们扩展。

-o comp-option

comp-option 控制 compspec 行为的几个方面,超出了简单的补全生成。 comp-option 可能是以下之一:

bashdefault

如果 compspec 没有生成匹配项,则执行其余的默认 bash 补全。

default

如果 compspec 未生成匹配项,则使用 readline 的默认文件名完成。

dirnames

如果 compspec 未生成匹配项,则执行目录名称补全。

filenames

告诉 readline compspec 生成文件名,因此它可以执行任何特定于文件名的处理(例如向目录名称添加斜杠、引用特殊字符或抑制尾随空格)。旨在与 shell 函数一起使用。

noquote

告诉 readline 不要引用完整的单词(如果它们是文件名)(默认情况下引用文件名)。

nosort

告诉 readline 不要按字母顺序对可能完成的列表进行排序。

nospace

告诉 readline 不要在行尾完成的单词后添加空格(默认)。

plusdirs

生成由 compspec 定义的任何匹配项后,将尝试完成目录名称,并将任何匹配项添加到其他操作的结果中。

-A action

操作可以是以下操作之一,用于生成可能完成的列表:

alias

别名。也可以指定为-a。

arrayvar

数组变量名。

binding

Readline 键绑定名称。

builtin

shell 内置命令的名称。也可以指定为-b。

command

命令名称。也可以指定为-c。

directory

目录名称。也可以指定为-d。

disabled

禁用的 shell 内置函数的名称。

enabled

启用的 shell 内置函数的名称。

export

导出的 shell 变量的名称。也可以指定为-e。

file

文件名。也可以指定为-f。

function

shell 函数的名称。

group

组名。也可以指定为-g。

helptopic

内置 help 接受的帮助主题。

hostname

主机名,取自 HOSTFILE shell 变量指定的文件。

job

作业名称(如果作业控制处于活动状态)。也可以指定为-j。

keyword

shell 保留字。也可以指定为-k。

running

正在运行的作业的名称(如果作业控制处于活动状态)。

service

服务名称。也可以指定为-s。

setopt

set 内置函数的 -o 选项的有效参数。

shopt

shopt 内置命令接受的 Shell 选项名称。

signal

信号名称。

stopped

已停止作业的名称(如果作业控制处于活动状态)。

user

用户名。也可以指定为-u。

variable

所有 shell 变量的名称。也可以指定为-v。

-C command

命令在子shell环境中执行,其输出用作可能的完成。

-F function

shell函数function在当前shell环境中执行。当函数执行时,第一个参数($1)是正在完成其参数的命令的名称,第二个参数($2)是正在完成的单词,第三个参数 ($3) 是当前命令行上正在完成的单词之前的单词。完成后,将从 COMPREPLY 数组变量的值中检索可能的完成情况。

-G globpat

路径名扩展模式 globpat 被扩展以生成可能的补全。

-P prefix

前缀在应用所有其他选项后添加在每个可能的完成的开头。

-S suffix

在应用所有其他选项后,后缀将附加到每个可能的完成中。

-W wordlist

使用IFS特殊变量中的字符作为分隔符来分割单词列表,并且扩展每个结果单词。 wordlist 中支持 shell 引用,以便为单词提供一种机制来包含 shell 元字符或 IFS 值中的字符。可能的完成是结果列表中与正在完成的单词匹配的成员。

-X filterpat

filterpat 是用于路径名扩展的模式。它应用于由前面的选项和参数生成的可能完成列表,并且每个匹配 filterpat 的完成都将从列表中删除。 filterpat 中的前导 ! 会否定该模式;在这种情况下,任何不匹配filterpat的补全都会被删除。

返回值为 true,除非提供了无效的选项,提供了除 -p 或 -r 之外的选项且没有 name 参数、尝试删除不存在规范的名称的完成规范,或者添加完成规范时发生错误。

compopt [-o option] [-DEI] [+o option] [name]

根据选项修改每个名称的完成选项,或者如果未提供名称,则修改当前执行的完成选项。如果没有给出选项,则显示每个名称的完成选项或当前完成。 option 的可能值是对上述 complete 内置函数有效的值。 -D 选项指示其他提供的选项应应用于“默认”命令完成;也就是说,尝试对先前未定义完成的命令进行完成。 -E 选项指示其他提供的选项应应用于“空”命令完成;也就是说,尝试在空行上完成。 -I 选项指示其他提供的选项应适用于完成行上的初始非赋值词,或在命令分隔符(例如 ; 或 )之后|,通常是命令名称完成。

返回值为 true,除非提供了无效的选项、尝试修改不存在完成规范的 name 的选项,或者发生输出错误。

continue [n]

恢复封闭的 for、while、until 或 select 循环的下一次迭代。如果指定了n,则从第n个封闭循环处恢复。 n 必须 ≥ 1。如果 n 大于封闭循环的数量,则恢复最后一个封闭循环(“顶层”循环)。返回值为 0,除非 n 不大于或等于 1。

declare [-aAfFgiIlnrtux] [-p] [name[=value] ...]
typeset [-aAfFgiIlnrtux] [-p] [name[=value] ...]

声明变量和/或赋予它们属性。如果没有给出名称,则显示变量的值。 -p选项将显示每个名称的属性和值。当 -p 与 name 参数一起使用时,除 -f 和 -F 之外的其他选项将被忽略。当提供 -p 时不带 name 参数,它将显示具有附加选项指定的属性的所有变量的属性和值。如果 -p 没有提供其他选项,declare 将显示所有 shell 变量的属性和值。 -f 选项将限制显示 shell 函数。 -F选项禁止显示函数定义;仅打印函数名称和属性。如果使用 shopt 启用 extdebug shell 选项,则还会显示定义每个名称的源文件名和行号。 -F 选项意味着-f。 -g 选项强制在全局范围内创建或修改变量,即使在 shell 函数中执行 declare 也是如此。在所有其他情况下都会忽略它。 -I 选项使局部变量继承任何具有相同名称的现有变量的属性(nameref 属性除外)和值。周边范围。如果不存在现有变量,则最初未设置局部变量。以下选项可用于将输出限制为具有指定属性的变量或赋予变量属性:

-a

每个名称都是一个索引数组变量(请参阅上面的数组)。

-A

每个名称都是一个关联数组变量(请参阅上面的数组)。

-f

仅使用函数名称。

-i

该变量被视为整数;当变量被赋值时,执行算术评估(参见上面的算术评估)。

-l

当给变量赋值时,所有大写字符都会转换为小写。大写属性被禁用。

-n

为每个 name 赋予 nameref 属性,使其成为对另一个变量的名称引用。该另一个变量由 name 的值定义。对 name 的所有引用、赋值和属性修改(使用或更改 -n 属性本身的除外)均在 name 引用的变量上执行> 的值。 nameref 属性不能应用于数组变量。

-r

将名称设置为只读。这些名称不能通过后续赋值语句赋值或取消设置。

-t

为每个名称赋予trace属性。跟踪函数从调用 shell 继承 DEBUG 和 RETURN 陷阱。 Trace 属性对于变量没有特殊含义。

-u

当给变量赋值时,所有小写字符都会转换为大写。小写属性被禁用。

-x

标记名称以便通过环境导出到后续命令。

使用“+”而不是“-”会关闭该属性,但 +a 和 +A 不得用于销毁数组变量,并且 +r 不会删除只读属性。在函数中使用时,declare 和 typeset 使每个名称本地化,与 local 命令一样,除非提供了-g选项。如果变量名称后跟=value,则变量的值将设置为value。使用-a或-A以及复合赋值语法创建数组变量时,附加属性只有在后续赋值后才会生效。返回值为 0,除非遇到无效选项,尝试使用“-f foo=bar”定义函数,尝试为只读变量赋值,尝试赋值在不使用复合赋值语法的情况下将值赋给数组变量(请参阅上面的数组),其中一个名称不是有效的 shell 变量名称,会尝试将关闭只读变量的只读状态,尝试关闭数组变量的数组状态,或尝试使用-f显示不存在的函数。

dirs [-clpv] [+n] [-n]

如果没有选项,则显示当前记住的目录列表。默认显示在单行上,目录名称以空格分隔。使用pushd命令将目录添加到列表中; popd 命令从列表中删除条目。当前目录始终是堆栈中的第一个目录。

-c

通过删除所有条目来清除目录堆栈。

-l

使用完整路径名生成列表;默认列表格式使用波形符来表示主目录。

-p

打印目录堆栈,每行一个条目。

-v

打印目录堆栈,每行一个条目,并在每个条目前面加上其在堆栈中的索引。

+n

当不带选项调用时,显示从 dirs 显示的列表左侧算起的第 n 个条目,从零开始。

-n

当不带选项调用时,显示从 dirs 显示的列表右侧算起的第 n 个条目,从零开始。

返回值为 0,除非提供了无效选项或 n 个索引超出目录堆栈末尾。

disown [-ar] [-h] [jobspec ... | pid ... ]

如果没有选项,请从活动作业表中删除每个作业规范。如果jobspec不存在,并且-a和-r选项均未提供,则当前作业用来。如果给出-h选项,则每个jobspec不会从表中删除,而是会被标记,以便SIGHUP不会发送到作业如果 shell 收到 SIGHUP。如果没有提供jobspec,则-a选项表示删除或标记所有作业;不带 jobspec 参数的 -r 选项将操作限制为正在运行的作业。除非jobspec未指定有效作业,否则返回值为 0。

echo [-neE] [arg ...]

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

\a

警报(响铃)

\b

退格键

\c

抑制进一步的输出

\e
\E

转义字符

\f

换页

\n

新队

\r

回车

\t

水平制表符

\v

垂直制表符

\\

反斜杠

\0nnn

值为八进制值 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,则每个名称都被禁用;否则,将启用名称。例如,要使用通过 PATH 找到的 test 二进制文件而不是 shell 内置版本,请运行“enable -n test”。 -f 选项表示在支持动态加载的系统上从共享对象 filename 加载新的内置命令 name。 -d 选项将删除之前使用 -f 加载的内置函数。如果没有给出 name 参数,或者提供了 -p 选项,则会打印 shell 内置命令的列表。如果没有其他选项参数,该列表包含所有启用的 shell 内置命令。如果提供了-n,则仅打印禁用的内置函数。如果提供了-a,则打印的列表包括所有内置函数,并指示每个内置函数是否已启用。如果提供了-s,则输出仅限于 POSIX 特殊内置函数。返回值为 0,除非名称不是 shell 内置函数,或者从共享对象加载新内置函数时出错。

eval [arg ...]

arg 被读取并连接在一起形成一个命令。然后 shell 读取并执行该命令,并以 eval 的值返回其退出状态。如果没有args,或者只有空参数,eval返回0。

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

如果指定了command,它将替换 shell。没有创建新进程。 参数成为命令的参数。如果提供了 -l 选项,shell 会在传递给命令的第 0 个参数的开头放置一个破折号。这就是登录(1) 的作用。 -c 选项导致命令在空环境中执行。如果提供了 -a,shell 会将 name 作为第 0 个参数传递给执行的命令。如果由于某种原因无法执行命令,则非交互式 shell 将退出,除非启用了 execfail shell 选项。在这种情况下,它会返回失败。如果文件无法执行,交互式 shell 将返回失败。如果 exec 失败,子 shell 将无条件退出。如果不指定command,则任何重定向都在当前shell中生效,返回状态为0。如果存在重定向错误,则返回状态为1。

exit [n]

使 shell 以状态 n 退出。如果省略 n,则退出状态为最后执行的命令的状态。 EXIT 上的陷阱在 shell 终止之前执行。

export [-fn ] [name[=word]] ...
export -p

提供的名称被标记为自动导出到随后执行的命令的环境。如果给出了-f选项,则名称指的是函数。如果没有给出名称,或者提供了-p选项,则会打印所有导出变量的名称列表。 -n 选项会导致从每个名称中删除导出属性。如果变量名称后跟=word,则变量的值将设置为word。 export 返回退出状态 0,除非遇到无效选项,名称 之一不是有效的 shell 变量名称,或者 -f提供的名称不是函数。

fc [-e ename] [-lnr] [first] [last]
fc -s [pat=rep] [cmd]

第一种形式从历史列表中选择从first到last的一系列命令,并显示或编辑并重新执行它们。 First 和 last 可以指定为字符串(以定位以该字符串开头的最后一个命令)或数字(历史列表中的索引,其中负数用作当前命令号的偏移量)。列出时,first 或 last 0 相当于 -1,-0 相当于当前命令(通常是 fc 命令) ;否则0相当于-1,-0无效。如果未指定last,则将其设置为列出的当前命令(以便“fc -l -10”打印最后10条命令)和first否则。如果未指定first,则将其设置为上一个命令以进行编辑,并设置为-16以进行列出。

-n 选项在列出时抑制命令编号。 -r 选项反转命令的顺序。如果给出了-l选项,则命令将在标准输出中列出。否则,将在包含这些命令的文件上调用 ename 给出的编辑器。如果未给出ename,则使用FCEDIT变量的值,如果FCEDIT则使用EDITOR的值未设置。如果两个变量均未设置,则使用  vi 。编辑完成后,编辑的命令将被回显并执行。

在第二种形式中,command 在每个 pat 实例被 rep 替换后重新执行。 Command 的解释与上面的 first 相同。一个有用的别名是“r =”fc -s”'',这样输入“r cc”就会运行以“cc”开头的最后一个命令,然后输入“r”重新执行最后一个命令。

如果使用第一种形式,则返回值为 0,除非遇到无效选项或 first 或 last 指定的历史记录行超出范围。如果提供了-e选项,则返回值是最后执行的命令的值,或者如果命令的临时文件发生错误则返回失败。如果使用第二种形式,返回状态是命令重新执行的状态,除非cmd没有指定有效的历史行,在这种情况下fc返回失败。

fg [jobspec]

在前台恢复jobspec,并将其设为当前作业。如果jobspec不存在,则使用shell的当前作业概念。返回值是置于前台的命令的值,如果在禁用作业控制时运行或在启用作业控制的情况下运行时失败,如果jobspec未指定有效作业或 jobspec 指定在没有作业控制的情况下启动的作业。

getopts optstring name [arg ...]

getopts 由 shell 程序用来解析位置参数。 optstring包含要识别的选项字符;如果一个字符后面跟着一个冒号,则该选项应该有一个参数,该参数应该用空格与其分隔。冒号和问号字符不能用作选项字符。每次调用时,getopts都会将下一个选项放入shell变量name中,如果name不存在,则初始化name,并初始化要处理到变量 OPTIND 中的下一个参数。

每次调用 shell 或 shell 脚本时,OPTIND 都会初始化为 1。当选项需要参数时,getopts 将该参数放入变量中

OPTARG。 shell 不会自动重置OPTIND;如果要使用一组新参数,则必须在同一 shell 调用中多次调用 getopts 之间手动重置它。

当遇到选项结尾时,getopts 退出并返回大于零的值。

OPTIND 设置为第一个非选项参数的索引,name 设置为 ?。

getopts 通常解析位置参数,但如果以 arg 值的形式提供更多参数,则 getopts 会解析这些参数。

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

如果发现无效选项,getopts 会放置 ?到 name 中,如果不是静默,则打印一条错误消息并取消设置OPTARG。如果getopts不显示,则找到的选项字符将放置在OPTARG中,并且不打印任何诊断消息。

如果未找到所需的参数,并且 getopts 未静音,则会在 name、OPTARG 中放置一个问号 ( ? ) 未设置,并打印诊断消息。如果 getopts 不显示,则在 name 中放置冒号 ( : ),并将 OPTARG 设置为选项找到字符。

如果找到指定或未指定的选项,getopts 返回 true。如果遇到选项结尾或发生错误,则返回 false。

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

每次调用hash时,都会通过搜索` PATH中的目录来确定命令name的完整路径名并记住。任何先前记住的路径名都将被丢弃。如果提供了-p选项,则不执行路径搜索,并且使用文件名作为命令的完整文件名。 -r 选项使 shell 忘记所有记住的位置。 -d 选项使 shell 忘记每个名称的记住位置。如果提供了-t选项,则打印每个name对应的完整路径名。如果使用 -t 提供多个 name 参数,则 name 将打印在散列完整路径名之前。 -l 选项使输出以可重复用作输入的格式显示。如果没有给出参数,或者只提供了-l,则打印有关记住的命令的信息。除非找不到名称或提供了无效选项,否则返回状态为 true。

help [-dms] [pattern]

显示有关内置命令的有用信息。如果指定了pattern,help将给出所有匹配pattern的命令的详细帮助;否则会打印所有内置函数和 shell 控制结构的帮助。

-d

显示每个模式的简短描述

-m

以类似手册页的格式显示每个模式的描述

-s

仅显示每个模式的简短用法概要

除非没有命令与模式匹配,否则返回状态为 0。

history [n]
history -c
history -d offset
history -d start-end
history -anrw [filename]
history -p arg [arg ...]
history -s arg [arg ...]

如果没有选项,则显示带有行号的命令历史列表。带*列出的行已被修改。 n 参数仅列出最后 n 行。如果 shell 变量 HISTTIMEFORMAT 设置且不为空,则它将用作 strftime(3) 的格式字符串来显示关联的时间戳每个显示的历史记录条目。格式化时间戳和历史行之间不会打印中间空白。如果提供了文件名,则将其用作历史文件的名称;如果不是,则使用HISTFILE的值。选项(如果提供)具有以下含义:

-c

通过删除所有条目来清除历史列表。

-d offset

删除 offset 位置处的历史条目。 如果 offset 为负,则将其解释为相对于大于最后一个历史位置,因此负索引从历史记录末尾开始倒数,索引 -1 指的是当前的 history -d 命令。

-d start-end

删除位置 start 和 end(含)之间的历史记录条目。 start 和 end 的正值和负值的解释如上所述。

-a

将“新”历史行附加到历史文件中。这些是自当前 bash 会话开始以来输入的历史行,但尚未附加到历史文件中。

-n

将历史文件中尚未读取的历史行读取到当前历史列表中。这些是自当前 bash 会话开始以来附加到历史文件的行。

-r

读取历史文件的内容并将其追加到当前历史列表中。

-w

将当前历史列表写入历史文件,覆盖历史文件内容。

-p

对以下参数执行历史替换,并在标准输出上显示结果。不将结果存储在历史列表中。每个arg必须被引用以禁用正常的历史扩展。

-s

将 args 作为单个条目存储在历史列表中。在添加参数之前,历史列表中的最后一个命令将被删除。

如果设置了HISTTIMEFORMAT变量,则与每个历史条目关联的时间戳信息将被写入历史文件,并用历史注释字符进行标记。读取历史文件时,以历史注释字符开头并紧随其后的数字的行将被解释为后续历史条目的时间戳。返回值为 0,除非遇到无效选项、读取或写入历史文件时发生错误、将无效偏移 作为参数提供给 -d 或 作为 -p 参数提供的历史扩展失败。

jobs [-lnprs] [ jobspec ... ]
jobs -x command [ args ... ]

第一个表格列出了活动的作业。选项含义如下:

-l

除正常信息外还列出进程 ID。

-n

仅显示自上次通知用户其状态以来状态已更改的作业的信息。

-p

仅列出作业进程组领导者的进程 ID。

-r

仅显示正在运行的作业。

-s

仅显示停止的作业。

如果给出了 jobspec,则输出仅限于有关该作业的信息。返回状态为 0,除非遇到无效选项或提供了无效的jobspec。

如果提供了-x选项,jobs将替换在command或argsjobspec 与相应的进程组 ID,并执行传递给它 args 的命令,返回其退出状态。

kill [-s sigspec | -n signum | -sigspec] [pid | jobspec] ...
kill -l|-L [sigspec | exit_status]

将sigspec或signum命名的信号发送到pid或jobspec命名的进程。 sigspec 是不区分大小写的信号名称,例如 SIGKILL(带或不带 SIG 前缀)或信号编号; signum 是信号编号。如果 sigspec 不存在,则假定为 SIGTERM。 -l 参数列出了信号名称。如果在给定 -l 时提供了任何参数,则会列出与参数对应的信号名称,并且返回状态为 0。 exit_status 参数to -l 是一个数字,指定信号编号或由信号终止的进程的退出状态。 -L 选项相当于 -l。 如果至少有一个信号已成功发送,kill 返回 true,如果发生错误,则返回 false,或者遇到无效选项。

let arg [arg ...]

每个arg都是一个要计算的算术表达式(请参阅上面的算术评估)。如果最后一个 arg 的值为 0,let 返回 1;否则返回 0。

local [option] [name[=value] ... | - ]

对于每个参数,都会创建一个名为名称的局部变量,并分配值。 选项可以是声明接受的任何选项。当local在函数中使用时,它会导致变量name 将可见范围限制为该函数及其子函数。如果 name 为 -,则 shell 选项集将成为函数的本地函数,其中调用本地:使用 更改 shell 选项>当函数返回时,函数内的内置函数将恢复为原始值。恢复的效果就像执行了一系列设置命令以恢复该函数之前的值。如果没有操作数,local 将局部变量列表写入标准输出。不在函数内时使用 local 是错误的。返回状态为 0,除非 local 在函数外部使用、提供了无效的 name 或 name 是只读变量。

logout

退出登录 shell。

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

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

-d

delim的第一个字符用于终止每个输入行,而不是换行符。如果delim是空字符串,mapfile在读取NUL字符时将终止一行。

-n

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

-O

开始分配给索引 origin 处的数组。默认索引为 0。

-s

丢弃前计数行读取。

-t

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

-u

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

-C

每次读取量子行时评估回调。 -c 选项指定 量子。

-c

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

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

如果没有提供明确的来源,mapfile 将在分配之前清除数组。

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

popd [-n] [+n] [-n]

从目录堆栈中删除条目。不带参数时,从堆栈中删除顶级目录,并对新的顶级目录执行 cd 操作。参数(如果提供)具有以下含义:

-n

从堆栈中删除目录时抑制目录的正常更改,以便仅操作堆栈。

+n

删除 dirs 显示的列表左侧的第 n 个条目,从零开始。例如:“popd +0”删除第一个目录,“popd +1”删除第二个目录。

-n

删除 dirs 显示的列表右侧的第 n 个条目,从零开始。例如:“popd -0”删除最后一个目录,“popd -1”删除倒数第二个目录。

如果popd命令成功,也会执行dirs,返回状态为0。如果选项无效,popd返回false遇到这种情况,目录堆栈为空,指定了不存在的目录堆栈条目,或者目录更改失败。

printf [-v var] format [arguments]

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

格式是一个字符串,包含三种类型的对象:纯字符,简单地复制到标准输出,字符转义序列,转换并复制到标准输出和格式规范,其中每一个都会导致打印下一个连续的参数。除了标准的printf(1)格式规范, printf 解释以下扩展:

%b

使 printf 以与 echo -e 相同的方式扩展相应参数中的反斜杠转义序列 参数。

%q

导致 printf 以可重复用作 shell 输入的格式输出相应的 参数。

%(datefmt)T

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

%b、%q 和 %T 指令都使用格式规范中的字段宽度和精度参数,并从扩展参数中写入许多字节(或使用该宽字段),扩展参数通常包含比原始参数更多的字符。

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

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

pushd [-n] [+n] [-n]
pushd [-n] [dir]

将目录添加到目录堆栈的顶部,或旋转堆栈,使新的堆栈顶部成为当前工作目录。如果没有参数,pushd 会交换前两个目录并返回 0,除非目录堆栈为空。参数(如果提供)具有以下含义:

-n

当旋转或添加目录到堆栈时,禁止目录的正常更改,以便仅操作堆栈。

+n

旋转堆栈,使第 n 个目录(从 dirs 显示的列表左侧开始计数,从零开始)位于顶部。

-n

旋转堆栈,使第 n 个目录(从 dirs 显示的列表右侧开始计数,从零开始)位于顶部。

dir

将 dir 添加到顶部的目录堆栈,使其成为新的当前工作目录,就像它已作为参数提供给 cd 内置函数一样。

如果pushd命令成功,也会执行dirs。如果使用第一种形式,pushd 返回 0,除非 cd 到 dir 失败。对于第二种形式,pushd 返回 0,除非目录堆栈为空,指定了不存在的目录堆栈元素,或者到指定的新当前目录的目录更改失败。

pwd [-LP]

打印当前工作目录的绝对路径名。如果提供了 -P 选项或启用了 set 内置命令的 -ophysical 选项,则打印的路径名不包含符号链接。如果使用-L选项,则打印的路径名可能包含符号链接。返回状态为 0,除非读取当前目录名称时发生错误或提供了无效选项。

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

从标准输入或从作为 -u 选项参数提供的文件描述符 fd 读取一行, 按照上面 Word 中所述拆分为单词拆分,第一个单词分配给第一个名称,第二个单词分配给第二个名称,依此类推。如果单词数多于名称,则剩余的单词及其中间分隔符将分配给最后一个名称。如果从输入流中读取的单词少于名称,则其余名称将分配为空值。 IFS 中的字符用于将行拆分为单词,使用的规则与 shell 用于扩展的规则相同(在上面的单词拆分中进行了描述)。 反斜杠字符 ( \) 可用于删除读取的下一个字符和行继续的任何特殊含义。选项(如果提供)具有以下含义:

-a aname

这些单词被分配给数组变量 aname 的顺序索引,从 0 开始。在分配任何新值之前,aname 会被取消设置。其他名称参数将被忽略。

-d delim

delim的第一个字符用于终止输入行,而不是换行符。如果delim是空字符串,则read在读取NUL字符时将终止一行。

-e

如果标准输入来自终端,则使用readline(请参阅上面的READLINE)来获取该行。 Readline 使用当前(或默认,如果行编辑之前未激活)编辑设置,但使用 Readline 的默认文件名完成。

-i text

如果使用readline来读取该行,则在编辑开始之前文本将被放入编辑缓冲区中。

-n nchars

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

-N nchars

read 在精确读取 nchars 个字符后返回,而不是等待完整的输入行,除非遇到 EOF 或读取超时。 输入中遇到的分隔符不会被特殊处理,并且不会导致 read 返回,直到 nchars 个字符被读取。 结果不按 IFS 中的字符进行拆分;其目的是为变量分配精确的读取字符(反斜杠除外;请参阅下面的-r选项)。

-p prompt

在尝试读取任何输入之前,在标准错误上显示提示,不带尾随换行符。仅当输入来自终端时才会显示提示。

-r

反斜杠不充当转义字符。反斜杠被认为是该行的一部分。特别是,反斜杠-换行对不能用作行继续。

-s

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

-t timeout

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

-u fd

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

如果未提供名称,则读取的行(不带结束分隔符但未经修改)将分配给变量REPLY。退出状态为零,除非遇到文件结尾、读取超时(此时状态大于128)、变量赋值错误(例如赋值给只读变量)发生,或者提供了无效的文件描述符作为 -u 的参数。

readonly [-aAf] [-p] [name[=word] ...]

给定的名称标记为只读;这些名称的值可能不会因后续分配而更改。如果提供了-f选项,则与名称相对应的函数将被如此标记。 -a选项将变量限制为索引数组; -A 选项将变量限制为关联数组。如果提供了两个选项,则 -A 优先。如果没有给出 name 参数,或者提供了 -p 选项,则会打印所有只读名称的列表。其他选项可用于将输出限制为只读名称集的子集。 -p 选项使输出以可重复用作输入的格式显示。如果变量名称后跟=word,则变量的值将设置为word。 返回状态为 0,除非遇到无效选项、其中一个名称不是有效的 shell 变量名称,或者 -f 提供了名称 > 这不是一个函数。

return [n]

导致函数停止执行并将 n 指定的值返回给其调用者。如果省略n,则返回状态为函数体中最后执行的命令的状态。如果return由陷阱处理程序执行,则用于确定状态的最后一个命令是陷阱处理程序之前执行的最后一个命令。如果在DEBUG陷阱期间执行return,则用于确定状态的最后一个命令是调用return之前陷阱处理程序执行的最后一个命令。如果return 在函数外部使用,但在通过 .(source)命令执行脚本期间,它会导致 shell 停止执行该脚本并返回n 或脚本内执行的最后一个命令的退出状态作为脚本的退出状态。如果提供了n,则返回值是其最低有效 8 位。如果 return 提供了非数字参数,或者在函数外部使用且不在 执行脚本期间使用,则返回状态为非零。或源。与RETURN 陷阱关联的任何命令都会在函数或脚本之后恢复执行之前执行。

set [--abefhkmnptuvxBCEHPT] [-o option-name] [arg ...]
set [+abefhkmnptuvxBCEHPT] [+o option-name] [arg ...]

如果没有选项,每个 shell 变量的名称和值将以可重复用作设置或重置当前设置变量的输入的格式显示。只读变量无法重置。在posix模式中,仅列出shell变量。输出根据当前区域设置进行排序。当指定选项时,它们设置或取消设置 shell 属性。选项处理后剩余的任何参数都被视为位置参数的值,并按顺序分配给 $1、$2、... $n。选项(如果指定)具有以下含义:

-a

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

-b

立即报告终止的后台作业的状态,而不是在下一个主要提示之前。仅当启用作业控制时此功能才有效。

-e

如果管道(可能由单个简单命令组成)、列表 ,则立即退出, 或复合命令(参见上面的SHELL GRAMMAR),以非零状态退出。如果失败的命令是紧随 while 或 until 关键字之后的命令列表的一部分,是 if 后面测试的一部分,则 shell 不会退出Strong> 或 elif 保留字,在 && 或 || 列表中执行的任何命令的一部分,最后一个 && 后面的命令除外或 ||, 管道中除最后一个命令之外的任何命令,或者命令的返回值与 ! 反转。如果子 shell 之外的复合命令由于命令失败而返回非零状态,而 -e 被忽略,则 shell 不会退出。ERR 陷阱(如果已设置)为在 shell 退出之前执行。 该选项分别适用于 shell 环境和每个子 shell 环境(请参阅

命令执行环境上面),并且可能会导致子 shell 在执行子 shell 中的所有命令之前退出。

如果复合命令或 shell 函数在 -e 被忽略的上下文中执行, 在复合命令或函数体中执行的任何命令都不会受到 -e 设置的影响,即使如果设置了 -e 并且命令返回失败状态。如果复合命令或 shell 函数在忽略 -e 的上下文中执行时设置了 -e,则该设置不会产生任何效果,直到复合命令或包含的命令函数调用完成。

-f

禁用路径名扩展。

-h

在查找命令以供执行时记住命令的位置。默认情况下启用此功能。

-k

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

-m

监控模式。作业控制已启用。对于支持它的系统上的交互式 shell,此选项默认处于启用状态(请参阅上面的作业控制)。所有进程都在单独的进程组中运行。当后台作业完成时,shell 会打印一行包含其退出状态的行。

-n

读取命令但不执行它们。这可用于检查 shell 脚本的语法错误。交互式 shell 会忽略这一点。

-o option-name

选项名称可以是以下之一:

allexport

与-a相同。

braceexpand

与-B相同。

emacs

使用 emacs 风格的命令行编辑界面。当 shell 是交互式的时,默认情况下启用此功能,除非 shell 使用 --noediting 选项启动。这也会影响用于read -e的编辑界面。

errexit

与-e相同。

errtrace

与-E相同。

functrace

与-T相同。

hashall

与-h相同。

histexpand

与-H相同。

history

启用命令历史记录,如上面历史下所述。该选项在交互式 shell 中默认处于启用状态。

ignoreeof

其效果就好像执行了 shell 命令“IGNOREEOF=10”(请参阅上面的 Shell 变量)。

keyword

与-k相同。

monitor

与-m相同。

noclobber

与-C相同。

noexec

与-n相同。

noglob

与-f相同。

nolog

目前被忽略。

notify

与-b相同。

nounset

与-u相同。

onecmd

与-t相同。

physical

与-P相同。

pipefail

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

posix

更改默认操作与 POSIX 标准不同的 bash 行为以匹配标准(posix 模式)。请参阅另请参见 下面提供了详细说明 posix 模式如何影响 bash 行为的文档的参考。

privileged

与-p相同。

verbose

与-v相同。

vi

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

xtrace

与-x相同。

如果 -o 没有提供选项名称,则打印当前选项的值。如果+o没有提供选项名称,则一系列 set命令用于重新创建当前选项设置显示在标准输出上。

-p

打开特权模式。在此模式下,不处理 $ENV 和 $BASH_ENV 文件,不从环境继承 shell 函数,并且 SHELLOPTS、BASHOPTS、CDPATH 和 GLOBIGNORE 变量(如果它们出现在环境中)将被忽略。如果 shell 启动时有效用户(组)id 不等于真实用户(组)id,并且未提供 -p 选项,则执行这些操作,并且有效用户 id 为设置为真实用户 ID。如果在启动时提供-p 选项,则不会重置有效用户ID。关闭此选项会导致有效用户和组 ID 设置为真实用户和组 ID。

-t

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

-u

执行参数扩展时,将未设置的变量和除特殊参数“@”和“*”之外的参数视为错误。如果尝试对未设置的变量或参数进行扩展,shell 会打印一条错误消息,并且如果不是交互式的,则会以非零状态退出。

-v

在读取 shell 输入行时打印它们。

-x

展开每个简单命令后,对于命令、case命令、选择命令或算术命令,显示 的展开值 PS4,后跟命令及其扩展参数或关联的单词列表。

-B

shell 执行大括号扩展(请参阅上面的大括号扩展)。默认情况下此功能处于启用状态。

-C

如果设置,bash 不会使用 >、>& 和 <> 重定向运算符覆盖现有文件。当使用重定向运算符 >| 而不是 > 创建输出文件时,这可能会被覆盖。

-E

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

-H

启用 ! 样式历史替换。当 shell 处于交互状态时,此选项默认处于启用状态。

-P

如果设置,则在执行诸如 cd 之类更改当前工作目录的命令时,shell 不会解析符号链接。它使用物理目录结构。默认情况下,bash 在执行更改当前目录的命令时遵循目录的逻辑链。

-T

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

--

如果此选项后面没有参数,则位置参数将被取消设置。否则,位置参数将设置为 arg,即使其中一些参数以 - 开头。

-

发出选项结束信号,使所有剩余的 arg 被分配给位置参数。 -x 和 -v 选项已关闭。如果没有 arg,则位置参数保持不变。

除非另有说明,这些选项默认处于关闭状态。使用 + 而不是 - 会导致这些选项被关闭。还可以将选项指定为 shell 调用的参数。当前的选项集可以在$-中找到。除非遇到无效选项,否则返回状态始终为 true。

shift [n]

n+1 ... 中的位置参数重命名为 $1 .... 参数表示为$# 到 $#-n+1 的数字未设置。 n必须是小于或等于$#的非负数。如果n为0,则不更改任何参数。如果未给出 n,则假定为 1。如果 n 大于 $#,则位置参数不会更改。如果 n 大于 $# 或小于零,则返回状态大于零;否则为 0。

shopt [-pqsu] [-o] [optname ...]

切换控制可选 shell 行为的设置值。这些设置可以是下面列出的设置,或者,如果使用 -o 选项,则可以是 set 内置命令的 -o 选项所提供的设置。< 如果没有选项,或者使用 -p 选项,则会显示所有可设置选项的列表,并指示是否设置了每个选项;如果提供了optnames,则输出仅限于这些选项。-p选项使输出以可以重复使用的形式显示作为输入。其他选项含义如下:

-s

启用(设置)每个optname。

-u

禁用(取消设置)每个optname。

-q

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

-o

将 optname 的值限制为为 set 内置函数的 -o 选项定义的值。

如果使用 -s 或 -u 且没有 optname 参数, shopt仅分别显示那些已设置或未设置的选项。除非另有说明,shopt 选项默认处于禁用(未设置)状态。

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

购物选项列表是:

assoc_expand_once

如果设置,则 shell 在算术表达式求值期间、执行可执行变量赋值的内建函数以及执行执行数组解引用的内建函数时,会抑制关联数组下标的多次求值。

autocd

如果设置,则执行作为目录名称的命令名称,就像它是 cd 命令的参数一样。 此选项仅由交互式 shell 使用。

cdable_vars

如果设置,则 cd 内置命令的非目录参数将被假定为变量的名称,该变量的值是要更改到的目录。

cdspell

如果设置,cd 命令中目录组件的拼写小错误将得到纠正。检查的错误包括字符调换、字符缺失和一个字符过多。如果发现更正,则打印更正的文件名,然后命令继续。此选项仅由交互式 shell 使用。

checkhash

如果设置,bash 在尝试执行之前会检查在哈希表中找到的命令是否存在。如果散列命令不再存在,则执行正常路径搜索。

checkjobs

如果设置,bash 会在退出交互式 shell 之前列出所有已停止和正在运行的作业的状态。如果有任何作业正在运行,这会导致退出被推迟,直到在没有干预命令的情况下尝试第二次退出(请参阅上面的作业控制)。如果任何作业停止,shell 总是会推迟退出。

checkwinsize

如果设置,bash 在每个外部(非内置)命令后检查窗口大小,并在必要时更新 LINES 和 COLUMNS 的值。默认情况下启用此选项。

cmdhist

如果设置,bash 会尝试将多行命令的所有行保存在同一历史记录条目中。这允许轻松地重新编辑多行命令。该选项默认启用,但仅在启用命令历史记录时才有效,如上面HISTORY 中所述。

compat31
compat32
compat40
compat41
compat42
compat43
compat44

这些控制 shell 兼容性模式的各个方面(请参阅下面的SHELL COMPATIBILITY MODE)。

complete_fullquote

如果设置,bash 在执行完成时会引用文件名和目录名中的所有 shell 元字符。如果未设置,当这些元字符出现在要完成的单词中的 shell 变量引用中时,bash 将从完成文件名中引用的字符集中删除美元符号等元字符。这意味着扩展至目录的变量名中的美元符号将不会被引用;但是,文件名中出现的任何美元符号也不会被引用。仅当 bash 使用反斜杠引用完整的文件名时,此选项才有效。该变量是默认设置的,这是 4.2 版本中的默认 bash 行为。

direxpand

如果设置,bash 在执行文件名补全时将目录名称替换为单词扩展的结果。这会更改读取行编辑缓冲区的内容。如果未设置,bash 会尝试保留用户输入的内容。

dirspell

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

dotglob

如果设置,bash 包含以“.”开头的文件名。在路径名扩展的结果中。文件名 ``.'' 和 ``..'' 必须始终显式匹配,即使设置了 dotglob 也是如此。

execfail

如果设置,则如果非交互式 shell 无法执行指定为 exec 内置命令的参数的文件,则该 shell 将不会退出。如果 exec 失败,交互式 shell 不会退出。

expand_aliases

如果设置,别名将按照上面 ALIASES 中的描述进行扩展。默认情况下,交互式 shell 会启用此选项。

extdebug

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

1.

内置声明的 -F 选项显示与作为参数提供的每个函数名称相对应的源文件名和行号。

2.

如果DEBUG 陷阱运行的命令返回非零值,下一个命令将被跳过并且不执行。

3.

如果 DEBUG 陷阱运行的命令返回值 2,并且 shell 正在子例程(由 . 或 source 内置函数执行的 shell 函数或 shell 脚本)中执行,则shell 模拟对return 的调用。

4.

BASH_ARGC 和 BASH_ARGV 已按照上述说明进行更新。

5.

启用函数跟踪:命令替换、shell 函数和使用 ( command )调用的子 shell 继承 DEBUG 和 RETURN 陷阱。

6.

启用错误跟踪:命令替换、shell 函数和使用 ( command )调用的子 shell 继承 ERR 陷阱。

extglob

如果设置,则会启用上述路径名扩展下描述的扩展模式匹配功能。

extquote

如果设置,则执行 $'string' 和 $"string" 引用在用双引号括起来的$ {参数}扩展内。默认情况下启用此选项。

failglob

如果设置,则在路径名扩展期间无法匹配文件名的模式将导致扩展错误。

force_fignore

如果设置,则由 FIGNORE shell 变量指定的后缀会导致在执行单词补全时忽略单词,即使忽略的单词是唯一可能的补全。有关 FIGNORE 的说明,请参阅上面的SHELL VARIABLES。默认情况下启用此选项。

globasciiranges

如果设置,则模式匹配括号表达式中使用的范围表达式(请参阅上面的模式匹配)在执行比较时的行为就像在传统 C 语言环境中一样。也就是说,不考虑当前区域设置的整理顺序,因此 b 不会在 A 和 B 之间进行整理,并且大写和小写 ASCII 字符将整理在一起。

globstar

如果设置,路径名扩展上下文中使用的模式**将匹配所有文件以及零个或多个目录和子目录。如果该模式后跟 /,则仅目录和 子目录匹配。

gnu_errfmt

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

histappend

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

histreedit

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

histverify

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

hostcomplete

如果设置,并且正在使用 readline,则当完成包含 @ 的单词时,bash 将尝试执行主机名完成(请参阅 在上面的READLINE下完成)。默认情况下启用此功能。

huponexit

如果设置,当交互式登录 shell 退出时,bash 将向所有作业发送 SIGHUP。

inherit_errexit

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

interactive_comments

如果设置,则允许以 # 开头的单词导致该单词以及该行上的所有剩余字符在交互式 shell 中被忽略(请参阅上面的 COMMENTS)。默认情况下启用此选项。

lastpipe

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

lithist

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

localvar_inherit

如果设置,则局部变量将继承分配任何新值之前存在于先前作用域中的同名变量的值和属性。 nameref 属性不被继承。

localvar_unset

如果设置了,则在之前的函数作用域中调用unset标记它们,以便后续查找发现它们未设置,直到该函数返回。这与在当前函数作用域取消设置局部变量的行为相同。

login_shell

如果 shell 作为登录 shell 启动(请参阅上面的INVOCATION),则会设置此选项。该值可能无法更改。

mailwarn

如果设置,并且 bash 正在检查邮件的文件自上次检查以来已被访问,则消息“邮件文件中的邮件已被访问”显示“已读”。

no_empty_cmd_completion

如果设置,并且正在使用 readline,则当尝试在空行上完成时,bash 将不会尝试在 PATH 中搜索可能的完成。

nocaseglob

如果设置,bash 在执行路径名扩展时会以不区分大小写的方式匹配文件名(请参阅上面的路径名扩展)。

nocasematch

如果设置,bash 在执行 case 或 [[ 条件命令时执行匹配, 执行模式替换单词扩展或过滤可能的补全时,以不区分大小写的方式匹配模式作为可编程完成的一部分。

nullglob

如果设置,bash 允许不匹配任何文件的模式(请参阅上面的路径名扩展)扩展为空字符串,而不是其本身。

progcomp

如果设置,则启用可编程完成功能(请参阅上面的可编程完成)。默认情况下启用此选项。

progcomp_alias

如果设置,并且启用了可编程补全,bash 会将没有任何补全的命令名称视为可能的别名,并尝试别名扩展。如果它有别名,bash 会尝试使用扩展别名产生的命令字进行可编程完成。

promptvars

如果设置,提示字符串在按照上面PROMPTING中的描述进行扩展后会经历参数扩展、命令替换、算术扩展和引号删除。默认情况下启用此选项。

restricted_shell

如果 shell 在受限模式下启动,则会设置此选项(请参阅下面的RESTRICTED SHELL)。该值可能无法更改。执行启动文件时不会重置此设置,从而允许启动文件发现 shell 是否受到限制。

shift_verbose

如果设置,当移位计数超过位置参数的数量时,shift 内置函数将打印一条错误消息。

sourcepath

如果设置,source (.) 内置函数将使用 PATH 的值来查找包含作为参数提供的文件的目录。默认情况下启用此选项。

xpg_echo

如果设置,echo 内置函数默认扩展反斜杠转义序列。

suspend [-f]

暂停此 shell 的执行,直到收到 SIGCONT 信号。登录 shell 无法暂停; -f 选项可用于覆盖此设置并强制暂停。返回状态为 0,除非 shell 是登录 shell 并且未提供 -f,或者未启用作业控制。

test expr
[ expr ]

根据条件表达式 expr 的计算结果,返回状态 0(真)或 1(假)。每个运算符和操作数必须是一个单独的参数。

条件表达式。 测试不接受任何选项,也不接受和忽略--表示选项结束的参数。

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

! expr

如果 expr 为假,则为真。

( expr )

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

expr1 -a expr2

如果 expr1 和 expr2 都为 true,则为 true。

expr1 -o expr2

如果 expr1 或 expr2 为真,则为真。

使用基于参数数量的一组规则来测试和[评估条件表达式。

0 arguments

该表达是错误的。

1 argument

当且仅当参数不为空时,表达式才为 true。

2 arguments

如果第一个参数为 !,则当且仅当第二个参数为 null 时,表达式才为 true。如果第一个参数是上面在条件表达式下列出的一元条件运算符之一,则如果一元测试为 true,则表达式为 true。如果第一个参数不是有效的一元条件运算符,则表达式为 false。

3 arguments

以下条件按列出的顺序应用。如果第二个参数是上面条件表达式下列出的二进制条件运算符之一,则表达式的结果是使用第一个和第三个参数作为操作数的二进制测试的结果。当存在三个参数时,-a 和 -o 运算符被视为二元运算符。如果第一个参数是!,则该值是使用第二个和第三个参数的双参数测试的否定。如果第一个参数恰好是(而第三个参数恰好是),则结果是第二个参数的单参数测试。否则,表达式为假。

4 arguments

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

5 or more arguments

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

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

times

打印 shell 和从 shell 运行的进程的累积用户和系统时间。返回状态为0。

trap [-lp] [[arg] sigspec ...]

当 shell 接收到信号 sigspec 时,将读取并执行命令 arg。如果arg不存在(并且有一个sigspec)或-,则每个指定的信号将重置为其原始处置(进入外壳时的价值)。如果 arg 是空字符串,则每个 sigspec 指定的信号将被 shell 及其调用的命令忽略。如果arg不存在并且-p已提供,则显示与每个sigspec关联的陷阱命令。如果未提供任何参数或仅给出 -p,则 trap 将打印与每个信号关联的命令列表。 -l 选项使 shell 打印信号名称及其相应编号的列表。每个sigspec要么是<signal.h>中定义的信号名称,要么是信号编号。信号名称不区分大小写,并且 >SIG 前缀是可选的。

如果sigspec为EXIT (0),则命令arg在退出shell时执行。如果sigspec是DEBUG,则在每个简单命令之前执行命令arg, >for 命令、 case 命令、select 命令、每个算术for 命令,以及在 shell 函数中执行第一个命令之前(请参阅上面的SHELL GRAMMAR)。请参阅内置的 extdebug 选项的说明 shopt 来了解其对 DEBUG 陷阱的影响的详细信息。 如果 sigspec 为 RETURN,每次使用执行shell函数或脚本时都会执行命令arg。或源内置程序完成执行。

如果sigspec是ERR,则每当管道(可能由单个简单命令组成)、列表或复合命令返回非零退出状态,但需满足以下条件。如果失败的命令是紧随 while 或 until 关键字(测试的一部分)的命令列表的一部分,则 ERR 陷阱不会执行if 语句,是在 && 或 || 列表中执行的命令的一部分,最后一个 && 或 || 后面的命令除外, 管道中除最后一个命令之外的任何命令,或者使用 ! 反转命令的返回值。这些与 errexit (-e) 选项遵循的条件相同。

进入 shell 时被忽略的信号无法被捕获或重置。创建子 shell 或子 shell 环境时,未被忽略的捕获信号将重置为其原始值。如果任何 sigspec 无效,则返回状态为 false;否则trap返回true。

type [-aftpP] name [name ...]

如果没有选项,请指示如果用作命令名称,每个名称将如何解释。如果使用-t选项,type将打印一个字符串,该字符串是别名、关键字、之一>function、builtin 或 file 如果 name 是别名、shell 保留字、函数、内置函数或磁盘文件,分别。如果未找到名称,则不会打印任何内容,并返回 false 退出状态。如果使用 -p 选项,则 type 返回将在 name 指定为命令名称时执行的磁盘文件的名称,或者如果“type -t name”不返回文件,则什么也不做。 -P 选项强制对每个名称进行PATH搜索,即使“type -t name”不会返回文件。如果命令经过哈希处理,-p 和 -P 会打印哈希值,该值不一定是首先出现在 PATH 中的文件。如果使用-a选项,type将打印包含名为name的可执行文件的所有位置。当且仅当未同时使用 -p 选项时,这包括别名和函数。使用-a时,不会查阅散列命令表。 -f 选项会抑制 shell 函数查找,与 内置命令一样。 type 如果找到所有参数则返回 true,如果有则返回 false没有找到。

ulimit [-HS] -a
ulimit [-HS] [-bcdefiklmnpqrstuvxPRT [limit]]

在允许此类控制的系统上,提供对 shell 及其启动的进程可用的资源的控制。 -H 和 -S 选项指定为给定资源设置硬限制或软限制。硬限制一旦设置,非 root 用户就无法增加;软限制可以增加到硬限制的值。如果-H 和-S 均未指定,则软限制和硬限制均被设置。 limit 的值可以是为资源指定的单位中的数字,也可以是特殊值 hard、soft 或 之一unlimited,分别代表当前硬限制、当前软限制和无限制。如果省略 limit,则打印资源软限制的当前值,除非给出 -H 选项。当指定多个资源时,如果适用,将在值之前打印限制名称和单位。其他选项解释如下:

-a

报告所有当前限制;没有设定限制

-b

最大套接字缓冲区大小

-c

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

-d

进程数据段的最大大小

-e

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

-f

shell 及其子进程写入的文件的最大大小

-i

待处理信号的最大数量

-k

可以分配的最大 kqueue 数量

-l

可以锁定到内存的最大大小

-m

最大驻留集大小(许多系统不遵守此限制)

-n

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

-p

以 512 字节块为单位的管道大小(可以不设置)

-q

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

-r

最大实时调度优先级

-s

最大堆栈大小

-t

最大 CPU 时间(以秒为单位)

-u

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

-v

shell 及其子进程(在某些系统上)可用的最大虚拟内存量

-x

最大文件锁数量

-P

最大伪终端数

-R

实时进程在阻塞之前可以运行的最长时间,以微秒为单位

-T

最大线程数

如果给出了 limit,并且未使用 -a 选项,则 limit 是指定资源的新值。如果没有给出选项,则假定为-f。值以 1024 字节为增量,-t 除外,它以秒为单位; -R,单位为微秒; -p,以512字节块为单位; -P、-T、-b、-k、-n、和 -u,它们是未缩放的值;并且,在 posix 模式下,-c 和 -f 以 512 字节为增量。返回状态为 0,除非提供了无效的选项或参数,或者设置新限制时发生错误。

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

用户文件创建掩码设置为模式。如果mode以数字开头,则将其解释为八进制数;否则它会被解释为类似于 chmod(1) 所接受的符号模式掩码。如果省略 mode,则打印掩码的当前值。 -S 选项使掩码以符号形式打印;默认输出是八进制数。如果提供了-p选项,并且省略了mode,则输出的形式可以重复用作输入。如果模式已成功更改或未提供 mode 参数,则返回状态为 0,否则为 false。

unalias [-a] [name ...]

从定义的别名列表中删除每个名称。如果提供了 -a,则所有别名定义都将被删除。除非提供的名称不是已定义的别名,否则返回值为 true。

unset [-fv] [-n] [name ...]

对于每个名称,删除相应的变量或函数。如果给出 -v 选项,则每个 name 引用一个 shell 变量,并且该变量将被删除。只读变量不能被取消设置。如果指定了-f,则每个名称引用一个shell函数,并且函数定义将被删除。如果提供了 -n 选项,并且 name 是具有 nameref 属性的变量,name 将被取消设置,而不是它所引用的变量。 如果提供 -f 选项,-n 不起作用。

如果未提供选项,则每个名称引用一个变量;如果没有该名称的变量,则取消设置具有该名称的函数(如果有)。每个未设置的变量或函数都会从传递给后续命令的环境中删除。如果有 BASH_ALIASES、BASH_ARGV0、BASH_CMDS、BASH_COMMAND、BASH_SUBSHELL、 >BASHPID、COMP_WORDBREAKS、DIRSTACK、EPOCHREALTIME、EPOCHSECONDS、FUNCNAME >、组、HISTCMD、LINENO、随机、秒或SRANDOM 未设置,它们会失去其特殊属性,即使它们随后被重置。

除非名称是只读的,否则退出状态为 true。

wait [-fn] [-p varname] [id ...]

等待每个指定的子进程并返回其终止状态。每个id可以是一个进程ID或作业规范;如果给出了作业规范,则等待该作业管道中的所有进程。如果未给出id,则wait将等待所有正在运行的后台作业和最后执行的进程替换(如果其进程ID与$!,< 并且返回状态为零。如果提供了-n选项,wait等待id列表中的单个作业,或者,如果没有 提供id任何作业,完成并返回其退出状态。如果提供的参数都不是 shell 的子级,或者没有提供参数并且 shell 没有未等待的子级,则退出状态为 127。如果提供了 -p 选项,则进程或作业返回退出状态的作业的标识符被分配给由选项参数命名的变量varname。该变量最初将在任何操作之前取消设置。任务。仅当提供-n选项时,这才有用。在启用作业控制时,提供-f选项,强制等待 id在返回其状态之前终止,而不是在状态更改时返回。如果id指定了一个不存在的进程或作业,则返回状态为127。否则,返回状态为最后等待的进程或作业的退出状态。

外壳兼容模式

Bash-4.0 引入了“shell 兼容性级别”的概念,指定为 shopt 内置 compat31、compat32、compat40 的一组选项、compat41 等)。当前只有一个兼容性级别——每个选项都是互斥的。兼容性级别旨在允许用户在迁移脚本以使用当前功能和行为时,从以前的版本中选择与新版本不兼容的行为。它旨在作为一个临时解决方案。

本节没有提及特定版本的标准行为(例如,设置 compat32 意味着引用正则表达式的 rhs 匹配运算符引用单词中的特殊正则表达式字符,这是 bash 中的默认行为 - 3.2 及以上)。

例如,如果用户启用compat32,则可能会影响其他兼容性级别的行为,最高可达当前兼容性级别。这个想法是,每个兼容性级别控制该版本的 bash 中更改的行为,但该行为可能已存在于早期版本中。例如,bash-4.1 中对 [[ 命令使用基于区域设置的比较进行了更改,而早期版本使用基于 ASCII 的比较,因此启用 compat32 将启用基于 ASCII 的比较 这种粒度可能不足以满足所有用途,因此用户应谨慎使用兼容性级别。阅读特定功能的文档以了解当前的行为。

Bash-4.3 引入了一个新的 shell 变量:

BASH_COMPAT。分配给该变量的值(十进制版本号,如 4.2,或与 compatNN 选项相对应的整数,如 42)决定了兼容性级别。

从 bash-4.4 开始,Bash 开始弃用旧的兼容性级别。最终,这些选项将被删除,取而代之的是 BASH_COMPAT。

Bash-5.0 是最终版本,之前的版本将有一个单独的 shopt 选项。用户应在 bash-5.0 及更高版本上使用 BASH_COMPAT。

下表描述了每个兼容性级别设置控制的行为更改。 compatNN 标记用作简写,用于使用以下之一将 兼容性级别设置为 NN 对于 bash-5.0 之前的版本,可以使用相应的 compatNN shopt 选项设置兼容性级别。对于 bash-4.3 及更高版本,首选 BASH_COMPAT 变量,对于 bash-5.1 及更高版本,它是必需的。

compat31
  • 引用 [[ 命令的正则表达式匹配运算符 (=~) 的 rhs 没有特殊效果

compat32
  • 中断命令列表,例如“a;b;c”会导致执行列表中的下一个命令(在bash-4.0及更高版本中,shell的行为就像收到了中断一样,因此中断列表中的一个命令会中止)整个列表的执行)

compat40
  • [[ 命令的 < 和 > 运算符在比较字符串时不考虑当前区域设置;他们使用 ASCII 排序。 bash-4.1 之前的 Bash 版本使用 ASCII 排序规则和 strcmp(3); bash-4.1 及更高版本使用当前语言环境的排序规则序列和 strcoll(3)。

compat41
  • 在posix模式下,时间后面可能跟有选项,但仍然被识别为保留字(这是 POSIX 解释 267)

  • 在 posix 模式下,解析器要求双引号的单词部分出现偶数个单引号 参数扩展并特殊对待它们,以便单引号内的字符被视为引用(这是 POSIX 解释 221)

compat42
  • 双引号模式替换中的替换字符串不会像 bash-4.2 之后的版本那样进行引号删除

  • 在 posix 模式下,单引号在扩展双引号参数扩展的单词部分时被认为是特殊的,并且可用于引用右大括号或其他特殊字符(此是 POSIX 解释 221 的一部分);在更高版本中,单引号在双引号单词扩展中并不特殊

compat43
  • 如果尝试使用带引号的复合赋值作为声明的参数 (declare -a foo='(1 2)'),shell 不会打印警告消息。更高版本警告此用法已被弃用

  • 单词扩展错误被认为是导致当前命令失败的非致命错误,即使在 posix 模式下也是如此(默认行为是使它们成为导致 shell 退出的致命错误)

  • 执行 shell 函数时,循环状态(while/until/等)不会重置,因此该函数中的 break 或 continue 将会在调用上下文中中断或 continue 循环。 Bash-4.4 及更高版本重置循环状态以防止这种情况

compat44
  • shell 设置 BASH_ARGV 和 BASH_ARGC 使用的值,以便即使未启用扩展调试模式,它们也可以扩展到 shell 的位置参数

  • 子shell从其父上下文继承循环,因此break或继续将导致子shell退出。 Bash-5.0及更高版本重置循环状态以防止退出

  • 即使 shell 不处于 posix 模式,设置属性的 export 和 readonly 等内置函数之前的变量赋值也会继续影响调用环境中同名的变量

compat50
  • Bash-5.1 改变了 $RANDOM 的生成方式,引入了更多的随机性。如果 shell 兼容性级别设置为 50 或更低,它将恢复到 bash-5.0 及之前版本中的方法,因此通过为 <RANDOM 分配一个值来播种随机数生成器将产生相同的序列如 bash-5.0/p> 中所示

  • 如果命令哈希表为空,则 bash-5.1 之前的 bash 版本会打印一条信息性消息来说明这一点,即使生成的输出可以重复用作输入。当提供 -l 选项时,Bash-5.1 会抑制该消息。

限制性外壳

如果 bash 以名称 rbash 启动,或者在调用时提供 -r 选项,则 shell 会受到限制。受限 shell 用于设置比标准 shell 更受控制的环境。它的行为与 bash 相同,但不允许或不执行以下操作:

  • 使用 cd 更改目录

  • 设置或取消设置SHELL、PATH、HISTFILE、ENV或BASH_ENV的值>

  • 指定包含 / 的命令名称

  • 指定包含 / 的文件名作为 . 内置命令的参数

  • 指定包含斜杠的文件名作为 history 内置命令的参数

  • 指定包含斜杠的文件名作为 hash 内置命令的 -p 选项的参数

  • 启动时从 shell 环境导入函数定义

  • 启动时从 shell 环境解析 SHELLOPTS 的值

  • 使用 >、>|、<>、>&、&> 和 >> 重定向运算符重定向输出

  • 使用 exec 内置命令将 shell 替换为另一个命令

  • 使用 enable 内置命令的 -f 和 -d 选项添加或删除内置命令

  • 使用enablebuiltin命令启用禁用的shell内置命令

  • 为 command 内置命令指定 -p 选项

  • 使用 set +r 或 set +o strict 关闭受限模式。

这些限制在读取任何启动文件后强制执行。

rbash 关闭为执行脚本而生成的 shell 中的任何限制。

也可以看看

Bash Reference Manual, Brian Fox and Chet Ramey
The Gnu Readline Library, Brian Fox and Chet Ramey
The Gnu History Library, Brian Fox and Chet Ramey
Portable Operating System Interface (POSIX) Part 2: Shell and Utilities, IEEE --

http://pubs.opengroup.org/onlinepubs/9699919799/

http://tiswww.case.edu/~chet/bash/POSIX -- a description of posix mode
sh(1), ksh(1), csh(1)
emacs(1), vi(1)
readline(3)

文件

 /bin/bash 

bash 可执行文件

 /etc/profile 

系统范围的初始化文件,为登录 shell 执行

 ~/.bash_profile 

个人初始化文件,为登录 shell 执行

 ~/.bashrc 

每个交互式 shell 的单独启动文件

 ~/.bash_logout 

单独的登录 shell 清理文件,在登录 shell 退出时执行

 ~/.inputrc 

单独的阅读行初始化文件

作者

Brian Fox,自由软件基金会
bfox@gnu.org

Chet Ramey,凯斯西储大学
chet.ramey@case.edu

错误报告

如果您发现 bash 中存在错误,您应该报告它。但首先,您应该确保它确实是一个错误,并且它出现在最新版本的 bash 中。最新版本始终可以从 ftp://ftp.gnu.org/pub/gnu/bash/ 获取。

一旦确定错误确实存在,请使用bashbug命令提交错误报告。如果您有解决办法,我们鼓励您也将其邮寄!建议和“哲学”错误报告可以邮寄到 bug-bash@gnu.org 或发布到 Usenet 新闻组 gnu.bash.bug 。

所有错误报告应包括:

The version number of bash
The hardware and operating system
The compiler used to compile
A description of the bug behaviour
A short script or `recipe' which exercises the bug

bashbug 会自动将前三项插入到它提供的用于提交错误报告的模板中。

有关本手册页的评论和错误报告应发送至 chet.ramey@case.edu。

错误

它太大而且太慢。

bash 和传统版本的 sh 之间存在一些细微的差异,主要是由于 POSIX 规范的原因。

别名在某些用途中会造成混淆。

Shell 内置命令和函数不可停止/可重新启动。

`a 形式的复合命令和命令序列;乙;当尝试暂停进程时,c' 没有得到妥善处理。当进程停止时,shell 立即执行序列中的下一个命令。只需将命令序列放在括号之间即可将其强制进入子 shell,该子 shell 可以作为一个单元停止。

数组变量可能尚未导出。

一次可能只有一个活动协进程。