linux错误输出文件描述符,shell编程,重定向错误信息和正常输出的数据,输出输入文件描述符...

Linux的标准文件描述符:文件描述符缩写描述

0STDIN(standard input)标准输入

1STDOUT(standard output)标准输出

2STDOUT(standard error output)标准错误输出

那个数字就是文件描述符,一共有9个从0到8,用来唯一标识会话中打开的文件。

重定向错误和数据:

1>        重定向正常输出

2>        重定向错误输出

&>       同时重定向数据和错误,错误信息的优先级会更高

临时重定向:

>&2        临时设置错误重定向信息

例:

echo "This is an error message"   >&2

echo "This is normal message"

./demo.sh  2>  error.log        在运行脚本时设置的错误信息会输出到error.log中

永久重定向:

exec  1> normal.log        将正常输出重定向到normal.log文件中

exec  2> error.log           将错误输出重定向到error.log文件中

例1:

exec 1> normal.log

echo  "This a noraml messag"

运行脚本后文件信息会被输出到normal.log文件中

例2:

exec 2> normal.log

echo "This a normal message"

注意:运行脚本后文件信息会被显示在屏幕上

例3:

exec  2>  error.log

echo  "message one"

exec  1>  normal.log

echo  "message  two"

echo  "message there" >&2

输出的one部分会被输出,two部分会被重定向到normal.log中,there部分会被重定向到error.log中

输入重定向:

0

例:

exec  0

while  read  line

do

echo $line

done

创建输出文件描述符:

exec  3>  demo.txt        3就是一个自己创建的文件描述符

例:

exec  3>  demo.txt

echo "This  is message" >&3        #这条消息会被重定向到自定义的文件描述符3

echo "This is infomation"

重定向文件描述符:

临时重定向输出,然后恢复默认输出的设置方法:

exec  3>&1        自定义的文件描述符3被重定向到了1,此时的1表示显示器。在这之后3的内容就会显示在屏幕上了

exec  1> demo.txt    文件描述符1代表了显示器,1被定向到了文件。在这之后屏幕上的内容就被定向到了文件

exec  1>&3        此时1指向文件,3指向显示器,1被定向到了3,所以1又指回了显示器。在这之后屏幕上的内容就到了文件描述符3,但是3是指向1的,也就是屏幕,所以有显示又到屏幕上了。

例:

exec  3>&1        #1代表标准输出,这时的标准输出是屏幕,3定向到了屏幕,所以3代表了屏幕

exec  1>demo.txt    #1代表标准输出,将1定向到文件,此时的标准输出是文件

echo  "This message for demo.txt"

exec  1>&3        #1代表标准输出,此时3代表屏幕,1定向到了3,所以此时的1代表屏幕

输入文件描述符:

exec  6

exec  0< demo.txt    文件定向到0,此时标准输入是文件

exec  0

例:

exec 6

exec 0

while read line

do

echo $line

done

exec 0

read -p "Input something" var

echo $var

创建读写文件描述符:

例:

exec  3<> demo.txt        #创建读写文件描述符

read  line 

echo $line

echo "white something" >&3        #临时重定向到3

注意:使用时要注意指针位置,例子中先是读取了文件中的一行,此时指针在第二行,这时又向文件中写入了一行,新的文本将会覆盖旧的文本。

关闭文件描述符:

exec  3>&-        关闭文件描述符3。文件描述符一但关闭再向里面写入数据就会报错。如果再次打开同一个输出文件shell会用新文件替换已有的文件。

例:

exec  3> demo.txt

echo  "some infomation" >&3

exec  3>&-        #关闭文件描述符

exec  3>demo.txt        #再次打开

echo  "This is a message" >&3        #shell会用新文件替换demo.txt

列出打开的文件描述符:

lsof        列出整个Linux系统打开的所有文件描述符,此命令一般在/usr/sbin/lsof,如果没有用yum安装即可

-p    指定进程ID(PID)

-d    指定要显示的文件描述符编号

-a    对其他两个结果进行布尔and运算

例:lsof  -a  -p  $$  -d  0,1,2        $$是特殊环境变量,表示当前的进程号PID

在脚本中列出文件描述符

例:

exec 3> demo.txt

exec 4> test.txt

exec 5< test1.txt

/usr/sbin/lsof -a -p $$ -d 0,1,2,3,4,5

输出如下:

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME

demo1.sh 1706 root    0u   CHR  136,0      0t0      3 /dev/pts/0

demo1.sh 1706 root    1u   CHR  136,0      0t0      3 /dev/pts/0

demo1.sh 1706 root    2u   CHR  136,0      0t0      3 /dev/pts/0

demo1.sh 1706 root    3w   REG    8,5        0 270981 /root/bin/demo.txt

demo1.sh 1706 root    4w   REG    8,5        0 270980 /root/bin/test.txt

demo1.sh 1706 root    5r   REG    8,5        0 270997 /root/bin/test1.txt

阻止命令输出:

/dev/null        重定向到该位置的任何数据都会被丢掉

ls  -al  >  /dev/null

ls  -al  test1  test2  2>  /dev/null

cat  /dev/null  >  error.log        可以用它来清除日志文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值