介绍

文件描述符是与文件输入、输出相关联的整数,在编写脚本时会经常使用标准的文件描述符来将内容重定向输出,0、1、2是文件描述符(分别对应stdin、stdout、stderr),< 、>, >>叫做操作符。

 

概念

stdin(0):标准输入,这个概念有点不太容易理解比如:1.使用<从文件中读取内容,2.当前命令将内容通过管道传输给下一个命令而下一个命令,而实际内容是传输给了stdin所以下一个命令也是从stdin中读取内容。

stdout(1):标准输出;这是默认选项。使用方法:1>等价于>  或者 1>>等价于>>,;如果想使用其它文件描述符,必须将文件描述符放在操作符之前。

stderr(2):标准错误,使用方法2>或者2>>,标准错误可以将错误信息插入到文件而不在终端显示  。

<:从文件中读取内容。

>:将内容插入到文件,每次插入前都会清空文件内容。

>>:将内容插入到文件, 将内容追加到现有文件的末尾。

 

实例

 生成测试数据

echo "hello word" > test1

cp test1 test2

chmod 000 test2

stdin(0)

1.从文本中读取内容

cat <test1

linux systemd 文件描述符不够 linux 错误的文件描述符_重定向

2.将读取到的内容通过管道传输给下一个命令

cat test1 |tr -t 'a-z' 'A-Z' >test1.new

linux systemd 文件描述符不够 linux 错误的文件描述符_自定义_02

stdin(1) 

将内容重定向到文件

echo "this is stdout 1" >std1

linux systemd 文件描述符不够 linux 错误的文件描述符_自定义_03

追加内容到文件

linux systemd 文件描述符不够 linux 错误的文件描述符_文件描述符_04

 

stderr(2)

遇到报错的时候终端会显示错误,可以将将错误信息写入文件不让终端显示

linux systemd 文件描述符不够 linux 错误的文件描述符_自定义_05

linux systemd 文件描述符不够 linux 错误的文件描述符_文件描述符_06

同时将stderr和stdout信息都插入到文件,使用&

linux systemd 文件描述符不够 linux 错误的文件描述符_自定义_07

 

将错误信息定向标准输出

echo "name" 2>&1 >> a
或者
echo "name" >> a 2>&1

 

重定向脚本内部文本块,cat <<EOF>>log.txt EOF

 

自定义文件描述符

自定义文件描述符也需要用到exec;< ,>,>>意思和前面解释的一样,当调用自定义的描述符时需要在自定义的描述符前加上&。

1.自定义stdin,将3定义为stdin从文件中读取内容,然后就可以调用3了,调用3和直接调用文件结果是一样的,有点类似赋值。

exec 3<test1

linux systemd 文件描述符不够 linux 错误的文件描述符_重定向_08

2.自定义stdout,测试结果发现在自定义描述符中使用>往文件中重复写数据并不会清空之前的内容,但是在标准的描述符中是会清空再写入的。

linux systemd 文件描述符不够 linux 错误的文件描述符_文件描述符_09

linux systemd 文件描述符不够 linux 错误的文件描述符_自定义_10

总结

 文件描述符在脚本中使用的非常频繁,常用的使用方法就是标准输出和标准错误。