一.标准文件描述符
1.linux用文件描述符来标识每个文件对象,文件描述符是一个非负整数,可以唯一地标识会话中打开的文件,每个过程一次最多可以有9个文件描述符;
2.0=>STDIN=>标准输入;1=>STDOUT=>标准输出;2=>STDERR=>标准错误;
3.STDIN:STDIN文件描述符代表shell的标准输入,对终端界面来说,标准输入是键盘,在使用输入重定向时(<),linux会用重定向指定的文件来替换标准输入文件描述符,它会读取文件并提取数据,如同它是在键盘上输入的;
4.STDOUT:STDOUT文件描述符代表标准的shell输出,在终端界面上,标准输出就是终端显示器,shell的所有输出会被重定向到标准输出中,也就是显示器,在使用输出重定向(>)时,linux会用重定向指定的文件来替换标准输出文件描述符,>>表示追加到文件;
5.STDERR:STDERR文件描述符代表shell的标准错误输出,默认情况下,STDERR文件描述符会和STDOUT文件描述符指向同样的地方,即:错误消息也会输出到显示器输出中,使用2>file,可以只将错误消息输出至文件file中,使用&>file可将标准输出和错误消息都重定向至文件file;
二.重定向
1.临时重定向
当需要生成错误消息时,可以将单独的一行输出重定向到STDERR:
#!/bin/bash
echo “this is an error” >&2
./test 2>file运行以上脚本时,echo结果将重定向至file;
2.永久重定向
如果脚本中有大量数据需要重定向,可以用exec命令告诉shell在脚本执行期间重定向某个特定文件描述符:
#!/bin/bash
exec 1>file
echo "this is the output"
./test运行以上脚本时,exec命令会启动一个新的shell并将STDOUT文件描述符重定向到文件file;
3.输入重定向
exec 0<file:
这个命令会告诉shell它应该从文件file中获取输入,而不是STDIN;
三.创建重定向
1.创建输出文件描述符
#!/bin/bash
exec 3>file
echo "this is the output" >&3
其实和使用标准文件描述符没区别;
2.重定向文件描述符
#!/bin/bash
exec 3>&1 //将文件描述符3重定向至1,即:任何发送给文件描述符3的内容都将输出至终端显示器
exec 1>file //将发送至文件描述符1的内容重定向至文件
echo "this should store in the file"
exec 1>&3 //将此时的STDOUT重定向至文件描述符3,而3指向的是终端显示器,即:此时正常输出至显示器
echo "this is the normal output"
可用于临时重定向
3.重定向输入文件描述符
#!/bin/bash
exec 6<&0 //文件描述符6用来保存STDIN的位置
exec 0<file
...
exec 0<&6 //读取完成后,将STDIN恢复到原来的位置
4.创建读写文件描述符
打开单个文件描述符来作为输入和输出,可以用同一个文件描述符从文件中读取数据,并将数据写入同一个文件;
exec <>file
5.关闭文件描述符
如果创建了新的输入或输出文件描述符,shell会在脚本退出时自动关闭它们;
exec 3>&-
关闭了文件描述符后,如果打开了同一个输出文件,shell会用一个新文件来覆盖原有文件;
6.列出打开的文件描述符
/usr/binlsof -a -p $$ -d 0,1,2:
该命令输出如下:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 32011 root 0u CHR 136,1 0t0 4 /dev/pts/1
bash 32011 root 1u CHR 136,1 0t0 4 /dev/pts/1
bash 32011 root 2u CHR 136,1 0t0 4 /dev/pts/1
COMMAND:正在运行的命令名的前9个字符;
PID:进程PID;
USER:进程属主的登录名;
FD:文件描述符以及访问类型(u表示读写,r代表读,w代表写);
TYPE:文件类型(CHAR代表字符型,BLK代表块型,DIR代表目录,REG代表常规文件);
DEVICE:设备号;
SIZE:文件大小;
NODE:本地文件节点数;
NAME:文件名。
7.同时输出至显示器和屏幕
tee命令
echo “output to file and screen” | tee file
如果需要向file追加内容,添加-a选项。