首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重定向到函数内部指定的文件描述符buggy

问重定向到函数内部指定的文件描述符buggy
EN

Unix & Linux用户
提问于 2019-04-28 15:19:56
回答 1查看 288关注 0票数 2

Bash有一个特性,它将为您选择一个文件描述符号,并将其分配给一个变量。

代码语言:javascript
复制
$ exec {fd}>foo.txt
$ echo "$fd"
11
$ echo "bar" >&$fd
$ cat foo.txt
bar

这个特性在bash4.4中运行得很好,但是当我在函数中使用bash4.2时,我遇到了一个障碍。下面是一个简单的演示:

代码语言:javascript
复制
$ bash --version | head -1
GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu)
$ (func() { echo 1>&$fd; }; type func)
func is a function
func () 
{ 
    echo &>$fd
}
$ (func() { echo 2>&$fd; }; type func)
func is a function
func () 
{ 
    echo 2>&$fd
}

注意,在第一个测试中,1>&$fd变成了&>$fd。如果$fd是11,而不是重定向到fd 11,它将重定向到一个名为11的文件。然而,它只是与stdout。如第二个测试所示,stderr没有这个bug。

bash 4.4也没有:

代码语言:javascript
复制
$ bash --version | head -1
GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)
$ (func() { echo 1>&$fd; }; type func)
func is a function
func () 
{ 
    echo 1>&$fd
}

看起来这是一个被修复的bug。这是真的吗?更重要的是,你能提出解决办法吗?

EN

回答 1

Unix & Linux用户

发布于 2019-04-28 15:19:56

作为解决办法,将>&更改为1<&。它在保持所需行为的同时避免了错误。无论fds是打开读还是写,复制它们都不重要。dup2()不在乎。

代码语言:javascript
复制
$ bash --version | head -1
GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu)
$ (func() { echo 1<&$fd; }; type func)
func is a function
func () 
{ 
    echo 1<&$fd
}
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/516005

复制
相关文章

相似问题

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