Message ID | rgn7yvfaitifvmsx7tsu3bicrcrqjbhkai7jdj6q5ja3ccrq3o@musfjdmv7egg (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Herbert Xu |
Headers | show |
Series | man: document what happens when IFS= (and when it's not) | expand |
On Sat, Apr 22, 2023 at 05:16:21PM +0200, наб wrote: > A question I just got from a user was "how do I make while read -r l; do > ...; done < f not strip the initial tabs?". Turns out, the manual is > silent on this, and POSIX just about implies this behaviour. > (Indeed, our read is almost verbatim POSIX, and both defer to Field > Splitting, but our Field Splitting isn't nearly as detailed, > and thank god.) > Even POSIX spends just one line describing this pivotal behaviour > (Issue 8 Draft 2.1 line 75044-75045: > "2. If the value of IFS is null, field splitting shall have no effect, > except that if the input is empty the result shall be zero fields.)," > and when I first encountered this it was also quite surprising to me. > > Spell it out explicitly: IFS= means that input is preserved, > and the default value means whitespace is stripped from the front. > Drive it home with an example because it's esoteric (and I know from > that user that they first tried searching for read in the manual, > but it was not very helpful). > > Reported-by: rozbrajaczpoziomow <rozbrajaczpoziomow@gmail.com> > --- > src/dash.1 | 13 +++++++++++++ > 1 file changed, 13 insertions(+) Patch applied. Thanks.
diff --git a/src/dash.1 b/src/dash.1 index d3893bc..bd4c662 100644 --- a/src/dash.1 +++ b/src/dash.1 @@ -1021,6 +1021,19 @@ .Ss White Space Splitting (Field Splitting) .Ev IFS as a delimiter and uses the delimiters to split the results of parameter expansion and command substitution into fields. +.Pp +If +.Ev IFS +is empty, field splitting yields no fields if the input string was empty, +and one string with the unchanged value of the input otherwise. +For example, with the default +.Ev IFS , +.Dq Ic read Fl r Ev l +will remove any initial whitespace, +but +.Dq Ev IFS Ns = Ic read Fl r Ev l +will leave the entire line in +.Ev l . .Ss Pathname Expansion (File Name Generation) Unless the .Fl f