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/标准输出等)到目标(重定向左侧的文件描述符)。