我对shell脚本很陌生,在学习的同时,我遇到了io重定向&文件描述符。我正在阅读本文件,在复制文件描述符()的主题下,我遇到了以下情况
n<&word 如果word中的数字没有指定为输入打开的文件描述符,则会发生重定向错误。
我想在我的pc上测试它,所以我运行了下面的简单脚本
#! /bin/bash
exec 8>'./file.txt'
exec 7<&8
echo 'This should not be printed' >&7
ls -l /proc/$$/fd
exec 7<&-
exec 8>&-当打开fd7以便从输出文件描述符输入时,我希望它在从fd8复制fd7时发出一个错误。fd7没有出现错误,而是打开了对同一个文件的写权限,fd8指向了这个文件,甚至将回显命令打印到文件上!
这是终端上的输出
total 0
lrwx------ 1 dhruv dhruv 64 Dec 16 12:58 0 -> /dev/pts/0
lrwx------ 1 dhruv dhruv 64 Dec 16 12:58 1 -> /dev/pts/0
lrwx------ 1 dhruv dhruv 64 Dec 16 12:58 2 -> /dev/pts/0
lr-x------ 1 dhruv dhruv 64 Dec 16 12:58 255 -> '/home/fileDescriptors.sh'
l-wx------ 1 dhruv dhruv 64 Dec 16 12:58 7 -> '/home/file.txt'
l-wx------ 1 dhruv dhruv 64 Dec 16 12:58 8 -> '/home/file.txt'这是file.txt
This should not be printed有人能帮我解决我所缺少的东西吗?也许在终点站或其他任何东西上都需要改变。
发布于 2021-12-16 11:26:10
它似乎没有像文档所说的那样检查描述符,它只是被盲目地复制。下面是使用lsof获取有关FDs的更多详细信息的脚本的一个变体:
#! /bin/bash
exec 8>'./file.txt'
echo "After opening for write on unit 8:"
lsof file.txt
exec 7<&8
echo "After copying to unit 7:"
lsof file.txt
echo 'This should not be printed' >&7
read -u7 # this should fail
exec 7<&-
exec 8>&-和结果(在bash v5.0.3下):
After opening for write on unit 8:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
t1 27615 pi 8w REG 179,2 0 3169 file.txt
After copying to unit 7:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
t1 27615 pi 7w REG 179,2 0 3169 file.txt
t1 27615 pi 8w REG 179,2 0 3169 file.txt
./t1: line 11: read: read error: 7: Bad file descriptor请注意,FD列列出了两个FDs的w (开放写入),而不是r (开放阅读)或u (两者都打开)。而且,正如您所看到的,file.txt是成功编写的。
正如@CharlesDuffy在评论中指出的那样,盲目复制的原因是3>&4和3<&4都是以完全相同的方式实现的,使用的是fdup2()调用,而不是open()调用。因此,副本保留与从had复制的描述符完全相同的标志,包括它是为读还是写打开的。
https://stackoverflow.com/questions/70375450
复制相似问题