これらは異なって働きます:
$ seq 1000000 | (ssh localhost sleep 1; wc -l)
675173
$ seq 1000000 | (ssh localhost sleep 1 </dev/null; wc -l)
1000000
stdinを読む理由は何ですかssh
?
ベストアンサー1
-n
sshは、オプション(またはoptions)を使用して読み取らないように指示しない限り、常に標準入力を読み込みます-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)
2番目のコマンドではまだstdinを読み込んでいますが、外部で/ dev / nullをstdinに割り当てました。