![读取文件描述符](https://linux22.com/image/10211/%E8%AF%BB%E5%8F%96%E6%96%87%E4%BB%B6%E6%8F%8F%E8%BF%B0%E7%AC%A6.png)
名为的文件的内容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
你是说cat
fd 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
。