shell脚本中文件描述符

shell脚本中文件描述符
文件描述符特征
  1. 文件描述符是一个非负整数,内核需要通过这个文件描述符才可以访问文件
  2. 当在系统中打开已有的文件或者新建文件时,内核每次都会给特定的进程返回一个文件描述符,进程需要对文件进行读或写操作时,都要依赖这个文件描述符
  3. 文件描述符就像一个索引,指向系统中对应的文件
  4. 内核默认为每个进程创建3个标准的文件描述符,分别为0标准输入、1标准输出、2标准错误
  5. 文件描述符中还包含有很多文件相关的信息,如权限、文件偏移量等。使用文件描述符读写文件要注意文件偏移量指针的变化情况
查看文件描述符
#通过查看/proc/进程pid/fd/目录下的文件可以查看到对应进程拥有的所有文件描述符
[root@mao_aliyunserver bin]# pgrep -f 'top'
14963
[root@mao_aliyunserver bin]# ll /proc/14963/fd
total 0
lrwx------ 1 root root 64 Feb 10 23:04 0 -> /dev/pts/3
lrwx------ 1 root root 64 Feb 10 23:04 1 -> /dev/pts/3
l-wx------ 1 root root 64 Feb 10 23:04 2 -> /dev/null
lrwx------ 1 root root 64 Feb 10 23:04 3 -> /dev/pts/3
lr-x------ 1 root root 64 Feb 10 23:04 4 -> /proc/stat
lr-x------ 1 root root 64 Feb 10 23:04 5 -> /proc/uptime
lr-x------ 1 root root 64 Feb 10 23:04 6 -> /proc/meminfo
lr-x------ 1 root root 64 Feb 10 23:04 7 -> /proc/loadavg
创建和关闭文件描述符
#创建文件描述符: exec 文件描述符<>文件名 (<>表示可读写,<可读 >可写,注意<>两边不能有空格)
#创建文件描述符时,如果描述符对应的文件不存在,系统会自动创建一个新的空文件
[root@mao_aliyunserver bin]# touch mao.txt
[root@mao_aliyunserver bin]# exec 5<>mao.txt 
[root@mao_aliyunserver bin]# echo "我爱你中国" >&5
[root@mao_aliyunserver bin]# echo "亲爱的母亲" >&5
[root@mao_aliyunserver bin]# cat mao.txt 
我爱你中国
亲爱的母亲
#关闭文件描述符: exec 文件描述符<&- 或 exec 文件描述符>&-
[root@mao_aliyunserver bin]# exec 5>&-
[root@mao_aliyunserver bin]# echo "亲爱的母亲" >&5
-bash: 5: Bad file descriptor