0%

shell重定向

shell重定向

shell重定向即重新确定数据的流向,是通过改变文件描述符目标来实现的,如流向1的数据让其流向/tmp/a.c

shell中,基础重定向有以下几种方式:

  • [n]>file:覆盖式输出重定向,输出到fd=n的数据改变流向输出到file文件中,file不存在则创建,file存在则先清空再写入数据

    • n可省略,默认值为1,即标准输出覆盖重定向到file中
    • >>表示追加式输出重定向
  • [n]<file:输入重定向,以读取模式打开文件并分配fd=n,file不存在则报错

    • n可省略,默认值为0,即直接冲file中读数据
    • 通常程序只是从0中都数据,所以当n不等于0时,需要多做一步3<file <&3

cat命令中经常使用到重定向,要明白cat filecat <file的区别。cat命令会读取指定的文件然后输出到标准输出,如果没有指定,则从标准输入读取数字符,然后输出字符。cat file是直接读取file这个文件中的内容,cat <file是file文件被读取后内容重定向到标准输入,然后cat从标准输入读取到里面的数据,虽然结果都一样,但是里面的内容不一样。一个很经典的在shell脚本中创建配置文件的方式:

1
2
3
4
cat <<EOF>a.c           #这一行的EOF表示doc的起始符
zhw
wan
EOF #这一行的doc表示doc的终止符,前后必须一致

这里需要解释一下,输入重定向是<,除此之外,还有<<<<<,我们一般也就用到<<.
<<符号表示here doc。也就是说,它后面跟的是一篇文档,就像一个文件一样,只不过这个文件的内容是临时定义在<<符号后面的。here doc常用语指定多行数据输入。
既然是文档,就有文档的起始符和终止符,这中间的内容全部是文档的内容,文档内容会被作为标准输入的数据读取。起始符和终止符可以随意定义,但是前后必须一致,一般用EOF来表示。

<<<表示here string,即后面跟的是字符串,注意

  • 双引号包围的字符串shell会对其进行解释
  • 单引号包围的字符串shell不会对其进行解释

在脚本中创建配置文件还可以使用tee命令,tee从标准输入中读取数据,然后写到标准输出和0或多个文件中去。换言之,tee可以实现数据多重定向。实现如下:

1
2
3
4
tee a.c <<EOF
zhw
wan
EOF