add redirection.md

This commit is contained in:
Jerry Lee
2014-09-17 22:38:35 +08:00
parent 1c0ebaf884
commit 135ccffe36
2 changed files with 198 additions and 4 deletions

View File

@@ -51,7 +51,7 @@ bash [options] [file]
如果没有给出`shopt_option``shopt`将在标准输出上打印设为允许的选项的名称和值。
如果启动选项是`+O`,输出将以一种可以重用为输入的格式显示。
- `--`
`--` 标志选项的结束,不再处理后续选项。
`--`标志选项的结束,不再处理后续选项。
任何`--`之后的参数将作为文件名和参数对待。参数`-`与此选项等价。
`bash`也解释一些多字符的选项。这些选项必须置于需要被识别的单字符参数之前才能识别。
@@ -98,9 +98,9 @@ bash [options] [file]
启动INVOCATION
=======================
登录`shell`,参数零的第一个字符是`-`,或者启动时指定了`--login`选项的`shell`
**登录`shell`** 是一个参数零是`-``shell`,或者启动时指定了`--login`选项的`shell`
交互的`shell`是一个启动时没有指定非选项的参数,并且没有指定`-c`选项,标准输出和标准输入都连接到了终端 (在 isatty(3) 中判定) 的`shell`,或者启动时指定了`-i`选项的`shell`
**交互式`shell`** 是一个启动时没有指定非选项的参数,并且没有指定`-c`选项,标准输出和标准输入都连接到了终端 (在 isatty(3) 中判定) 的`shell`,或者启动时指定了`-i`选项的`shell`
如果`bash`是交互的,`PS1`环境变量将被设置,并且`$-`包含`i` ,允许一个`shell`脚本或者一个启动文件来检测这一状态。
下列段落描述了`bash`如何执行它的启动文件。
@@ -178,7 +178,7 @@ if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
- 不是在引用中
- 并且
- 简单命令的起始词或(参见下面【`shell`语法】一节),或`case``for`命令第三个单词
- 简单命令的起始词或(参见下面【`shell`语法】一节),或`case``for`命令第三个单词
下列词被识别为保留的:

194
bash-3-man/redirection.md Normal file
View File

@@ -0,0 +1,194 @@
重定向REDIRECTION
=================
在命令执行前,它的输入和输出可能被重定向(`redirect`),使用一种`shell`可以解释的特殊记法。
重定向也可以用于为当前`shell`执行环境打开和关闭文件。
下列重定向操作符可以前置或者放在简单命令(`simple command`)之中的任何位置,或者放在命令之后。
重定向是以出现的顺序进行处理的,从左到右。
下列描述中,如果文件描述符被忽略,并且第一个重定向操作符是`<`,那么重定向指的是标准输入(文件描述符是`0`)。
如果重定向操作符的第一个字符是`>`,那么重定向指的是标准输出(文件描述符是`1`)。
下列描述中重定向操作符之后的词如果没有特殊说明都要经过brace expansion, tilde expansion, parameter expansion, command substitution, arithmetic expansion, quote removal, pathname expansion, 还有 word splitting。
如果扩展为多于一个词,`bash`将报错。
注意重定向的顺序非常重要。例如,命令
```bash
ls > dirlist 2>&1
```
将标准输出和标准错误重定向到文件`dirlist`,而命令
```bash
ls 2>&1 > dirlist
```
只会将标准输出重定向到文件`dirlist`,因为在标准输出被重定向到文件`dirlist`中之前,标准错误被复制为标准输出。
一些文件名在重定向中被`bash`特殊处理,如下表所示:
- `/dev/fd/<fd>`
如果`<fd>`是一个合法的整数,文件描述符`<fd>`将被复制。
- `/dev/stdin`
文件描述符`0`被复制。
- `/dev/stdout`
文件描述符`1`被复制。
- `/dev/stderr`
文件描述符`2`被复制。
- `/dev/tcp/<host>/<port>`
如果`<host>`是一个合法的主机名或`Internet`地址,并且`<port>`是一个整数端口号或服务名,`bash`试图建立与相应的套接字的`TCP`连接。
- `/dev/udp/<host>/<port>`
如果`<host>`是一个合法的主机名或`Internet`地址,并且`<port>`是一个整数端口号或服务名,`bash`试图建立与相应的套接字的`UDP`连接。
打开或创建文件错误将导致重定向出错。
重定向输入
-----------------
重定向输入(`Redirecting Input`)使得以`word`扩展结果为名的文件被打开并通过文件描述符`n`读取,如果没有指定`n`那么就作为标准输入(文件描述符为`0`)读取。
重定向输入的一般形式是:
```bash
[n]<word
```
重定向输出
---------------
重定向输出(`Redirecting Output`)使得以`word`扩展结果为名的文件被打开并通过文件描述符`n`写入,如果没有指定`n`那么就作为标准输出(文件描述符为`1`)写入。
重定向的一般形式是:
```bash
[n]>word
```
如果重定向操作符是`>`,并且启用了内建命令`set``noclobber`选项,那么如果`word`扩展后得到的文件名存在并且是一个普通的文件,重定向将失败。
如果重定向操作符是`>|`, 或者重定向操作符是`>`并且没有启用内建命令`set``noclobber`选项,那么即使`word`得出的文件名存在,也会尝试进行重定向。
追加式重定向输出(`Appending Redirected Output`)
---------------
这种方式的输出重定向使得以`word`扩展结果为名的文件被打开并通过文件描述符`n`从尾部添加。
如果没有指定`n`就使用标准输出(文件描述符`1`)。如果文件不存在,它将被创建。
重定向的一般形式是:
```bash
[n]>>word
```
Redirecting Standard Output and Standard Error
`bash`允许使用这种结构将标准输出和标准错误(文件描述符`1``2`) 重定向到以`word`扩展结果为名的文件中。
有两种重定向标准输出/标准错误的形式:
```bash
&>word
```
还有
```bash
>&word
```
两种形式中,推荐使用第一种。它与
```bash
>word 2>&1
```
在语义上等价。
Here Documents
---------------
这种重定向使得`shell`从当前源文件读取输入,直到遇到仅包含`word`的一行(并且没有尾部空白)为止。
直到这一点的所有行被用作 命令的标准输入。
`here-document`的格式是:
```bash
<<[-]word
here-document
delimiter
```
不会对`word`进行参数扩展、命令替换、算术扩展或者路径名扩展。
如果`word`中任何字符是引用的,`delimiter`将是对`word`进行引用删除的结果,`here-document`中的行不会被扩展。
如果`word`没有被引用,`here-documnet`中的所有行都要经过参数扩展、命令替换和算术扩展。
在后一种情况下,字符序列`\<newline>`被忽略;必须用`\`来引用字符`\``$``\``。
如果重定向操作符是`<<-`, 那么所有前导的`tab`字符都被从输入行和包含`delimiter`的行中删除。
这样使得`shell`脚本中的`here-document`可以被更好地缩进。
Here Strings
---------------
`here-document`的变种,形式是
```bash
<<<word
```
`word`被扩展,提供给命令作为标准输入。
复制文件描述符Duplicating File Descriptors
-------------------------
重定向操作符
```bash
[n]<&word
```
用于复制文件描述符。如果`word`扩展为一个或多个数字,`n`代表的文件描述符将成为那个文件描述符的复制。
如果`word`中的数字并未指定一个被用于读取的文件描述符,将产生一个重定向错误。
如果`word`扩展为`-`,文件描述符`n`将被关闭。
如果没有指定`n`,将使用标准输入(文件描述符`0`)。
类似的,操作符
```bash
[n]>&word
```
用于复制输出文件描述符。
如果没有指定`n`,将使用标准输出(文件描述符`1`)。
如果`word`中的数字并未指定一个被用于输出的文件描述符,将产生一个重定向错误。
特殊情况下,如果忽略了`n`,并且`word`并非扩展为一个或多个数字,标准输出和标准错误将被重定向,和前面描述的一样。
Moving File Descriptors
---------------------
重定向操作符
[n]<&digit-
将文件描述符`digit`移动为文件描述符`n`;如果没有指定`n`,则移动标准输入(文件描述符`0`
`digit`复制为`n`之后就被关闭了。
类似的,重定向操作符
```bash
[n]>&digit-
```
将文件描述符`digit`移动为文件描述符`n`,或标准输出(文件描述符`1`),如果没有指定`n`的话。
Opening File Descriptors for Reading and Writing
----------------------
重定向操作符
```bash
[n]<>word
```
使得以`word`扩展结果为名的文件被打开,通过文件描述符`n`进行读写。
如果没有指定`n`那么就使用文件描述符`0`。如果文件不存在,它将被创建。