我的理解是,在使用 open() 打开新文件时,无法控制操作系统分配的文件描述符(整数)。那么如何在 bash shell 中使用类似的命令分配特定的文件描述符
exec 5>&1
(我想我可以通过阅读 bash 资源来找出答案......)
我的理解是,在使用 open() 打开新文件时,无法控制操作系统分配的文件描述符(整数)。那么如何在 bash shell 中使用类似的命令分配特定的文件描述符
exec 5>&1
(我想我可以通过阅读 bash 资源来找出答案......)
我相信您是对的,有时文件描述符可能已经在使用中。我从http://tldp.org/LDP/abs/html/io-redirection.html#FTN.AEN17716得到这个
“使用文件描述符 5 可能会导致问题。当 Bash 创建子进程时,与 exec 一样,子进程继承 fd 5(请参阅 Chet Ramey 的存档电子邮件,主题:RE:文件描述符 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}>&-
请参阅dup2 Unix 系统调用。
此外,文件描述符是按顺序分配的,因此如果您知道 0、1、2、...、n 已经打开并且它们都没有关闭,那么下一个将是 n+1。