Ssh
ssh 在不被要求的情況下讀取標準輸入
這些不做同樣的事情:
$ seq 1000000 | (ssh localhost sleep 1; wc -l) 675173 $ seq 1000000 | (ssh localhost sleep 1 </dev/null; wc -l) 1000000
ssh
閱讀標準輸入的理由是什麼?
ssh 總是讀取標準輸入,除非您告訴它不要使用
-n
選項(或-f
選項)。原因是你可以做類似的事情
tar cf - somedir | ssh otherhost "tar xf -"
它總是這樣做,因為 ssh 無法知道您的遠端命令是否接受輸入。
可能在您的第一個命令中發生的情況是 seq 填滿了網路和管道緩衝區(seq -> ssh -> sleep),並且由於 sleep 沒有讀取任何內容,它被阻塞等待更多讀取,然後 sleep 退出,導致那些完整的緩衝區被轉儲,然後 seq 被解除阻塞,將剩餘部分提供給 wc。
請注意,您會得到類似的結果
seq 1000000 | ( cat | cat | sleep 1; wc -l)
在您的第二個命令中,它仍在讀取標準輸入,但您已從外部將 /dev/null 分配給標準輸入。