Update - changing my pseudo-comment to a real answer.
I think this answer should explain the behavior you are seeing. Specifically command substitution operators $()
and backticks will strip trailing newlines from the command output. However the direct assignment in your second example doesn't do any command subsitution, so works as expected.
So I'm afraid to say I think the upvoted comment you refer to is incorrect.
I think the safest way to restore IFS is to set it in a subshell. All you need to do is put the relevant commands in parentheses ()
:
(
IFS=$'\n'
echo -n "$IFS" | od -t x1
for file in `printf 'one\ntwo two\nthree'`; do
echo "Found $file"
done
)
Of course invoking a subshell incurs a small delay, so performance needs to be considered if this is to be repeated many times.
As an aside, be very careful, filenames can contain both \b and \n. I think just about the only characters they cannot contain are slash and \0. At least thats what it says on this wikipedia article.
$ touch $'12345\b67890'
$ touch "new
> line"
$ ls --show-control-chars
123467890 new
line
$