我遇到了一个奇怪的 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
Run Code Online (Sandbox Code Playgroud)
现在,当我在中间添加延迟时,似乎任何比scpwhile 循环内命令的运行时间长的延迟,突然第二个输出和任何后续命令都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
Run Code Online (Sandbox Code Playgroud)
有趣的是,echo仍然可以正常工作,并且错误会像您所期望的那样出现。
(echo "doesnotexist.txt"; sleep 2; echo "doesnotexist.txt") | while read filepath; do scp "$filepath" "trip:~/tom/"; …Run Code Online (Sandbox Code Playgroud)