c-u*_*hin 7 c unix linux bash file-descriptor
我的理解是,当使用 open() 打开新文件时,无法控制操作系统分配的文件描述符(整数)。那么如何在 bash shell 中使用类似的命令分配特定的文件描述符
exec 5>&1
Run Code Online (Sandbox Code Playgroud)
(我想我可以通过阅读 bash 源代码找到...)
我相信你是对的,有时文件描述符可能已经在使用中。我从http://tldp.org/LDP/abs/html/io-redirection.html#FTN.AEN17716得到这个
“使用文件描述符 5 可能会导致问题。当 Bash 创建子进程时,与 exec 一样,子进程会继承 fd 5(请参阅 Chet Ramey 的存档电子邮件,主题:回复:文件描述符 5 保持打开状态)。最好保留此特定值单独FD。”
bash 手册第 3.6 节第 2 段指定了解决方案。
每个重定向前面可能带有文件描述符编号,但前面可能带有以下形式的单词
{varname}。在这种情况下,对于除 >&- 和 <&- 之外的每个重定向运算符,shell 都会分配一个大于 10 的文件描述符并将其分配给 {varname}。如果 >&- 或 <&- 前面有 {varname},则 varname 的值定义要关闭的文件描述符。
例如
#!/bin/bash
exec {NEW_STDOUT}>&1
echo "Hello" >&$NEW_STDOUT
exec {NEW_STDOUT}>&-
Run Code Online (Sandbox Code Playgroud)