4

Look at this very basic Bash script:

#!/bin/bash
while read l
do
  echo $l
  echo "next one"
done <<< $(ps aux)

I have several processes on my computer, and the ps aux command works fine in the terminal.

I only get one iteration in the loop and ps command output is given on the same line. Why doesn't it work as intended?

4
  • Couldn't replicate. Running that script on my system (bash v4.4) returns the same multi-line results from both the command line and as a script. Note: it'd be simpler to change while ... done <<< $(ps aux) to ps aux | while ... done.
    – agc
    Commented Mar 26, 2020 at 8:55
  • This is strange. Do you know if a configuration or environnement variable can impact this behaviour ?
    – Bob5421
    Commented Mar 26, 2020 at 8:58
  • Are you using some old version of bash, like 3.2?
    – user313992
    Commented Mar 26, 2020 at 9:25
  • Let's compare set -o outputs. On my system printf '%x\n' $((2#$(set -o | rev | cut -c 1 | tr 'fn' '01' | tr -d '\n'))) outputs the hex summary of 31d4000. (That is it takes a list of "on/off" values, converts 'em to binary, then to a single hex value.)
    – agc
    Commented Mar 26, 2020 at 9:27

1 Answer 1

9

In bash versions < 4.4-beta you need to add double quotes:

#!/bin/bash
while read l
do
  echo $l
  echo "next one"
done <<< "$(ps aux)"

See:


In general, I think it is better to use process substitution:

#!/bin/bash
while read l
do
  echo $l
  echo "next one"
done < <(ps aux)

(To avoid issues, you might want to use IFS=).

or even better, use a program specialized for reading files or input line by line like e.g. awk.

ps aux | awk '{print $0; print "next one"}'
6
  • Thanks but why quotes are needed on some system and not on others ?
    – Bob5421
    Commented Mar 26, 2020 at 9:25
  • 3
    @Bob5421 because that was a bug which was fixed in newer versions of bash. Nowadays <<< $(...) should be identical to <<< "$(...)" (specifically when used with <<<, not $(...) in general). I can reproduce your problem with bash-3.2, but not with newer versions.
    – user313992
    Commented Mar 26, 2020 at 9:26
  • Not with bash-4.4 ;-) So the change probably happened just between the 2 versions. The new behaviour is documented in the manpage: "[n]<<<word ... Pathname expansion and word splitting are not performed."
    – user313992
    Commented Mar 26, 2020 at 9:33
  • 1
    You don't need my permission ;-)
    – user313992
    Commented Mar 26, 2020 at 9:36
  • Updated the answer, thanks!
    – pLumo
    Commented Mar 26, 2020 at 9:49

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .