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的输入.

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...