-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Sun, Aug 12, 2018 at 01:26:40AM -0400, Jim Popovitch wrote:
> On Sun, 2018-08-12 at 00:48 +0200, to...@tuxteam.de wrote:
> > On Sat, Aug 11, 2018 at 06:08:34PM -0400, Jim Popovitch wrote:
> > > Hello!
> > > 
> > > What's the best way to grab anything that's in stdin into a
> > > variable
> > > inside a bash script, but won't block if stdin is null?
> > 
> > I think read is your friend (at least in bash). It has an option
> > -t <timeout>, which you can set to zero, for it to just grab what's
> > available at the moment without waiting (cf "help read" while in
> > the bash for more details, like setting a delimiter, etc.)
> > 
> > HTH
> > -- tomás
> 
> Thanks for the reply tomás.  I'm trying to avoid using read because of
> the 1 sec minimum timeout.

Not on bash, at least. According to the docs, "-t 0" is a timeout of
zero. Experiments confirm that:

  tomas@trotzki:~$ time read -t 0

  real    0m0.000s
  user    0m0.000s
  sys     0m0.000s

(Of course, 0 is too optimistic here, but it's sub-millisecond).
Fractional times work too:

  tomas@trotzki:~$ time read -t 0.05

  real    0m0.050s
  user    0m0.000s
  sys     0m0.000s

Finally, you can use timeout to read incomplete (i.e. non-terminated)
input, like so:

  tomas@trotzki:~$ time echo -n mumble | bash -c 'read -t 0.01 foo ; echo $foo'
  mumble

  real    0m0.004s
  user    0m0.000s
  sys     0m0.000s

Note that "-t 0" won't work here: the "read" at the right is there before
the "echo" at the left, so read turns out empty...

>                             This may seem odd, but 1 sec is 100+ times
> longer than grep'ing/awk'ing/sed'ing the contents of a variable, so I'm
> trying to find a faster way to read stdin.  

No, it doesn't seem odd. Sometimes 1 sec is too much (sometimes 1msec is
too much, too :-)

But I think (used wisely) read is still your friend!

Note that I didn't check how much of this is bashism. Document your
requirements :-)

Cheers
- -- t
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.12 (GNU/Linux)

iEYEARECAAYFAltv8XkACgkQBcgs9XrR2kZNaQCcCaWfnVktQY8CENggRODJ3/nl
+1UAnRbm/rs66wz+BplEsBX3Mmp3Ed7X
=NFpA
-----END PGP SIGNATURE-----

Reply via email to