Bash有一个特性,它将为您选择一个文件描述符号,并将其分配给一个变量。
$ exec {fd}>foo.txt
$ echo "$fd"
11
$ echo "bar" >&$fd
$ cat foo.txt
bar这个特性在bash4.4中运行得很好,但是当我在函数中使用bash4.2时,我遇到了一个障碍。下面是一个简单的演示:
$ 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也没有:
$ 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。这是真的吗?更重要的是,你能提出解决办法吗?
发布于 2019-04-28 15:19:56
作为解决办法,将>&更改为1<&。它在保持所需行为的同时避免了错误。无论fds是打开读还是写,复制它们都不重要。dup2()不在乎。
$ 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
}https://unix.stackexchange.com/questions/516005
复制相似问题