From: Chris Packham Date: Wed, 05 Jan 2011 23:22:17 GMT Subject: Re: [BUG?] "git submodule foreach" when command is ssh Message-ID: In-Reply-To: <20110105230334.GB9774@sigill.intra.peff.net> On Thu, Jan 6, 2011 at 12:03 PM, Jeff King wrote: > On Thu, Jan 06, 2011 at 11:50:58AM +1300, Chris Packham wrote: > >> Actually this might be a ssh/bash bug (feature?). There is different >> behaviour between >> >>   find . -maxdepth 1 -type d -a ! -name '\.*' | while read; do echo >> $REPLY && ssh localhost ls /; done >> >> and >> >>   find . -maxdepth 1 -type d -a ! -name '\.*' | while read; do echo >> $REPLY && ls /; done > > Ssh will opportunistically eat data on stdin to send to the other side, > even though the command on the other side ("ls" in this case) will never > read it. Because of course ssh has no way of knowing that, and is trying > to be an interactive terminal. So it ends up eating some random amount > of the data you expected to go to the "read" call. > > You can use the "-n" option to suppress it. For example: > >  $ (echo foo; echo bar) | >    while read line; do >      echo local $line >      ssh host "echo remote $line" >    done > > produces: > >  local foo >  remote foo > > but: > >  $ (echo foo; echo bar) | >    while read line; do >      echo local $line >      ssh -n host "echo remote $line" >    done > > produces: > >  local foo >  remote foo >  local bar >  remote bar > > which is what you want. > > -Peff Thanks that makes sense and adding -n to my ssh invocations solves the problem.