名称（NAME）
=======================

`bash` - `GNU Bourne-Again SHell`（`GNU` `Bourne`二世`shell`）

概要（SYNOPSIS）
=======================

```bash
bash [options] [file]
```

版权所有（COPYRIGHT）
=======================

`bash`由`Free Software Foundation, Inc`版权所有`1989-2005`。

描述（DESCRIPTION）
=======================

`bash`是与`sh`兼容的命令语言解释器，可以执行从标准输入或者文件中读取的命令。
`bash`也整合了`Korn`和`C` `Shell`（`ksh`和`csh`）中的有用的特性。

`bash`的目标是成为遵循`IEEE` `POSIX` `Shell`和工具规范（`IEEE`规范`1003.1`）的实现。
`bash`可以配置成默认和`POSIX`一致。

选项（OPTIONS）
=======================

除了在`set`内建命令的文档中讲述的单字符选项之外，`bash`在启动时还解释下列选项：

- `-c string`   
如果有`-c`选项，那么命令将从`string`中读取。如果`string`后面有参数，它们会赋值给位置参数 (以`$0`起始) 。
- `-i`  
如果有`-i`选项，`shell`则交互式（`interactive`）执行。
- `-l`  
使得`bash`以登录`shell`（`login shell`）的方式启动
（参见下面的[【启动】](overview.md#启动（INVOCATION）)一节）。
- `-r`  
如果有`-r`选项，`shell`成为受限的（`restricted`）（参见下面的【受限的`shell`】一节）。
- `-s`  
如果有`-s`选项，或者如果选项处理完以后没有参数剩余，那么从标准输入读取命令。
这个选项允许，在启动交互式`shell`时设置位置参数。
- `-D`  
向标准输出打印一个以`$`为前导的，以双引号引用的字符串列表。
这是在当前语言环境不是`C`或`POSIX`时，脚本中需要翻译的字符串。
这个选项隐含了`-n`选项，不会执行命令。
- `[-+]O [shopt_option]`    
`shopt_option`是一个`shopt`内建命令可接受的选项 (参见下面的【[`shell`内建命令](buildin-command.md#shell内建命令（SHELL BUILTIN COMMANDS）)】一节)。
如果有`shopt_option`，`-O`将设置那个选项的取值；`+O`取消它。
如果没有给出`shopt_option`，`shopt`将在标准输出上打印设为允许的选项的名称和值。
如果启动选项是`+O`，输出将以一种可以重用为输入的格式显示。
- `--`  
`--`标志选项的结束，不再处理后续选项。
任何`--`之后的参数将作为文件名和参数对待。参数`-`与此选项等价。

`bash`也解释一些多字符的选项。这些选项必须置于需要被识别的单字符参数之前才能识别。

- `--debugger`  
设置`debugger`配置文件，在`shell`启动前会执行这个文件。
- `--dump-po-strings`   
等价于`-D`，但是输出是可移植对象（`GNU gettext po`）文件格式
- `--dump-strings`  
等价于`-D`
- `--help`  
在标准输出显示用法信息并成功退出
- `--init-file file`  
`--rcfile file`  
如果`shell`是交互的，执行`file`中的命令，而不是标准的个人初始化文件`~/.bashrc`（参见下面的【启动】一节）
- `--login`  
等价于`-l`
- `--noediting`  
如果`shell`是交互的，不使用`GNU readline`库来读命令行
- `--noprofile`  
不读取系统范围的启动文件`/etc/profile`或者任何个人初始化文件`~/.bash_profile`、`~/.bash_login`或`~/.profile`。
默认情况下，`bash`在作为登录`shell`启动时读取这些文件（参见下面的【启动】一节）
- `--norc`  
如果`shell`是交互的，不读取/执行个人初始化文件`~/.bashrc`这个选项在`shell`以`sh`命令启动时是默认启用的
- `--posix`  
如果默认操作与`POSIX 1003.2`标准不同的话，改变`bash`的行为来符合标准（`posix`模式）
- `--restricted`  
`shell`成为受限的（参见下面的【受限的`shell`】一节）
- `--verbose`   
等价于`-v`
- `--version`   
在标准输出显示此`bash`的版本信息并成功退出。

参数（ARGUMENTS）
=======================

如果选项处理之后仍有参数剩余，并且没有指定`-c`或`-s`选项，第一个参数将假定为一个包含`shell`命令的文件的名字。
如果`bash`是以这种方式启动的，`$0`将设置为这个文件的名字，位置参数将设置为剩余的其他参数。
`Bash`从这个文件中读取并执行命令，然后退出。
`Bash`的退出状态是脚本中执行的最后一个命令的退出状态。
如果没有执行命令，退出状态是`0`。
尝试的步骤是先试图打开在当前目录中的这个文件，接下来，如果没有找到，`shell`在`PATH`环境变量中的目录中搜索脚本。

启动（INVOCATION）
=======================

**登录`shell`** 是一个参数零是`-`的`shell`，或者启动时指定了`--login`选项的`shell`。

**交互式`shell`** 是一个启动时没有指定非选项的参数，并且没有指定`-c`选项，标准输出和标准输入都连接到了终端 (在 isatty(3) 中判定) 的`shell`，或者启动时指定了`-i`选项的`shell`。
如果`bash`是交互的，`PS1`环境变量将被设置，并且`$-`包含`i` ，允许一个`shell`脚本或者一个启动文件来检测这一状态。

下列段落描述了`bash`如何执行它的启动文件。
如果这些启动文件中的任一个存在但是不可读取，`bash`将报告一个错误。
文件名中的波浪号`~`(tilde) 将像【扩展】一节中`Tilde Expansion`段描述的那样展开。

当`bash`是作为交互的登录`shell`启动的，或者是一个非交互的`shell`但是指定了`--login`选项，它首先读取并执行`/etc/profile`中的命令，只要那个文件存在。
读取那个文件之后，它以如下的顺序查找`~/.bash_profile`、`~/.bash_login`和`~/.profile`，从存在并且可读的第一个文件中读取并执行其中的命令。
`--noprofile`选项可以用来在`shell`启动时阻止它这样做。

当一个登录`shell`退出时，`bash`读取并执行文件`~/.bash_logout`中的命令，只要它存在。

当一个交互的`shell`但不是登录`shell`启动时，`bash`从文件`~/.bashrc`中读取并执行命令，只要它存在。
可以用`--norc`选项来阻止它这样做。
`--rcfile file`选项将强制`bash`读取并执行文件`file`中的命令，而不是`~/.bashrc`中的。

当`bash`以非交互的方式启动时，例如在运行一个`shell`脚本时，它在环境中查找变量`BASH_ENV`，如果它存在则将它的值展开，使用展开的值作为一个文件的名称，读取并执行。
`bash`运作的过程就如同执行了下列命令：

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

但是没有使用`PATH`变量的值来搜索那个文件名。

如果`bash`以名称`sh`启动，它试图模仿`sh`历史版本的启动过程，尽可能地相似，同时也遵循`POSIX`标准。
当作为交互式登录`shell`启动时,或者是非交互但使用了`--login`选项启动的时候，
它首先尝试读取并执行文件`/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`启动的。
如果`bash`发现它是由`rshd`启动的，它将读取并执行`~/.bashrc`文件中的命令，只要这个文件存在并且可读。
如果以`sh`命令启动，它不会这样做。
选项`--norc`可以用来阻止这种行为，选项`--rcfile`用来强制读取另一个文件，但是通常`rshd`不会允许它们，或者用它们来启动`shell`。

如果`shell`是以与真实用户(组)`id`不同的有效用户(组)`id`来启动的，并且没有`-`选项，那么它不会读取启动文件，也不会从环境中继承`shell`函数。
环境变量中如果出现`SHELLOPTS`，它将被忽略。
有效用户`id`将设置为真实用户`id`。
如果启动时给出了`-`选项，那么启动时的行为是类似的，但是不会重置有效用户`id`。

定义（DEFINITIONS）
=======================

下列定义在文档余下部分中通用.

- `blank`（空白）  
一个空格或是`tab`
- `word`（词）  
一个字符序列，`shell`将它们视为一个结构单元. 也称为一个`token`。
- `name` （名称）   
一个只由字母,数字和下划线构成的词,并且以字符或下划线起始. 也称为一个 word identifier标识符.
- `metacharacter`（元字符）   
一个字符, 如果不是引用的话, 将成为词的分隔符. 它是如下字符之一:  
```bash
\ | & ; ( ) < > space tab
```
- `control operator`（控制操作符）  
一个 token(标识), 拥有控制功能. 它是如下符号之一:  
```bash
|| & && ; ;; ( ) | <newline>
```

保留字（RESERVED WORDS）
=======================

**保留字** 是对`shell`有特殊意义的词。

如果

- 不是在引用中
- 并且
- 简单命令的起始词或（参见下面【`shell`语法】一节），或是`case`和`for`命令第三个单词

下列词被识别为保留的:

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