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 |