读取文件描述符

读取文件描述符

名为的文件的内容file

testing 1
testing 2

命令已测试

exec 3<> ./tmp
cat file 1>&3 3>&1

什么也没输出。为什么?

我将我的命令读为

cat中的内容file,然后读取STDOUT并将其提供给文件描述符3,然后从文件描述符中取出内容3并将其内容提供给STDOUT

我读错了命令吗?

我该如何阅读我的命令以便更好地理解它并获得输出file


在理解你的回答 Stéphane 后,我尝试了以下命令

cat file 1>&3 3> ofile

它没有将 fd 3 的内容(从 fd 1 即 STDOUT 获取内容)写入ofile

但我尝试了以下命令

cat file 1>&3 && cat <3

将 fd 3 的内容打印到 STDOUT。

ofile当 fd 3 具有 fd 1 的内容时,为什么 fd 3 不写入?


Stéphane,下面评论中提到的命令 Jesse_b ie

cat file 3> ofile 1>&3 

file工作并写入内容ofile但命令

cat file 1>&3 3> ofile

正如我之前提到的,无法写入ofile.

1>&3末尾和开头的位置如何3> ofile影响这两个命令的输出?

答案1

cmd x>&y说:“将 fd x 重定向到 fd y 重定向到的任何资源”

所以在:

cat 1>&3 3>&1

你是说catfd 1 (stdout) 应该转到与 fd 3 上打开的资源相同的资源,即./tmp以读+写模式打开;然后将 fd 3 转到与 fd 1 上打开的资源相同的资源,您刚刚将其设置为./tmp

因此cat将开始将其 fds 1 和 3 重定向到./tmp.cat不对其 fd 3 执行任何操作,您可以将cat的 fd 3 重定向到您喜欢的任何内容,它不会产生任何效果。

然而,它确实将 的内容写入file其 fd 1,因此您会发现 的内容file写在 的开头./tmp

cat file仅将内容写入file一次且仅写入一个 fd。如果你想要file将两次内容写入两个不同的 fd的东西,你会想要tee

< file tee ./tmp

tee将从其 fd 0(此处重定向为file以只读模式打开)读取的内容写入./tmp(以截断的只写模式打开)及其 fd 1(stdout)。

虽然可以告诉tee打开./tmp附加模式-a,你不能告诉它./tmp以读+写模式打开而不像那样截断3<>

为此,您需要:

< file tee /dev/fd/3 3<> ./tmp

除了在 Linux 上之外,它都可以工作,或者诉诸使用zsh及其内置的发球设施:

cat < file 3<> ./tmp >&1 >&3 3>&-

当 fd 1 被重定向两次时,zsh当启用该mulltios选项(默认情况下打开)时,将执行内部 tee 将输出转发到两个目标(通过运行读取 的cat输出并将其写入两个目标的内部进程)。

暂时使用fd 3是为了解决以下问题:

cat < file >&1 1<> ./tmp

zsh 会抱怨,zsh: file mode mismatch on fd 1因为它假设你想要./tmp

相关内容