首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在尝试从输出文件描述符重定向输入文件描述符时未获得预期错误

在尝试从输出文件描述符重定向输入文件描述符时未获得预期错误
EN

Stack Overflow用户
提问于 2021-12-16 07:44:44
回答 1查看 211关注 0票数 0

我对shell脚本很陌生,在学习的同时,我遇到了io重定向&文件描述符。我正在阅读本文件,在复制文件描述符()的主题下,我遇到了以下情况

n<&word 如果word中的数字没有指定为输入打开的文件描述符,则会发生重定向错误。

我想在我的pc上测试它,所以我运行了下面的简单脚本

代码语言:javascript
复制
#! /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指向了这个文件,甚至将回显命令打印到文件上!

这是终端上的输出

代码语言:javascript
复制
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

代码语言:javascript
复制
This should not be printed

有人能帮我解决我所缺少的东西吗?也许在终点站或其他任何东西上都需要改变。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-16 11:26:10

它似乎没有像文档所说的那样检查描述符,它只是被盲目地复制。下面是使用lsof获取有关FDs的更多详细信息的脚本的一个变体:

代码语言:javascript
复制
#! /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下):

代码语言:javascript
复制
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>&43<&4都是以完全相同的方式实现的,使用的是fdup2()调用,而不是open()调用。因此,副本保留与从had复制的描述符完全相同的标志,包括它是为读还是写打开的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70375450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档