在zsh中
echo -n "Hello " | cat - - <<< "World"
将打印
Hello World
但是在bash中将打印相同的命令
World
我的解释是,在zsh cat中,将在stdin上打开第一个文件描述符(第一个“-”选项),读取管道的“ Hello”,然后关闭stdin,然后以某种方式重新打开它(第二个“-”选项),然后在此处阅读-string“ World”,然后将它们关联到“ Hello World”.
但是我不明白bash会发生什么. strace给了我奇怪的结果:
zsh $> echo -n "Hello " | strace cat - - <<< "World"
strace: UnkNown pid: 7841
Process 7844 detached
bash $> echo -n "Hello " | strace cat - - <<< "World"
...
read(0, "World\n", 65536) = 6
write(1, "World\n", 6) = 6
read(0, "", 65536) = 0
fstat(0, {st_mode=S_IFREG|0600, st_size=6, ...}) = 0
fadvise64(0, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(0, "", 65536) = 0
close(0) = 0
close(1) = 0
close(2) = 0
猫似乎只是忽略了它的第二个论点.
有什么bash / zsh大师能启发我吗?是否有一种通用的方法来连接带有字符串的流而没有任何中间文件,或者如果可能的话,还有一个此处文档?
解决方法:
实际上,这与cat的第二个参数无关.
echo -n "Hello " | cat - <<< "World"
将具有相同的结果.
区别在于multios zsh选项.您可以检查unsetopt multios之后zsh的行为是否与bash相同.
引用手册:
If the user tries to open a file descriptor for reading more than once, the shell opens the file descriptor as a pipe to a process that copies all the specified inputs to its output in the order specified, similar to cat, provided the MULTIOS option is set.
因此,在您的示例中,shell会将来自管道和此处的数据连接在一起,并将其通过管道传递给cat的输入.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。