![关闭文件描述符,>&- 与](https://linux22.com/image/36694/%E5%85%B3%E9%97%AD%E6%96%87%E4%BB%B6%E6%8F%8F%E8%BF%B0%E7%AC%A6%EF%BC%8C%3E%26-%20%E4%B8%8E%20.png)
在我正在阅读的bash教程中,它说如果你打开一个文件描述符进行读取,即
exec 3< echolist
然后你必须像这样关闭它,
exec 3<&-
但是,如果打开文件描述符进行写入,则必须像这样关闭它:
exec 3>&-
然而,当我在互联网上查看时,我看到人们打开文件然后用以下命令关闭它们:
exec 3>&-
笔记:根据教程,他们何时应该使用exec 3<&1
.
exec n>&-
所以我的问题是,是否可以通过其中 n 是文件描述符编号来关闭所有文件描述符?不管它是为了阅读、写作还是两者而打开?
答案1
<&-
您可以使用和关闭文件描述符>&-
,bash
将解析两种语法相同。
从文件y.tab.c在bash
源代码中:
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.