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<  demo.txt

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<&0        0给了6,0表示键盘,此时6表示标准输入键盘

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

exec  0<&6        标准输入0是文件,文件描述符6是键盘,6给了0,键盘取代了文件

例:

exec 6<&0

exec 0<demo.txt

while read line

do

        echo $line

done

exec 0<&6

read -p "Input something" var

echo $var


创建读写文件描述符:

例:

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

read  line  <&3        #指定标准输入为文件描述符3

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        可以用它来清除日志文件