【问题标题】:sh: How do I avoid clobbering numbered file descriptors?sh:如何避免破坏编号的文件描述符?
【发布时间】:2011-09-26 03:53:43
【问题描述】:
当我有
exec 3>>file # file descriptor 3 now points to file
[ $dryrun ] && exec 3>&1 # or possibly to stdout
echo "running">&3
exec 3>&- # and is now closed
我担心文件描述符 3 可能指向相关函数之外的内容。我该如何处理?
- 有内置的
next_available_fd吗?
- 有没有办法将 fd3 复制到一个变量中,然后在函数完成后将其复制回来?
- 在这种情况下,我应该担心线程和并发写入 fd3 吗?
- 我在 sh,但也许 bash/ksh/zsh 对此有答案?
【问题讨论】:
标签:
shell
unix
redirect
sh
file-descriptor
【解决方案1】:
除了使用 exec 来重定向函数内的文件描述符,您可以(使用 bash,我没有尝试使用其他 shell)这样做:
富(){
测试 $dryrun && 执行 3>&1
回声运行>&3
} 3>>文件
富
更多命令
在此设置中,“运行”将转到文件或原始标准输出,具体取决于 $dryrun,而 more_commands 的 fd 3 将与调用 foo 之前一样。
【解决方案2】:
我不知道像next_available_fd 这样简单的东西,但是要获得你想要的功能(临时重定向文件描述符而不影响它在函数之外)可以在 bash 中完成如下(我不了解 sh):
exec 3>file3
exec 1>file1
echo "something">&3
echo "something else"
f31 () {
echo "something">&3
}
f31 3>&1
f13 () {
echo "something else"
}
f13 >&3
echo "something">&3
echo "something else"
生成的file1:
something else
something
something else
还有file3:
something
something else
something
这表明在每种情况下重定向都仅限于函数调用。
【解决方案3】:
如果您的系统使用/proc 文件系统,请查看/proc/$$/fd 内部以查看正在使用的内容。