我的理解是,当使用open()打开新文件时,无法控制操作系统分配的文件描述符(整数)。那么如何在bash shell中使用像
这样的命令来分配特定的文件描述符exec 5>&1
(我想我可以通过阅读bash来源找到...)
答案 0 :(得分:3)
请参阅dup2 Unix系统调用。
答案 1 :(得分:3)
我相信你是对的,有时文件描述符可能已经在使用中。我是从http://tldp.org/LDP/abs/html/io-redirection.html#FTN.AEN17716
得到的“使用文件描述符5可能会导致问题。当Bash创建子进程时,与exec一样,子进程继承fd 5(请参阅Chet Ramey的归档电子邮件,SUBJECT: RE: File descriptor 5 is held open)。最好留下这个特定的fd 。“
对此的解决方案在bash手册的第3.6节第2节中有详细说明。
可以在文件描述符号之前的每个重定向可以是 之前是
{varname}
形式的单词。在这种情况下,对于每个重定向操作符 除了>& - 和<& - 之外,shell将分配大于10的文件描述符并将其分配给{varname}。如果>& - 或<& - 前面有{varname},则varname的值定义要关闭的文件描述符。
例如
#!/bin/bash
exec {NEW_STDOUT}>&1
echo "Hello" >&$NEW_STDOUT
exec {NEW_STDOUT}>&-
答案 2 :(得分:1)
此外,文件描述符是按顺序分配的,所以如果你知道0,1,2,...,n已经打开并且没有一个已经关闭,那么下一个将是n + 1.