重定向中文件描述符的重复

Tim*_*Tim 4 shell bash io-redirection file-descriptors

来自https://www.gnu.org/software/bash/manual/html_node/Redirections.html

Bash 在重定向中使用时会特别处理几个文件名,如下表所述:

/dev/fd/fd 如果 fd 是有效整数,则文件描述符 fd 被复制。

/dev/stdin 文件描述符 0 重复。

/dev/stdout 文件描述符 1 重复。

/dev/stderr 文件描述符 2 重复。

这里的“重复”是什么意思?你能举一些例子吗?

PSk*_*cik 12

重定向是通过dup系列系统函数实现的。dup是重复的缩写,当你这样做时:

3>&2
Run Code Online (Sandbox Code Playgroud)

您将 ( dup2) 文件描述符 2 复制到文件描述符 3 上,如果文件描述符 3 已经打开,则可能关闭文件描述符 3(这不会对您的父进程做任何事情,因为这发生在forked off 子进程中(如果它没有(如果它没有(在 shell 函数上重定向)某些上下文),shell 将使它看起来好像确实如此))。

当你这样做时:

1<someFile
Run Code Online (Sandbox Code Playgroud)

它会open someFile在一个新的文件描述符上(这就是open系统调用通常所做的),然后它会dup2将该文件描述符放在 1 上。

手册说的是,如果列出的特殊开发文件之一代替someFile,shell 将跳过open-on-a-new-fd 步骤,而是直接转到dup2匹配的文件描述符(即,1 表示 /dev/标准输出等)到目标(重定向左侧的文件描述符)。