重定向,文件描述符

一.标准文件描述符

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选项。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值