【发布时间】:2017-11-24 09:59:49
【问题描述】:
在zsh中,
echo -n "Hello " | cat - - <<< "World"
将打印
Hello World
但是在 bash 中会打印相同的命令
World
我的解释是,在 zsh 中 cat 将在标准输入上打开第一个文件描述符(第一个“-”选项),读取管道“Hello”,然后关闭标准输入,然后以某种方式重新打开它(第二个“-”选项),然后读取此处的字符串“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
cat 似乎只是忽略了它的第二个参数。
请任何 bash/zsh 的大师来启发我?有没有一种通用的方法可以将流与字符串连接起来而没有任何中间文件,或者如果可能的话,使用 here-document ?
【问题讨论】: