在zsh中,
然而在bash中,相同的命令将会打印:
我的理解是,在zsh中,cat会在stdin上打开第一个文件描述符(第一个“-”选项),读取管道中的“Hello”,然后关闭stdin,然后以某种方式重新打开它(第二个“-”选项),然后读取here-string "World",然后将它们连接成“Hello World”。
但我不明白在bash中会发生什么。 strace给我奇怪的结果:
echo -n "Hello " | cat - - <<< "World"
将会打印
Hello World
然而在bash中,相同的命令将会打印:
World
我的理解是,在zsh中,cat会在stdin上打开第一个文件描述符(第一个“-”选项),读取管道中的“Hello”,然后关闭stdin,然后以某种方式重新打开它(第二个“-”选项),然后读取here-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大师能为我解惑吗?有没有一种常见的方法可以将流与字符串连接起来,而不需要任何中间文件或,如果可能的话,是一个here-document?