如何避免覆盖已编号的文件描述符?

7

当我拥有

  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有答案?
3个回答

1

我不知道有什么像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

这表明在每种情况下,重定向仅限于函数调用。

抱歉,您的示例代码中哪一部分展示了什么? - nodakai

1

不必使用exec在函数内部重定向文件描述符,你可以(使用bash,我没有尝试过其他shell)这样做:

foo() {
  test $dryrun && exec 3>&1
  echo running >&3
} 3>>file

foo
more_commands

在这种设置中,“running”将根据$dryrun的值被发送到文件或原始stdout,并且more_commands将像foo被调用之前一样具有fd 3。


0
如果您的系统使用了 /proc 文件系统,可以查看 /proc/$$/fd 目录以查看哪些正在被使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接