[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: builtin "read -d" behaves differently after "set -e#

From: John Kearney
Subject: Re: builtin "read -d" behaves differently after "set -e#
Date: Wed, 06 Feb 2013 19:12:01 +0100
User-agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20130107 Thunderbird/17.0.2

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


should work.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]