Gyp*_*aut 4 shell io-redirection file-descriptors
名为的文件的内容 file
testing 1
testing 2
Run Code Online (Sandbox Code Playgroud)
命令测试
exec 3<> ./tmp
cat file 1>&3 3>&1
Run Code Online (Sandbox Code Playgroud)
什么都不输出。为什么?
我把我的命令读为
catcontent in file,然后读取STDOUT并将其提供给文件描述符3,然后从文件描述符中获取内容3并将其内容提供给STDOUT
我读错了我的命令吗?
我应该如何阅读我的命令以更好地理解它并获得输出 file
在理解了你的回答 Stéphane 后,我尝试了以下命令
cat file 1>&3 3> ofile
Run Code Online (Sandbox Code Playgroud)
它没有将 fd 3 的内容(它从 fd 1 中获取内容,即 STDOUT)写入 ofile
但我尝试了以下命令
cat file 1>&3 && cat <3
Run Code Online (Sandbox Code Playgroud)
它将 fd 3 的内容打印到 STDOUT。
ofile当 fd 3 有 fd 1 的内容时,为什么 fd 3 没有写入?
Stéphane,下面评论中提到的命令 Jesse_b ie
cat file 3> ofile 1>&3
Run Code Online (Sandbox Code Playgroud)
工作并且确实写了filetoofile但命令的内容
cat file 1>&3 3> ofile
Run Code Online (Sandbox Code Playgroud)
正如我之前提到的,无法写入ofile.
1>&3在结尾和开头的位置如何3> ofile影响这两个命令的输出?
cmd x>&y 说:“将 fd x 重定向到 fd y 重定向到的任何资源”
所以在:
cat 1>&3 3>&1
Run Code Online (Sandbox Code Playgroud)
您是说catfd 1 (stdout) 应该转到与在 fd 3 上打开相同的资源,即./tmp以读+写模式打开;然后 fd 3 到与在 fd 1 上打开的资源相同的资源,您刚刚将其设为./tmp.
Socat将以其 fds 1 和 3 重定向到./tmp. cat不对其 fd 3 做任何事情,您可以将cat的 fd 3重定向到您喜欢的任何内容,它不会有任何影响。
但是它确实将 的内容写入file其 fd 1,因此您会file在./tmp.
cat filefile仅将内容写入一次且仅写入一个 fd。如果您想要将file两次内容写入两个不同 fd的内容,您需要tee:
在
< file tee ./tmp
Run Code Online (Sandbox Code Playgroud)
tee会将它从其 fd 0(此处重定向为file以只读模式打开)读取的内容./tmp写入(以 truncate 的只写模式打开)及其 fd 1(stdout)。
虽然可以告诉tee打开./tmp的追加模式-a,你不能告诉它打开./tmp就像没有截断在读+写模式3<>一样。
为此,您需要:
< file tee /dev/fd/3 3<> ./tmp
Run Code Online (Sandbox Code Playgroud)
除了在 Linux 上可以工作,或者诉诸使用zsh及其内置的发球设施:
cat < file 3<> ./tmp >&1 >&3 3>&-
Run Code Online (Sandbox Code Playgroud)
由于 fd 1 被重定向两次,zsh当mulltios启用该选项(默认情况下为启用)时,将执行内部 tee 将输出转发到两个目的地(通过运行读取cat的输出并将其写入两个目的地的内部进程)。
临时使用 fd 3 是为了解决在
cat < file >&1 1<> ./tmp
Run Code Online (Sandbox Code Playgroud)
zsh的将与抱怨zsh: file mode mismatch on fd 1,因为它假设你想读的./tmp。
| 归档时间: |
|
| 查看次数: |
2694 次 |
| 最近记录: |