【问题标题】: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 内部以查看正在使用的内容。

      【讨论】:

        猜你喜欢
        • 2011-03-26
        • 1970-01-01
        • 2010-11-10
        • 2020-02-29
        • 1970-01-01
        • 2010-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多