Am 06.02.2013 14:46, schrieb Greg Wooledge: > On Wed, Feb 06, 2013 at 12:39:45AM +0100, Tiwo W. wrote: >> When using this in a script of mine, I noticed that this fails >> when errexit is set ("set -e"). > Most things do. set -e is crap. You should consider not using it. > >> * why does it work with "set +e" ? > Because set +e disables the crap. > >> * what is the recommended way to disable splitting with "read"? > What splitting? You only gave a single variable. There is no field > splitting when you only give one variable. > >> set -e >> read -d '' var2 <<EOF >> but >> this >> fails >> EOF >> echo "$var2" > Are you actually asking how to force read to slurp in an entire file > including newlines, all at once? Is that what you meant by "splitting"? > > Well, you already found your answer -- stop using set -e. By the way, > you may also want to set IFS to an empty string to disable the trimming > of leading and trailing whitespace, and use the -r option to suppress > special handling of backslashes. Thus: > > IFS= read -rd '' var2 <<EOF > > In case you're curious why set -e makes it fail: > > imadev:~$ IFS= read -rd '' foo <<EOF > > blah > > EOF > imadev:~$ echo $? > 1 > > read returns 1 because it reached the end of file for standard input. > From the manual: "The return code is zero, unless end-of-file is > encountered, read times out (in which case the return code is greater than > 128), or an invalid file descriptor is supplied as the argument to -u." > > So, if you're reading all the way to EOF (on purpose) then you should > ignore the exit status. set -e doesn't permit you to ignore the exit > status on commands where the exit status indicates a nonfatal condition > (such as read -d '' or let i=0). This is why set -e is crap. > > Also see http://mywiki.wooledge.org/BashFAQ/105 > set -e
IFS= read -rd '' var2 <<EOF || true EOF should work.