shell重定向
shell重定向即重新确定数据的流向,是通过改变文件描述符目标来实现的,如流向1
的数据让其流向/tmp/a.c
。
shell中,基础重定向有以下几种方式:
[n]>file
:覆盖式输出重定向,输出到fd=n的数据改变流向输出到file文件中,file不存在则创建,file存在则先清空再写入数据- n可省略,默认值为
1
,即标准输出覆盖重定向到file中 >>
表示追加式输出重定向
- n可省略,默认值为
[n]<file
:输入重定向,以读取模式打开文件并分配fd=n,file不存在则报错- n可省略,默认值为0,即直接冲file中读数据
- 通常程序只是从0中都数据,所以当n不等于0时,需要多做一步
3<file <&3
cat
命令中经常使用到重定向,要明白cat file
和cat <file
的区别。cat命令会读取指定的文件然后输出到标准输出,如果没有指定,则从标准输入读取数字符,然后输出字符。cat file
是直接读取file这个文件中的内容,cat <file
是file文件被读取后内容重定向到标准输入,然后cat从标准输入读取到里面的数据,虽然结果都一样,但是里面的内容不一样。一个很经典的在shell脚本中创建配置文件的方式:
1 | cat <<EOF>a.c #这一行的EOF表示doc的起始符 |
这里需要解释一下,输入重定向是<
,除此之外,还有<<
与<<<
,我们一般也就用到<<
.<<
符号表示here doc。也就是说,它后面跟的是一篇文档,就像一个文件一样,只不过这个文件的内容是临时定义在<<
符号后面的。here doc常用语指定多行数据输入。
既然是文档,就有文档的起始符和终止符,这中间的内容全部是文档的内容,文档内容会被作为标准输入的数据读取。起始符和终止符可以随意定义,但是前后必须一致,一般用EOF
来表示。
<<<
表示here string,即后面跟的是字符串,注意
- 双引号包围的字符串shell会对其进行解释
- 单引号包围的字符串shell不会对其进行解释
在脚本中创建配置文件还可以使用tee
命令,tee从标准输入中读取数据,然后写到标准输出和0或多个文件中去。换言之,tee可以实现数据多重定向。实现如下:
1 | tee a.c <<EOF |