标准输入输出与文件的重定向
当我们在shell中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件。
文件描述符
Linux系统将所有设备都当作文件来处理,而Linux用文件描述符来标识每个文件对象。其实我们可以想象我们电脑的显示器和键盘在Linux系统中都被看作是文件,而它们都有相应的文件描述符与之对应。
标准的输入,输出以及错误
文件 | 标准 | 文件描述符 | 省缺 |
---|---|---|---|
输入文件 | 标准输入 | 0 | 键盘,文件,其他命令的输出 |
输出文件 | 标准输出 | 1 | 屏幕,文件 |
错误输出文件 | 标准错误 | 2 | 屏幕,文件 |
系统中有12个文件描述符可以任意使用的是3到9
文件的重定向
在执行命令时,可以指定命令的标准输入、输出和错误,要实现这一点就需要使用文件重定向。
命令 | 功能 |
---|---|
command > filename | 把标准输出重定向到一个新文件中 |
command >> filename | 把标准输出重定向到一个文件中 (追加) |
command 1 > fielname | 把标准输出重定向到一个文件中 |
command > filename 2>&1 | 把标准输出和标准错误一起重定向到一个文件中 |
command 2 > filename | 把标准错误重定向到一个文件中 |
command 2 >> filename | 把标准输出重定向到一个文件中 (追加) |
command >> filename 2>&1 | 把标准输出和标准错误一起重定向到一个文件中 (追加) |
command < filename >filename2 | command命令以filename文件作为标准输入,以filename2文件作为标准输出 |
command < filename | command命令以filename文件作为标准输入 |
command << delimiter | 从标准输入中读入,直至遇到delimiter分界符 |
command <&m | 把文件描述符 m作为标准输入 |
command >&m | 把标准输出重定向到文件描述符 m中 |
command <&- | 关闭标准输入 |
输入重定向
#!/bin/sh
exec 4<&0 0<stock.txt
read line1
read line2
exec 0<&4 # 描述符0重新指向输入文件
echo $line1
echo $line2
输出重定向
#!/bin/sh
exec 3>&1
exec 1>test
echo "hello" #这句话被存到test文件中
exec 1>&3
echo "hello again!" #这句话输出到显示器