簡體   English   中英

ZSH:Output 來自內部的標准輸出,而讀取丟失

[英]ZSH: Output from stdout from within while read gets lost

我遇到了一個奇怪的 ZSH 問題。 我已將腳本修剪為仍能重現該問題的最小形式。

我在這里模擬的是通過子進程監視目錄的更改(實際腳本使用fswatch )。 因為我正在監視,這意味着我無法事先運行命令並保存 output。 一個(工作)示例如下:

(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

現在,當我在中間添加延遲時,似乎任何延遲都比scp命令在while循環內的運行時間長,突然第二個 output 和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 中工作。

在子 shell 中運行整個 while 循環沒有問題。 這似乎工作:

(echo "text.txt"; sleep 2; echo "text.txt") | (while read filepath; do scp "$filepath" "trip:~/tom/"; echo $?; done)

對 scp 源的一些挖掘表明,非輸出是由該檢查返回 false 引起的: progressmeter.c#L81-L85 (即 scp 進程的進程組 ID 突然與“與標准輸出關聯的終端上的前台進程組”不同)。

bash 和 zsh 之間的一個區別是 zsh 在主 shell 進程中運行 while 循環,而 bash 沒有(我從這里收集到)。 但這是我現在能夠挖掘的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM