在 bash 中,我们可以在文件描述符和文件之间创建连接,例如:
exec > /path/to/myfile
它将 fd 1 连接到文件。
我想知道如何断开 fd 与连接到它的任何文件的连接,以便 fd 不连接到任何文件?请注意,/dev/null
和/dev/tty
是文件。
谢谢。
我的目的是弄清楚shell 是否自动将文件描述符 0、1 和 2 连接到其控制终端?bash
,在同一 bash shell 中运行之前,断开 bash 中的 fd 0、1 和 2 。
答案1
您想要的是关闭文件描述符,在类似 Bourne 的 shell 中使用>&-
(默认为 fd 1)或<&-
(默认为 fd 0)运算符完成:
exec >&-
exec 1>&-
exec 1<&-
都是等价的并导致close(1)
进行系统调用。
请注意,关闭文件描述符 0、1 和 2 通常是一个坏主意,因为大多数命令期望这些文件描述符打开(这是它们的 stdin、stdout 和 stderr),并且它们打开文件可能会导致该文件无意中成为它们的 stdin/ stdout/stderr 以及它们在 stdout 或 stderr 上打印的内容最终可能会写入这些文件中。