LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 181|回复: 0

指定用于输入的文件描述符

[复制链接]
发表于 2024-1-3 16:25:02 | 显示全部楼层 |阅读模式

指定用于输入的文件描述符

给一个输入文件指定一个文件描述符的语法如下:

exec n< file

其中n就是文件描述符,如果不指定,则表示标准输入(0),上述的输入重定向会在文件描述符n上打开一个用于读取的文件file

<&也是一种重定向操作符,用于复制文件描述符,语法如下:

n <&word

如果word是一个数字,则用n表示的文件描述符被作为文件描述符word的副本,如果数字word指定的文件描述符没有打开以用于读取,则会发生重定向错误。如果没有指定n,则默认为标准输入。

比如下面两个命令:


exec 3< /etc/passwd
grep test <& 3
上述grep命令是将文件描述符3复制到了标准输入,而文件/etc/passwd又是在文件描述符3上打开以用于被命令读取,因此grep命令读取的实际是文件描述符3的内容。

指定用于输出的文件描述符
给一个输出文件指定一个文件描述符的语法如下:

exec n> file

其中n就是文件描述符,如果不指定,则表示标准输出(1),上述的输出重定向会在文件描述符n上打开一个用于写入的文件file,如果不存在则会创建,如果存在,则会清空后写入。

复制输出文件描述符的语法如下:

n >&word

关闭文件描述符
上面已经涉及到了,语法如下:

n <&-或n>&-

比如关闭标准输入就是<&-,关闭标准错误就是2>&-

打开用于读和写的文件描述符
如下语法可以在文件描述符上打开一个既可读取又可以写入的文件

exec n<>file

其中n就是文件描述符,如果不指定,则表示标准输入,如果file不存在,则会被创建,符号<>用于打开一个可读写的文件。这个语法常用于更新文件,如下

还是我们刚才的文件at.txt其内容如下:


1 2 3 4 5
6 7 8 9 0
a b c d e

接下来执行下面一系列命令

#在文件描述符4上打开用于读写的文件at.txt
[root@test ~]# exec 4<> at.txt
#从文件描述符4读取前三个字符
[root@test ~]# read -n 3 var <& 4
[root@test ~]# echo $var
1 2
#向文件写入内容(一个+号)
[root@test ~]# echo -n + >& 4
#关闭文件描述符4
[root@test ~]# exec 4>&-
[root@test ~]# cat at.txt
1 2+3 4 5
6 7 8 9 0
a b c d e
我们看到+号写在了2和3之间,这是因为我们先用read命令读取了前3个字符,而操作符<>会使后面的读写操作跟随先前读写操作的位置,所以会写在23之间。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表