Sh - Linux命令 - UNIX命令

名称

bash - GNU Bourne-Again SHell

概要

bash [选项] [文件]

描述

Bashsh兼容的命令语言解释器,执行从标准输入或文件中读取的命令。 Bash还集成了KornC shell( kshcsh )的有用特性。

Bash旨在成为IEEE POSIX Shell和Tools规范(IEEE Working Group 1003.2)的一致性实现。

OPTIONS

除了set内建命令描述中记录的单字符外壳选项之外, bash在调用时会解释下列选项:

-c 字符串

如果存在-c选项,则从字符串中读取命令。 如果字符串后面有参数,则将它们分配给位置参数,从$ 0开始。

-一世

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

-l

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

-r

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

-s

如果存在-s选项,或者在选项处理后没有任何参数,则从标准输入中读取命令。 该选项允许在调用交互式shell时设置位置参数。

-D

在标准输出上打印所有以$开头的双引号字符串的列表。 这些字符串在当前语言环境不是CPOSIX时受语言翻译支配。 这意味着-n选项; 没有命令将被执行。

[ - +] O [ shopt_option ]

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

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

Bash还解释了一些多字符选项。 这些选项必须在要识别的单字符选项之前显示在命令行上。

自卸宝串

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

自卸串

相当于-D

- 帮帮我

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

--init文件 文件

--rc 文件

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

- 登录

相当于-l

--noediting

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

--noprofile

不要读取全系统启动文件/ etc / profile或任何个人初始化文件〜/ .bash_profile〜/ .bash_login〜/ .profile 。 默认情况下, bash在将其作为登录shell进行调用时会读取这些文件(请参阅下面的“ INVOCATION” )。

--norc

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

--posix

更改默认操作不同于POSIX 1003.2标准以匹配标准( posix模式 )的bash的行为。

--restricted

壳受到限制(请参见下面的RESTRICTED SHELL )。

--rpm-要求

产生shell脚本运行所需的文件列表。 这意味着'-n'并且受编译时错误检查检查的限制; 反引号,[]测试和evals不解析,因此可能会错过一些依赖关系。 --verbose相当于-v

- 版

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

ARGUMENTS

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

INVOCATION

登录shell是其参数零的第一个字符是- 的一个,或者是使用--login选项启动的一个。

交互式 shell是启动时没有非选项参数,并且没有-c选项,其标准输入和输出都连接到终端(由isatty (3)确定),或者使用-i选项启动。 PS1被设置,并且$ -包括如果bash是交互式的,允许shell脚本或启动文件来测试这种状态。

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

bash作为交互式登录shell或作为具有--login选项的非交互式shell调用时,它首先从文件/ etc / profile读取并执行命令(如果该文件存在)。 读取该文件后,它会按照该顺序查找〜/ .bash_profile〜/ .bash_login〜/ .profile ,并从第一个存在且可读的命令读取和执行命令。 当shell开始禁止这种行为时,可以使用--noprofile选项。

当登录shell退出时, bash会从〜/ .bash_logout文件中读取并执行命令(如果存在)。

当一个不是登录shell的交互式shell启动时,如果该文件存在, bash将读取并执行〜/ .bashrc中的命令。 这可以通过使用--norc选项来禁止。 --rcfile 文件选项将强制bash文件读取并执行命令,而不是〜/ .bashrc

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

如果[-n“$ BASH_ENV”]; 然后 。 “$ BASH_ENV”; 科幻

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

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

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

Bash试图确定它由远程shell守护进程运行的时间,通常是rshd 。 如果bash确定它由rshd运行,它将读取并执行〜/ .bashrc中的命令,如果该文件存在且可读的话。 如果作为sh调用,它不会执行此操作。 --norc选项可用于禁止此行为,-- rcfile选项可用于强制读取其他文件,但rshd通常不会使用这些选项调用shell或允许指定它们。

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

定义

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

空白

一个空格或标签。

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

名称

一个只包含字母数字字符和下划线,并且以字母字符或下划线开头。 也被称为标识符

元字符

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

| &; ()<>空格标签

控制操作员

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

|| &&&; ;; ()| <换行符>

保留字

保留字是对shell有特殊含义的字。 下列单词在未加引号时被识别为保留,并且可以是简单命令的第一个单词(见下面的SHELL GRAMMAR )或案例的第三个单词或命令:

如果在select中,则直到while {} time [[]]时才执行elif else esac fi for function

壳格林玛

简单的命令

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

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

管道

管道是由字符“ |”分隔的一个或多个命令的序列 。 管道的格式是:

[ 时间 [ -p ]] [! ] 命令 [ | command2 ...]

命令的标准输出通过管道连接到command2的标准输入。 此连接在命令指定的任何重定向之前执行(请参阅下面的重定向 )。

如果保留字 在管道之前,该管道的退出状态是最后一个命令的退出状态的逻辑非。 否则,管道的状态是最后一个命令的退出状态。 在返回值之前,shell等待管道中的所有命令终止。

如果时间保留字位于管道之前,则在管道终止时会报告执行消耗的用时和用户及系统时间。 -p选项将输出格式更改为POSIX指定的格式。 TIMEFORMAT变量可以设置为格式字符串,用于指定应如何显示时间信息; 请参阅下面的Shell Variables下的TIMEFORMAT说明。

管道中的每个命令都作为一个单独的进程执行(即在一个子shell中)。

清单

列表是一个由一个操作员分隔的一个或多个管道的序列;&&|| ,并且可选地由以下之一终止;<新行>

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

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

如果命令被控制操作符终止,那么shell在子shell中在后台执行该命令。 shell不会等待命令完成,并且返回状态为0.由a分隔的命令; 按顺序执行; shell等待每个命令依次终止。 返回状态是执行的最后一个命令的退出状态。

控制操作符&&|| 分别表示AND列表和OR列表。 AND列表具有这种形式

command1 && command2

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

OR列表具有这种形式

command1 || 命令2

当且仅当command1返回非零退出状态时才执行command2 。 AND和OR列表的返回状态是在列表中执行的最后一个命令的退出状态。

复合命令

复合命令是以下之一:

名单

列表在子shell中执行。 影响外壳环境的变量赋值和内置命令在命令完成后不会保持有效。 返回状态是列表的退出状态。

{ list ; }

列表仅在当前shell环境中执行。 列表必须以换行符或分号结尾。 这被称为组命令 。 返回状态是列表的退出状态。 请注意,与元字符)不同{}保留字 ,必须出现在允许识别保留字的位置。 由于它们不会造成单词中断,因此必须用空格将它们与列表分开。

(( 表达式 ))

表达式根据以下在算术评估中描述的规则进行评估 如果表达式的值不为零,则返回状态为0; 否则返回状态为1.这完全等价于让“ 表达式 ”。

[[ 表达 ]]

取决于对条件表达式表达式的评估,返回0或1的状态。 表达式由CONDITIONAL EXPRESSIONS下面描述的初选组成 字符分割和路径名扩展不在[[]]之间的单词上执行; 代字符扩展,参数和变量扩展,算术扩展,命令替换,进程替换和报价移除。

当使用==!=运算符时,运算符右侧的字符串被视为模式,并根据模式匹配下的规则进行匹配 。 如果字符串分别匹配或不匹配模式,则返回值为0,否则返回1。 模式的任何部分可能会被引用以强制它被匹配为一个字符串。

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

表达式

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

表达

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

expression1 && expression2

如果expression1expression2都为真,则为true。

expression1 || expression2如果expression1expression2为真,则为true。

&&|| 如果expression1的值足以确定整个条件表达式的返回值,则运算符不会评估expression2。

名字 [ in word ]; 清单 ; DONE

接下来的单词列表被展开,生成一个项目列表。 变量名称依次设置到该列表的每个元素,并且每次都执行列表 。 如果省略了in for命令会为设置的每个位置参数执行一次列表 (请参见下面的参数 )。 返回状态是执行的最后一个命令的退出状态。 如果后续项目的扩展结果为空列表,则不会执行命令,并且返回状态为0。

for (( expr1 ; expr2 ; expr3 )); 清单 ; DONE

首先,算术表达式expr1根据下面在算术评估下描述的规则来评估 然后重复评估算术表达式expr2,直到它计算为零。 每当expr2计算结果为非零值时,将执行列表并计算算术表达式expr3 。 如果省略了任何表达式,则其行为就如同它的计算结果为1.返回值是执行的列表中最后一个命令的退出状态,如果任何表达式无效,则返回false。

选择 名字 [ in word ]; 清单 ; DONE

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

[[(] pattern [ | pattern ]

case命令首先扩展单词 ,并尝试使用与路径名扩展相同的匹配规则(请参见下面的路径名扩展 ),依次将其与每个模式进行匹配。 当找到一个匹配项时,相应的列表被执行。 第一场比赛之后,不会尝试后续比赛。 如果没有模式匹配,退出状态为零。 否则,它是在列表中执行的最后一个命令的退出状态。

如果 列表 ; 然后 列出; [ elif list ; 然后 列出 ; ] ... [ else list ; ] fi

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

名单 ; 清单 ; DONE

直到 列表 ; 清单 ; DONE

只要列表中的最后一个命令返回退出状态为零, while命令就会连续执行do 列表until命令与while命令相同,只是测试是否定的; 只要列表中的最后一个命令返回非零退出状态,就会执行do 列表whileuntil命令的退出状态是执行的最后执行 列表命令的退出状态,如果没有执行任何命令,退出状态为零。

[ function ] name (){ list ; }

这定义了一个名为name的函数。 函数的主体是{和}之间的命令列表 。 只要名称被指定为简单命令的名称,就会执行该列表。 函数的退出状态是在主体中执行的最后一个命令的退出状态。 (请参阅下面的功能 。)

注释

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

QUOTING

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

DEFINITIONS下面列出的每个元字符对shell都有特殊的含义,如果要表示它自己,必须引用它。

当使用命令历史扩展设备时,通常是历史扩展字符 ,必须引用它来防止历史扩张。

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

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

用单引号括起字符保留引号内每个字符的字面值。 单引号之间可能不会出现单引号,即使前面加了反斜线。

用双引号括起字符保留了引号内所有字符的字面值,除$`\以外 。 字符$`在双引号内保留其特殊含义。 反斜线只有在跟随以下字符之一时才保留其特殊含义: $`\ 。双引号可以在双引号之前加上反斜杠。

使用双引号时,特殊参数*@具有特殊含义(请参阅下面的参数 )。

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

\一个

警报(钟)

\ b

退格

。\ E

一个转义字符

\F

形式饲料

\ n

新队

\ r

回车

\ t

水平标签

符\ v

垂直标签

\\

反斜线

\”

单引号

\ nnn

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

\ x HH

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

\ c x

一个控制字符

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

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

参数

参数是存储值的实体。 它可以是名称 ,数字或特殊参数下列出的特殊字符之一。 对于shell的目的, 变量是一个用名字表示的参数。 变量具有和零个或多个属性 。 属性使用declare builtin命令进行分配(请参阅下面的SHELL BUILTIN 命令中的 声明 )。

如果参数已被赋值,则设置该参数。 空字符串是一个有效的值。 一旦设置了一个变量,只有使用未设置的内置命令才可以取消设置 (参见下面的SHELL BUILTIN命令 )。

变量可以通过表单的语句分配

name = [ value ]

如果未给出值,则会为该变量分配空字符串。 所有值都经过代数扩展,参数和变量扩展,命令替换,算术扩展和引用移除(请参阅下面的扩展 )。 如果变量具有其整数属性集,则即使不使用$((...))扩展(请参见下面的算术扩展 ), 仍可进行算术扩展 。 除了 特殊参数 下面解释的“$ @”之外,不会执行分词。 不执行路径名扩展。 赋值语句也可以作为declaretypesetexportreadonlylocal builtin命令的参数出现。

位置参数

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

当一个位置参数由多位数字组成时,它必须用大括号括起来(见下面的EXPANSION )。

特殊参数

shell专门处理几个参数。 这些参数只能被引用; 不允许分配给他们。

*

从一个开始扩展到位置参数。 当扩展出现在双引号内时,它将扩展为一个单词,每个参数的值由IFS特殊变量的第一个字符分隔。 也就是说,“ $ * ”相当于“ $ 1 c $ 2 c ... ”,其中cIFS变量值的第一个字符。 如果IFS未设置,则参数由空格分隔。 如果IFS为空,则参数在没有介入分隔符的情况下连接。

@

从一个开始扩展到位置参数。 当扩展出现在双引号内时,每个参数都会扩展为单独的单词。 也就是说,“ $ @ ”相当于“ $ 1 ”“ $ 2 ”......当没有位置参数时,“ $ @ ”和$ @展开为空(即它们被移除)。

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

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

-

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

$

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

扩展为最近执行的后台(异步)命令的进程ID。

0

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

_

在shell启动时,设置为在参数列表中传递的shell或shell脚本的绝对文件名。 随后,展开后展开到上一个命令的最后一个参数。 还设置为执行的每个命令的完整文件名,并将其置于导出到该命令的环境中。 在检查邮件时,该参数保存当前正在检查的邮件文件的名称。

Shell变量

以下变量由shell设置:

BASH

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

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_LINE

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

COMP_POINT

COMP_WORDS

数组变量(见下面的数组 ),由当前命令行中的单个词组成。 此变量仅在可编程完成工具调用的shell函数中可用(请参见下面的可编程完成 )。

DIRSTACK

包含目录堆栈当前内容的数组变量(请参见下面的数组 )。 目录按其内置目录显示的顺序出现在堆栈中。 分配给此数组变量的成员可用于修改已存在于堆栈中的目录,但必须使用pushdpopd内建函数来添加和删除目录。 分配给这个变量不会改变当前目录。 如果DIRSTACK未设置,即使后来重置,它也会失去其特殊属性。

EUID

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

FUNCNAME

任何当前正在执行的shell函数的名称。 这个变量只有在shell函数执行时才存在。 对FUNCNAME的分配无效并返回错误状态。 如果FUNCNAME未设置,即使随后重置,它也会失去其特殊属性。

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

HISTCMD

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

主机名

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

HOSTTYPE

自动设置为唯一描述bash执行的机器类型的字符串。 默认值是系统相关的。

LINENO

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

MACHTYPE

以标准GNU cpu-company-system格式自动设置为一个完整描述在其上执行bash的系统类型的字符串。 默认值是系统相关的。

OLDPWD

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

OPTARG

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

OPTIND

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

OSTYPE

自动设置为描述执行bash的操作系统的字符串。 默认值是系统相关的。

PIPESTATUS

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

PPID

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

PWD

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

随机

每次引用此参数时,都会生成介于0和32767之间的随机整数。 随机数序列可以通过给RANDOM赋值来初始化。 如果RANDOM未设置,即使随后重置,它也会失去其特殊属性。

回复

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

SECONDS

每次引用此参数时,都会返回自从shell调用返回后的秒数。 如果将值分配给SECONDS ,则在后续引用时返回的值是自赋值加上赋值后的秒数。 如果SECONDS未设置,即使随后重置,它也会失去其特殊属性。

SHELLOPTS

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

SHLVL

每次启动一个bash实例时增加1。

UID

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

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

BASH_ENV

如果在bash执行shell脚本时设置此参数,则其值将被解释为包含用于初始化shell的命令的文件名,如〜/ .bashrc中所示BASH_ENV的值在被解释为文件名之前经受参数扩展,命令替换和算术扩展。 PATH不用于搜索结果文件名称。

CDPATH

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

当选择列表命令用于确定打印选择列表时的终端宽度。 收到SIGWINCH后自动设置。

COMPREPLY

一个数组变量, bash读取由可编程完成工具调用的shell函数生成的可能完成(参见下面的可编程完成 )。

FCEDIT

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

FIGNORE

执行文件名完成时忽略冒号分隔的后缀列表(请参阅下面的READLINE )。 其后缀与FIGNORE中的一个条目相匹配的文件名将从匹配的文件名列表中排除。 示例值是“.o:〜”。

GLOBIGNORE

以冒号分隔的模式列表,用于定义由路径名扩展忽略的一组文件名。 如果由路径名扩展模式匹配的文件名也与GLOBIGNORE中的某个模式相匹配,则会从匹配列表中删除该文件名。

HISTCONTROL

如果设置为忽略 空间值, 则以 空格字符开头的行不会输入到历史记录列表中。 如果设置为ignoredups的值,则不会输入与上一个历史记录行匹配的行。 ignoreboth的值组合了这两个选项。 如果未设置,或者设置为除上述值以外的任何其他值,解析器读取的所有行都将保存在历史列表中,并受到HISTIGNORE的值的限制 。 这个变量的函数被HISTIGNORE取代。 多行复合命令的第二行和后续行都未经过测试,并且无论HISTCONTROL的值如何,都将其添加到历史记录中。

HISTFILE

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

HISTFILESIZE

历史文件中包含的最大行数。 当这个变量被分配一个值时,如果需要,历史文件将被截断,以包含不超过该数量的行。 默认值为500.在交互式shell退出时,历史文件在写入之后也会截断为此大小。

HISTIGNORE

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

HISTSIZE

命令历史中要记住的命令的数量(请参阅下面的历史记录)。 默认值是500。

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

HOSTFILE

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

IFS

内部字段分隔符用于扩展后的字词拆分,并使用读取内置命令将字词拆分为单词。 默认值是`` ''。

IGNOREEOF

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

INPUTRC

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

LANG

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

LC_ALL

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

LC_COLLATE

此变量确定排序路径名扩展结果时使用的排序顺序,并确定路径名扩展和模式匹配中的范围表达式,等价类和整理序列的行为。

LC_CTYPE

这个变量决定了字符的解释和字符类在路径名扩展和模式匹配中的行为。

LC_MESSAGES

此变量确定用于翻译以$开头的双引号字符串的区域设置。

LC_NUMERIC

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

LINES

select builtin命令用于确定打印选择列表的列长度。 收到SIGWINCH后自动设置。

邮件

如果此参数设置为文件名并且未设置MAILPATH变量,则bash会通知用户邮件到达指定文件。

MAILCHECK

指定bash检查邮件的频率(以秒为单位)。 默认值是60秒。 当需要检查邮件时,shell会在显示主要提示之前进行检查。 如果此变量未设置,或者设置为不是大于或等于零的值,则shell会禁用邮件检查。

MAILPATH

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

MAILPATH ='/ var / mail / bfox?“你有邮件”:〜/ shell-mail?“$ _ has mail!”'

Bash为这个变量提供了一个默认值,但是它使用的用户邮件文件的位置依赖于系统(例如,/ var / mail / $ USER )。

OPTERR

如果设置为值1, bash将显示由getopts builtin命令生成的错误消息(请参阅下面的SHELL BUILTIN COMMANDS )。 每次调用shell或执行shell脚本时, OPTERR都被初始化为1。

路径

命令的搜索路径。 它是shell查找命令的冒号分隔的目录列表(请参见下面的命令执行 )。 默认路径取决于系统,由安装bash的管理员设置。 一个常见的值是`/ usr / gnu / bin:/ usr / local / bin:/ usr / ucb:/ bin:/ usr / bin :.''。

POSIXLY_CORRECT

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

PROMPT_COMMAND

如果设置,则在发出每个主要提示之前,该值将作为命令执行。

PS1

此参数的值被展开(请参阅下面的PROMPTING )并用作主提示字符串。 默认值是`` \ s- \ v \ $ ''。

PS2

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

PS3

此参数的值用作select命令的提示(请参阅上面的SHELL GRAMMAR )。

PS4

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

时间格式

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

%%

字面

%[ p ] [l] R

经过的时间以秒为单位。

%[ p ] [l] U

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

%[ p ] [l] S

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

%P

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

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

可选的l指定MM m SS格式的更长格式,包括分钟。 FF s。 p的值确定是否包含分数。

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

TMOUT

如果设置为大于零的值, TMOUT将被视为内置读取的默认超时值。 如果输入来自终端后, TMOUT秒后输入未到达,则选择命令终止。 在交互式shell中,该值被解释为发出主要提示后等待输入的秒数。 如果输入没有到达, Bash在等待那么多秒后终止。

auto_resume

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

histchars

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

数组

Bash提供了一维数组变量。 任何变量都可以用作数组; 声明内置将显式声明一个数组。 对数组的大小没有最大限制,也没有任何成员被索引或连续分配的要求。 数组使用整数进行索引,并且是从零开始的。

如果使用语法名称 [ 下标 ] = 分配了任何变量,则会自动创建一个数组。 下标被视为一个算术表达式,它必须计算大于或等于零的数字。 要显式声明一个数组,请使用declare -a name (参见下面的SHELL BUILTIN COMMANDS )。 声明-a 名称 [ 下标 ]也被接受; 下标被忽略。 可以使用declarereadonly builtins为数组变量指定属性。 每个属性都适用于数组的所有成员。

数组被赋值为使用复合赋值形式name = value 1 ... value n ,其中每个的格式为[ subscript ] = string 。 只有字符串是必需的。 如果提供了可选的括号和下标,则将该索引分配给; 否则分配的元素的索引是由语句加上1的最后一个索引。 索引从零开始。 这个语法也被declare内建接受。 可以使用上面介绍的名称 [ 下标 ] = 语法将单个数组元素分配给。

设置的内建函数用于破坏数组。 unset name [ subscript ]破坏索引下标处的数组元素。 unset name ,其中name是一个数组,或者取消设置 name [ subscript ],其中下标*@ ,将删除整个数组。

declarelocalreadonly builtins每个都接受一个-a选项来指定一个数组。 内置接受-a选项以将从标准输入读取的单词列表分配给数组。 setdeclare内建的显示数组值可以让它们作为赋值重用。

扩张

将命令行分割为单词后,再进行扩展。 有七种类型的扩展: 括号扩展波形扩展参数和变量扩展命令替换算术扩展 ,分路径名扩展

扩展的顺序是:括号扩展,波形扩展,参数,变量和算术扩展和命令替换(按照从左到右的方式完成),单词分割和路径名扩展。

在可以支持它的系统上,还有一个额外的扩展可用: 进程替换

大括号扩展

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

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

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

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

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

要么

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

Brace扩展引入与sh的历史版本略有不兼容。 当sh作为单词的一部分出现时, sh并不会特别地将它们作为开始或结束花括号,并将它们保留在输出中。 作为大括号扩展的结果, Bash从单词中删除大括号。 例如,输入为sh的文字{1,2}在输出中出现相同。 在用bash扩展后,相同的单词作为file1 file2输出。 如果需要与sh严格兼容,请使用+ B选项启动bash或使用set命令的+ B选项禁用大括号扩展(请参见下面的SHELL BUILTIN命令 )。

Tilde扩展

如果一个单词以不加引号的代字符(' ')开始,则第一个非加引号的斜杠(或所有字符,如果没有未加引号的斜杠)之前的所有字符都被视为字符前缀 。 如果没有引用tilde-prefix中的字符,则在代字号后面的tilde-prefix中的字符将被视为可能的登录名 。 如果此登录名是空字符串,则代字号会被shell参数HOME的值替换。 如果HOME未设置,则执行该shell的用户的主目录将被替换。 否则,用指定的登录名与关联的主目录替换波浪前缀。

如果代字符前缀是“〜+”,则shell变量PWD的值将替换代字号前缀。 如果代字符前缀是`〜 - ',则shell变量OLDPWD的值(如果设置)将被替换。 如果代字符前缀中的代字符后面的字符由数字N组成(可选地加上前缀+或代替),则代字号前缀将替换为目录堆栈中的相应元素,因为它将显示由用tilde-prefix作为参数调用的dir内建。 如果代字符前缀中的代字符后面的字符由没有前导'+'或' - '的数字组成,则假定为'+'。

如果登录名无效,或者代字号扩展失败,则该单词不变。

检查每个变量分配的紧接在=之后的非引号波浪前缀。 在这些情况下,也会执行波浪扩展。 因此,可以在PATHMAILPATHCDPATH的赋值中使用带有波形符的文件名,并且shell会分配扩展值。

参数扩展

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

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

参数的值被替换。 当参数是具有多个数位的位置参数时,或者当参数后面跟着不被解释为其名称一部分的字符时,需要使用大括号。

在下面的每种情况下, 单词都会经历代字符扩展,参数扩展,命令替换和算术扩展。 当不执行子字符串扩展时, bash将测试未设置或为空的参数; 省略冒号只会导致未设置参数的测试。

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

分配默认值 。 如果参数未设置或为空,则将单词的扩展分配给参数 。 然后用参数的值代替。 这种方式可能不会分配位置参数和特殊参数。

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

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

扩展为名称以前缀开头的变量名称,用IFS特殊变量的第一个字符分隔。

参数值的字符长度被替换。 如果参数*@ ,则替换的值是位置参数的数量。 如果参数是以*@开头的数组名称,则替换值是数组中元素的数量。

这个被扩展为产生一个模式,就像路径名扩展一样。 如果模式匹配参数值的开始,那么扩展结果是最短匹配模式(`` ''case)或最长匹配模式(`` ## ' '案例)删除。 如果参数@* ,则模式删除操作将依次应用于每个位置参数,并且扩展是结果列表。 如果参数是以@*为下标的数组变量,则将模式删除操作依次应用于数组的每个成员,并且扩展是结果列表。

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

模式被扩展为产生一个模式,就像路径名扩展一样。 参数被扩展并且模式与其值的最长匹配被字符串替换。 在第一种形式中,只有第一个匹配被替换。 第二种形式导致模式的所有匹配被替换为字符串 。 如果模式开头,则它必须在参数的扩展值的开头匹配。 如果模式开头,它必须在参数的扩展值的末尾匹配。 如果string为空,则删除pattern的匹配,并且可以省略/ following 模式 。 如果参数@* ,则替换操作依次应用于每个位置参数,并且扩展是结果列表。 如果参数是以@*为下标的数组变量,则将替换操作依次应用于数组的每个成员,并且扩展是结果列表。

命令替换

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

$( 命令

要么

` 命令 `

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

当使用旧式的反引号替换形式时,反斜杠将保留其字面含义,除非后跟$`\ 。 不带反斜杠的第一个反引号将终止命令替换。 使用$( command )形式时,括号之间的所有字符构成命令; 没有人专门处理。

命令替换可能是嵌套的。 要在使用反引号形式时嵌套,请用反斜杠将内引号退出。

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

算术扩展

算术扩展允许评估算术表达式并替换结果。 算术扩展的格式是:

$(( 表达式 ))

表达式被视为在双引号内,但括号内的双引号未被专门处理。 表达式中的所有令牌都经历参数扩展,字符串扩展,命令替换和引用移除。 算术替换可以嵌套。

评估按照以下在算术评估中列出的规则进行 如果expression无效, bash会打印一条指示失败的消息,并且不会发生替换。

流程替代

支持命名管道( FIFOs )的系统或命名打开文件的/ dev / fd方法支持进程替换 。 它采用<( list >( list )的形式 。 进程列表的输入或输出连接到FIFO/ dev / fd中的某个文件。 作为扩展的结果,此文件的名称作为参数传递给当前命令。 如果使用>( 列表 表单,写入文件将为列表提供输入。 如果使用<( list 形式,则应读取作为参数传递的文件以获取列表的输出。

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

分词

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

shell将IFS的每个字符视为分隔符,并将其他扩展的结果拆分为这些字符上的单词。 如果IFS未设置,或者其值正好是<空格> <选项卡> <新行> ,则默认情况下,任何IFS字符序列都可用于分隔单词。 如果IFS的值不是默认值,则只要空格字符在IFSIFS空白字符)的值中,空白字符空格制表符的序列就会在字的开头和结尾被忽略。 IFS中不是IFS空白字符的任何字符以及任何相邻的IFS空白字符都会分隔一个字段。 一系列IFS空格字符也被视为分隔符。 如果IFS的值为空,则不会发生分词。

显式空参数( “”“' )被保留。 由于扩展没有值的参数而导致的未引用的隐式空参数将被删除。 如果没有值的参数在双引号内扩展,则会生成一个空参数并保留。

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

路径名称扩展

在分词之后,除非已设置-f选项,否则bash将扫描每个单词的字符* ,? ,和[ 。 如果出现这些字符中的一个,则将该字视为模式 ,并用符合该模式的按字母顺序排列的文件名列表替换。 如果找不到匹配的文件名,并且shell选项nullglob被禁用,则该字保持不变。 如果设置了nullglob选项,并且找不到匹配项,则会删除该词。 如果启用shell选项nocaseglob ,则不考虑字母字符的情况下执行匹配。 使用模式进行路径名扩展时,除非设置了shell选项dotglob ,否则必须明确匹配名称开头或斜线后面的字符“。” 。 匹配路径名时,斜杠字符必须始终显式匹配。 在其他情况下, “`。”“字符没有被专门处理。 有关nocaseglobnullglobdotglob shell选项的说明,请参阅SHELL BUILTIN COMMANDS下面的shopt说明。

GLOBIGNORE shell变量可用于限制匹配模式的文件名集合。 如果设置了GLOBIGNORE ,则每个匹配的文件名都与匹配的GLOBIGNORE中的某个模式相匹配。 即使设置了GLOBIGNORE ,文件名“。”“..”也会被忽略。 但是,设置GLOBIGNORE具有启用dotglob shell选项的效果,所以以“。”开头的所有其他文件名都将匹配。 为了避免忽略以``。''开头的文件名的旧行为,在GLOBIGNORE中创建``。*''模式之一。 当GLOBIGNORE未设置时, dotglob选项被禁用。

模式匹配

除了下面描述的特殊模式字符以外,出现在模式中的任何字符都与自身相匹配。 NUL字符可能不会出现在一个模式中。 如果字面意义上匹配,则必须引用特殊模式字符。

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

*

匹配任何字符串,包括空字符串。

匹配任何单个字符。

[...]

匹配任何一个附上的字符。 用连字符分隔的一对字符表示范围表达式 ; 任何使用当前语言环境的整理顺序和字符集在这两个字符之间进行排序的字符(包括这两个字符)将进行匹配。 如果第一个字符是[ 或者^然后任何不包围的字符匹配。 范围表达式中字符的排序顺序由当前语言环境和LC_COLLATE shell变量的值(如果设置)确定。 A -可以通过将它包括为集合中的第一个或最后一个字符来进行匹配。 A ]可以通过将其包括为集合中的第一个字符来匹配。

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

alnum alpha ascii空白cntrl数位图下打印点位空间上位词xdigit
一个字符类匹配属于该类的任何字符。 单词字符类匹配字母,数字和字符_。

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

[]中 ,语法[。 符号 。]与整理符号符号匹配。

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

?( 模式列表

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

*( 模式列表

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

+( 模式列表

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

@( 模式列表

完全匹配给定模式中的一个

!( 模式列表

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

报价清除

在前面的扩展之后,删除了不是由上述扩展之一产生的所有未加引号的字符\'

REDIRECTION

在执行命令之前,其输入和输出可能会使用由shell解释的特殊符号重定向 。 重定向也可用于打开和关闭当前shell执行环境的文件。 以下重定向操作符可能先于或出现在简单命令内的任何地方或可能遵循命令 。 重定向按照它们出现的顺序从左到右进行处理。

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

除非另有说明,下列描述中的重定向操作符之后的单词将经历大括号扩展,波形符号扩展,参数扩展,命令替换,算术扩展,引用移除,路径名扩展和分词。 如果它扩展为多个单词,则bash会报告错误。

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

ls > dirlist 2 >& 1

指挥标准输出和标准错误的文件dirlist ,而命令

ls 2 >& 1 > dirlist

只将标准输出指向文件dirlist ,因为在标准输出重定向到dirlist之前,标准错误被重复为标准输出。

如下表所述, Bash特别处理重定向中使用的多个文件名:

/ dev / fd / fd

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

的/ dev /标准输入

文件描述符0被复制。

的/ dev /标准输出

文件描述符1被复制。

的/ dev /标准错误

文件描述符2被复制。

/ dev / tcp / host / port

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

/ dev / udp / host / port

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

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

重定向输入

输入的重定向会导致文件描述符n的文本描述符n将被打开以读取的扩展名,如果未指定n ,则输入标准输入(文件描述符0)。

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

[ n ] < 单词

重定向输出

输出的重定向会导致文件的名称由单词的扩展名开始写入文件描述符n ,如果未指定n ,则标准输出(文件描述符1)。 如果文件不存在,则创建该文件; 如果它确实存在,则它被截断为零大小。

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

[ n ] >

如果重定向操作符> ,并且启用了set builtin的noclobber选项,则如果名称由单词扩展导致的文件存在并且是常规文件,则重定向将失败。 如果重定向操作符是> | ,或者重定向操作符是>,并且set builtin命令的noclobber选项未启用时,即使按命名的文件存在,也会尝试重定向。

附加重定向输出

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

追加输出的一般格式是:

[ n ] >>

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

Bash允许将标准输出(文件描述符1)和标准错误输出(文件描述符2)重定向到名称是此构造的单词扩展名的文件。

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

&>

>&

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

> 2 >& 1

这里的文件

这种类型的重定向指示shell从当前源读取输入,直到看到只包含单词 (没有尾随空白)的行。 所有读到该点的行都被用作命令的标准输入。

这里的文件格式是:

<< [ - ] word here-document 分隔符

执行参数扩展,命令替换,算术扩展或路径名扩展。 如果引用了单词中的任何字符,则分隔符是对单词的引用删除的结果,并且此文档中的行不会展开。 如果单词不加引号,那么这里的文档的所有行都要经过参数扩展,命令替换和算术扩展。 在后一种情况下,字符序列\ <新行>被忽略, \必须用于引用字符\$`

如果重定向操作符是<< - ,则所有前导制表符都从输入行和包含分隔符的行中剥离。 这允许在这里 - shell脚本中的文档以自然的方式缩进。

这里字符串

这里的文件的一个变种,格式是:

<<< 一词

单词被扩展并提供给其标准输入的命令。

复制文件描述符

重定向操作符

[ n ] <& word

用于复制输入文件描述符。 如果单词扩展为一个或多个数字,则将由n表示的文件描述符设为该文件描述符的副本。 如果单词中的数字未指定打开文件描述符进行输入,则会发生重定向错误。 如果单词评估为- ,则文件描述符n关闭。 如果未指定n ,则使用标准输入(文件描述符0)。

运营商

[ ] word

类似地用于复制输出文件描述符。 如果未指定n ,则使用标准输出(文件描述符1)。 如果单词中的数字未指定打开输出的文件描述符,则会发生重定向错误。 作为特殊情况,如果省略了n ,并且不扩展为一个或多个数字,则标准输出和标准错误将按前面所述重定向。

移动文件描述符

重定向操作符

[ n ] <& digit -

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

同样,重定向操作符

[ n ] >& digit -

如果未指定n ,则将文件描述符数字移至文件描述符n或标准输出(文件描述符1)。

打开文件描述符进行读写

重定向操作符

[ n ] <>

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

ALIASES

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

使用别名命令创建并列出别名 ,并使用unalias命令删除别名

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

除非使用shopt设置expand_aliases shell选项(请参阅下面的SHELL BUILTIN COMMANDS下的shopt描述),否则在shell不交互时不会扩展别名。

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

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

功能

一个shell函数,如上面在SHELL GRAMMAR下描述的那样定义存储一系列命令供以后执行。 当shell函数的名称用作简单命令名时,将执行与该函数名相关联的命令列表。 函数在当前shell的上下文中执行; 没有新的进程被创建来解释它们(与执行shell脚本相反)。 当一个函数被执行时,函数的参数在执行过程中成为位置参数。 特殊参数将更新以反映更改。 位置参数0不变。 FUNCNAME变量在函数执行时被设置为函数的名称。 除了DEBUG陷阱(请参阅下面的SHELL BUILTIN COMMANDS下的陷阱内置描述)之外,shell执行环境的所有其他方面在函数和调用者之间是相同的,除非该函数已被赋予trace属性(请参阅下面的声明内置说明)。

该函数的局部变量可以用本地内建命令声明。 通常,变量及其值在函数和调用者之间共享。

如果内建命令返回在函数中执行,则该函数完成并且在函数调用后的下一个命令中继续执行。 当函数完成时,位置参数和特殊参数的值将恢复为它们在函数执行之前的值。

函数名称和定义可以使用declaretypeset builtin命令的-f选项列出。 声明排版-F选项仅列出函数名称。 可以导出函数,以便子壳体自动使用-f选项将内容定义为内置导出

函数可能是递归的。 递归调用的数量没有限制。

算术评估

在某些情况下,shell允许评估算术表达式(参见let builtin命令和算术扩展 )。 评估是以固定宽度的整数完成的,没有检查溢出,尽管除0被捕获并标记为错误。 运算符及其优先级和关联性与C语言中的相同。 下面的运算符列表被分组为相等优先级运算符的级别。 级别按优先级递减顺序列出。

id ++ id -

可变后增量和后减量

++ id - id

可变的预增量和预减量

- +

一元减号和加号

逻辑和按位否定

**

* /%

乘法,除法,余数

+ -

加法,减法

<< >>

左右位移

<=> = <>

对照

==!=

平等和不平等

按位与

^

按位异或

|

按位或

&&

逻辑与

||

逻辑或

exprexprexpr

有条件评估

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

分配

expr1expr2

逗号

允许Shell变量作为操作数; 在评估表达式之前执行参数展开。 在表达式中,shell变量也可以通过名称来引用,而不使用参数扩展语法。 当被引用时,变量的值被评估为算术表达式。 一个shell变量不需要打开它的整数属性来在表达式中使用。

前导0的常量被解释为八进制数字。 前导的0x或0X表示十六进制。 否则,数字采用[ base# ] n的形式,其中base是代表算术基数的2到64之间的十进制数,而n是该基数中的数字。 如果碱基#被省略,则使用碱基10。 大于9的数字以小写字母,大写字母@和_顺序表示。 如果基数小于或等于36,则小写字母和大写字母可互换使用,表示10到35之间的数字。

运算符按优先顺序进行评估。 括号中的子表达式首先被评估并且可以覆盖上面的优先规则。

有条件的表达

条件表达式由[[复合命令和测试[内建命令来测试文件属性并执行字符串和算术比较]使用。 表达式由以下一元或二元基色形成。 如果其中一个基本文件的任何文件参数的格式为/ dev / fd / n ,则检查文件描述符n 。 如果其中一个基本文件的文件参数是/ dev / stdin/ dev / stdout/ dev / stderr中的一个 ,则分别检查文件描述符0,1或2。

- 一个 文件

如果文件存在则为真。

-b 文件

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

-c 文件

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

-d 文件

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

-e 文件

如果文件存在则为真。

-f 文件

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

-g 文件

如果文件存在并且是set-group-id,则为true。

-h 文件

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

-k 文件

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

-p 文件

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

-r 文件

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

-s 文件

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

-t fd

如果文件描述符fd是开放的并且引用终端,则为真。

-u 文件

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

-w 文件

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

-x 文件

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

-O 文件

如果文件存在并由有效用户标识拥有,则为true。

-G 文件

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

-L 文件

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

-S 文件

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

-N 文件

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

file1 - nt file2

如果file1file2更新(根据修改日期),或者file1存在且file2不存在,则为true。

file1 - ot file2

如果file1file2旧,或者file2存在且file1不存在,则为true。

file1 -ef file2

如果file1file2引用相同的设备和inode编号,则为true。

-o optname

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

-z 字符串

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

-n 字符串

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

string1 == string2

如果字符串相等,则为真。 =可用于代替==,以符合严格的POSIX标准。

string1 != string2

如果字符串不相等则为真。

string1 < string2

如果string1按字典顺序排列在当前语言环境中, 则按 字符串排序。

string1 > string2

如果string1按当前语言环境中的字典顺序排序,则返回 true。

arg1 OP arg2

OP-eq-ne-lt-le-gt-ge之一 。 如果arg1分别等于,不等于,小于,小于或等于,大于或大于或等于arg2 ,则这些算术二元运算符返回true。 Arg1arg2可能是正整数或负整数。

简单的命令扩展

当执行一个简单的命令时,shell从左到右执行以下扩展,分配和重定向。

1。

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

2。

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

3。

重定向的执行方式如上所述,在REDIRECTION下。

4。

每个变量赋值中的=之后的文本在被分配给变量之前经历了代数扩展,参数扩展,命令替换,算术扩展和引用移除。

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

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

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

指挥执行

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

如果命令名不包含斜杠,shell会尝试找到它。 如果通过该名称存在shell函数,则按照上述FUNCTIONS中的说明调用该函数 。 如果名称与函数不匹配,shell会在shell内建列表中搜索它。 如果找到匹配项,则调用该内建程序。

如果该名称既不是shell函数也不是内建函数,并且不包含斜线,则bash将通过该名称搜索包含可执行文件的目录的每个PATH元素。 Bash使用哈希表来记住可执行文件的完整路径名(请参阅下面的SHELL BUILTIN COMMANDS下的哈希 )。 只有在散列表中找不到该命令时,才会执行PATH中目录的完整搜索。 如果搜索不成功,shell会打印一条错误消息并返回127的退出状态。

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

如果由于该文件不是可执行格式导致执行失败,并且该文件不是目录,则假定它是一个shell脚本 ,一个包含shell命令的文件。 子shell被生成执行它。 这个子shell自己重新初始化,所以效果就好像一个新的shell已经被调用来处理脚本,除了父子记住的命令的位置(参见下面的SHELL BUILTIN命令下面的hash )被孩子保留。

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

指挥执行环境

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

*

打开在调用时由外壳继承的文件,通过提供给exec内建的重定向进行修改

*

当前工作目录由cdpushdpopd设置 ,或者在调用时由shell继承

*

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

*

陷阱设置的当前陷阱

*

shell参数,这些参数是通过变量赋值或在环境中设置或从shell的父级继承而设置

*

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

*

在调用时启用的选项(默认或通过命令行参数)或按设置启用

*

shopt启用的选项

*

用别名定义的shell 别名

*

各种进程ID,包括后台作业的ID, $$的值和$ PPID的值

当执行除内建函数或shell函数以外的简单命令时,将在包含以下内容的独立执行环境中调用它。 除非另有说明,否则这些值是从shell继承而来的。

*

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

*

当前的工作目录

*

文件创建模式掩码

*

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

*

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

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

命令替换和异步命令在与shell环境重复的子shell环境中调用,不同之处在于,shell捕获的陷阱重置为shell在调用时从其父节点继承的值。 作为流水线一部分调用的内置命令也在子外壳环境中执行。 对子shell环境所做的更改不会影响shell的执行环境。

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

也可以看看

Bash参考手册 ,Brian Fox和Chet Ramey

Gnu Readline图书馆 ,Brian Fox和Chet Ramey

Gnu历史图书馆 ,Brian Fox和Chet Ramey

便携式操作系统接口(POSIX)第2部分:外壳和实用程序 ,IEEE

sh (1), ksh (1), csh (1)

emacs (1), vi (1)

readline (3)