关闭文件描述符,>&- 与

关闭文件描述符,>&- 与

在我正在阅读的bash教程中,它说如果你打开一个文件描述符进行读取,即

exec 3< echolist

然后你必须像这样关闭它,

exec 3<&-

但是,如果打开文件描述符进行写入,则必须像这样关闭它:

exec 3>&-

然而,当我在互联网上查看时,我看到人们打开文件然后用以下命令关闭它们:

exec 3>&- 

笔记:根据教程,他们何时应该使用exec 3<&1.

exec n>&-所以我的问题是,是否可以通过其中 n 是文件描述符编号来关闭所有文件描述符?不管它是为了阅读、写作还是两者而打开?

答案1

<&-您可以使用和关闭文件描述符>&-bash将解析两种语法相同。

从文件y.tab.cbash源代码中:

5385   /* Hack <&- (close stdin) case.  Also <&N- (dup and close). */                
5386   if MBTEST(character == '-' && (last_read_token == LESS_AND || last_read_token == GREATER_AND))
5387     return (character);

答案2

据我所知,exec 3>&-exec 3<&-是相同的,可以在任何文件描述符上使用,无论它是如何打开的。根据 POSIX 定义的第 2.7.6 和 2.7.5 节外壳命令语言:

2.7.5 复制输入文件描述符

重定向运算符:

[n]<&字

[...剪...]

如果 word 的计算结果为“-”,则文件描述符 n 或标准输入(如果未指定 n)应关闭。尝试关闭未打开的文件描述符不应构成错误。如果 word 的计算结果为其他内容,则行为未指定。

2.7.6 复制输出文件描述符

重定向运算符:

[n]>&词

[...剪...]

如果 word 的计算结果为“-”,则关闭文件描述符 n 或标准输出(如果未指定 n)。尝试关闭未打开的文件描述符不应构成错误。如果 word 的计算结果为其他内容,则行为未指定。

请注意,两者都没有指定有关文件描述符 n 最初如何打开的任何内容。这符合以下事实:关闭(2)不关心你如何打开文件。

快速追踪以下内容:

exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4<&-

与此相比:

exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4>&-

表明在这两种情况下,Bash 执行完全相同的操作。

两个有点有趣的事实

  • bash 手册页有关复制文件描述符的部分没有提到[n]>&-关闭文件描述符。
  • 在处理重定向的 Bash 代码 (redir.c) 中,您可以找到以下内容:

    738      /* XXX - what to do with [N]<&$w- where w is unset or null?  ksh93
    739               closes N. */
    

答案3

cuonglm 理解关闭 '<>' FD 的一个例子。

这是从《高级 Bash 脚本指南》中引用的http://tldp.org/LDP/abs/html/io-redirection.html

[j]<>filename
  #  Open file "filename" for reading and writing,
  #+ and assign file descriptor "j" to it.
  #  If "filename" does not exist, create it.
  #  If file descriptor "j" is not specified, default to fd 0, stdin.
  #
  #  An application of this is writing at a specified place in a file. 
  echo 1234567890 > File    # Write string to "File".
  exec 3<> File             # Open "File" and assign fd 3 to it.
  read -n 4 <&3             # Read only 4 characters.
  echo -n . >&3             # Write a decimal point there.
  exec 3>&-                 # Close fd 3.
  cat File                  # ==> 1234.67890
  #  Random access, by golly.

相关内容