我遇到了一个奇怪的ZSH问题。我已经将脚本裁剪到最小形式,仍然能够重现这个问题。
我这里模拟的是通过子进程(实际脚本使用fswatch)监控目录变化。因为我正在监控,这意味着我不能在之前运行命令并保存输出。下面是一个(成功的)示例:
(echo "text.txt"; echo "text.txt") | while read filepath; do scp "$filepath" "trip:~/tom/"; echo $?; done
text.txt 100% 822 51.1KB/s 00:00
0
text.txt 100% 822 99.1KB/s 00:00
0
现在,当我在中间添加一个延迟时,似乎任何超过 while 循环中
scp
命令运行时间的延迟,突然第二个输出和任何后续的 scp
命令都不会显示:(echo "text.txt"; sleep 2; echo "text.txt") | while read filepath; do scp "$filepath" "trip:~/tom/"; echo $?; done
text.txt 100% 822 51.1KB/s 00:00
0
0
有趣的是,echo
仍然起作用,错误也会像你所期望的那样显示出来。
(echo "doesnotexist.txt"; sleep 2; echo "doesnotexist.txt") | while read filepath; do scp "$filepath" "trip:~/tom/"; echo $?; done
doesnotexist.txt: No such file or directory
1
doesnotexist.txt: No such file or directory
1
这里发生了什么?希望有人能帮我澄清一下。谢谢!
编辑:
经过进一步的尝试,似乎这与ZSH有关,因为在普通的bash-shell中可以正常工作。