微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux-bash和zsh之间运算符<<<的解释差异

在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 举报,一经查实,本站将立刻删除。

相关推荐