Bash重定向详解
Bash的重定向指的是将命令的输入和输出导向不同地方,而不是默认的标准输入、标准输出和标准错误。Bash的重定向实际上是对标准输入、标准输出和标准错误的重置,进而将所需输入和输出导向所需对象。
Bash中的特殊文件
Bash中有一些特殊文件和常规文件不同,有着特殊的含义或作用。在日常工作中,我们也经常会遇到这些文件。特殊文件的列表如下:
文件名 | 含义 |
---|---|
/dev/fd/fd | 若fd是有效的整数,则将会复制文件描述符fd |
/dev/stdin | 标准输入,复制文件描述符0 |
/dev/stdout | 标准输出,复制文件描述符1 |
/dev/stderr | 标准错误,复制文件描述符2 |
/dev/tcp/host/port | 通过TCP socket连接远程服务器 |
/dev/udp/host/port | 通过UDP socket连接远程服务器 |
/dev/null | 无任何影响的空文件 |
输入重定向
输入重定向指将输入文件描述符n,重定向至指定的文件,即从指定文件读取输入内容。一般形式为:
[n]<word
如果没有指定n的话,则默认为标准输入,即文件描述符0。一般情况下,不会指定n。
特别特别需要注意的是,标准输入和命令行参数不同,有些命令并不会从标准输入中读取输入,例如ls命令,这一点不能搞混。
Here Document形式输入重定向
Here Document的输入重定向格式如下:
[n]<<[-] delimiter documentdelimiter
Here Document格式同一般的文件形式没有什么本质区别,都是将输入重定向至不同数据对象中。
Here String形式输入重定向
Here String的输入重定向格式为:
[n]<<< word
作用同Here Document一样,只是表现形式不同。
输出重定向
输出重定向将输出文件描述符n,重定向指指定文件,即将输出写入指定文件。一般有两种格式,分别为:
- [n]>[|]word
- [n]>>word
上述两种格式中,若没有指定输出文件描述符,则默认为标准输入文件描述符1。第一种格式,若是word文件不存在,则新建该文件,如果已经存在的话,则会将原本内容清楚,从头开始写入内容。第二中格式,相对于第一种形式的区别在于,如果word文件是已经存在的话,后续写入的内容将会追加至原文件末尾。
重定向标准输出和标准错误
标准输出和标准错误重定向有两种形式,分别为:
- &>word
&word
一般情况下,更倾向于第一种格式,其等价于 >word 2>&1。
追加形式的标准输出和标准错误重定向
追加形式的标准输出和标准错误重定向格式基本跟非追加格式的一样,唯一区别在于将 > 改为 >> 。
- &>>word
&word
复制文件描述符
针对输入和输出,复制文件描述符有两种格式,分别为:
- [n]<&digit
- [n]>&digit
复制文件描述符表述的是将n和digit指向同一个文件,简单来说就是将同一个文件打开两次。在n未设置时,使用默认标准输入和标准输入。若digit为 - 时,则关闭n文件描述符指向的文件。
移动文件描述符
针对输入和输出,移动文件描述符有两种格式,分别为:
- [n]<&digit-
- [n]>&digit-
移动描述符的一般行为跟复制文件描述符基本相同,但也存在部分区别。以输出重定向为例,[n]>&digit-等价于[n]>&digit digit>&-。通过等价命令,可以明显的看出移动文件描述符会将digit文件描述符关闭,即在管道中后续相关文件描述符将不能使用了。