Answers:
您可以使用<&-
和来关闭文件描述符>&-
,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);
<>
文件描述符。
3>&-
或3<&-
似乎关闭了描述符。
<>
可以通过相同的方式完成关闭。
据我所看到的,exec 3>&-
并且exec 3<&-
是相同的,可以在任何文件描述符可以使用,不管它是如何打开。根据Shell命令语言的POSIX定义的第2.7.6和2.7.5节:
2.7.5复制输入文件描述符
重定向运算符:
[n] <&word
[... SNIP ...]
如果word评估为'-',则文件描述符n或未指定n的标准输入应关闭。尝试关闭未打开的文件描述符不会构成错误。如果单词评估为其他内容,则行为是不确定的。
2.7.6复制输出文件描述符
重定向运算符:
[n]>&word
[... SNIP ...]
如果word求值为'-',则关闭文件描述符n,如果未指定n,则关闭标准输出。尝试关闭未打开的文件描述符不会构成错误。如果单词评估为其他内容,则行为是不确定的。
请注意,它们都未指定有关文件描述符n最初如何打开方式的任何信息。这符合以下事实:close(2)并不关心您如何打开文件。
快速浏览以下内容:
exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4<&-
与此:
exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4>&-
表明在两种情况下,Bash都做同样的事情。
两个有趣的事实
[n]>&-
关闭文件描述符。在用于处理重定向的Bash代码(redir.c)中,您可以找到以下代码:
738 /* XXX - what to do with [N]<&$w- where w is unset or null? ksh93
739 closes N. */
[N]>&WORD
:.savannah.gnu.org / cgit / bash.git / tree / doc /…
cuonglm了解关闭“ <>” FD的示例。
这是从http://tldp.org/LDP/abs/html/io-redirection.html的《高级Bash脚本指南》中引用的。
[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.
>&-
和<&-
是未指定时的默认FD(>&-
是1>&-
同时<&-
被0<&-
)。与未提供时x>&y
相同,x<&y
相同x
。