sh:我如何避免破坏编号的文件描述符?

时间:2011-06-30 16:45:18

标签: shell unix redirect sh file-descriptor

当我有

  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吗?
  • 我在嘘,但也许bash / ksh / zsh有答案吗?

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:1)

而不是使用exec重定向函数中的文件描述符,你可以(使用bash,我没有尝试过其他shell):

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

foo
more_commands

在此设置中,“running”将根据$ dryrun转到文件或原始stdout,而more_commands将具有fd 3,就像调用foo之前一样。

答案 2 :(得分:0)

如果您的系统使用/proc文件系统,请查看/proc/$$/fd内部以查看正在使用的内容。