5

I'm learning bash and trying to understand the difference between these two methods of reading lines from a file.

1.

while IFS= read -r line
do
  echo $line
done < "$file"

2.

cat $file |
while read data
do
   echo $i
done

So basically what I'm wondering is: Is either of them more common practice than the other? Are there performance differences? etc.

Also, are there other ways of reading from a file that are even better, especially when it comes to reading from large files?

codeforester
  • 39,467
  • 16
  • 112
  • 140
bork
  • 1,556
  • 4
  • 21
  • 42
  • 2
    See [BashFAQ/001](http://mywiki.wooledge.org/BashFAQ/001) and [BashFAQ/024](http://mywiki.wooledge.org/BashFAQ/024). – Benjamin W. May 14 '17 at 05:03

2 Answers2

5

The second one is a Useless Use of Cat: http://porkmail.org/era/unix/award.html

I use the done < "$file" form.

No, there is not a better way in Bash. But eliminating one process (cat) is nice.

John Zwinck
  • 239,568
  • 38
  • 324
  • 436
3

There are a few advantages in the first method:

  • it's more straightforward
  • it doesn't use an extra cat and pipe
  • the loop runs in the current shell whereas the second method uses a subshell; variables set or modified inside the loop are visible outside

Even if the while loop were to consume the output of another command (through process substitution as shown below), the first method is better as it eliminates the subshell:

while read -r line; do
  # loop steps
done < <(_command_)

See also:

codeforester
  • 39,467
  • 16
  • 112
  • 140