Re: behavioral change of "read" builtin for sh on 8-CURRENT

From: Giorgos Keramidas <keramida_at_freebsd.org>
Date: Wed, 10 Dec 2008 23:27:31 +0200
Hi Michael,

This looks like a bug in 8.0-CURRENT.

Can you please file a bug report and include the text you sent below?

On Wed, 10 Dec 2008 00:49:58 -0500, "Michael Proto" <mike_at_jellydonut.org> wrote:
> I've noticed a behavioral difference of the "read" builtin statement within
> /bin/sh on CURRENT and I'm hoping someone can point me in the right
> direction on how to restore the old behavior.
>
> I have a /bin/sh script that accepts input for IP address information:
>
> #!/bin/sh
> set -x
> DEFINT=vr0
> DEFIP=192.168.0.1
> DEFMASK=255.255.255.0
> read -p "Enter network interface [$DEFINT]: " -t 5 INT
> read -p "Enter IP address [$DEFIP]: " -t 5 IP
> read -p "Enter netmask [$DEFMASK]: " -t 5 MASK
> echo ${INT:=$DEFINT} : ${IP:=$DEFIP}/${MASK:=$DEFMASK}
>
> This script waits for terminal input for each of the above variables (INT,
> IP, MASK) and defaults to a script-provided value if no input is entered in
> 5 seconds for each variable. On 6.x and 7.x if I simply hit Enter at the
> prompt (and don't provide any input) no value is assigned to the variable so
> my INT, IP, and MASK variables are set to null and the parameter
> substitution of the DEF* variables works as expected.
>
> On 8-CURRENT if I hit Enter with no input at the prompt the system seems to
> recognize the newline as input and continues to sit there until I hit Enter
> again. When I do this there appears to be a strange unprintable value
> assigned to the INT, IP, and MASK variables yet the variable subsitution
> doesn't work correctly.
>
> The man page on sh lists the following behavior for read:
>
>      read [-p prompt] [-t timeout] [-er] variable ...
>              The prompt is printed if the -p option is specified and the
> stan-
>              dard input is a terminal.  Then a line is read from the
> standard
>              input.  The trailing newline is deleted from the line and the
>              line is split as described in the section on White Space
>              Splitting (Field Splitting) above, and the pieces are assigned
> to
>              the variables in order.  If there are more pieces than
> variables,
>              the remaining pieces (along with the characters in IFS that
> sepa-
>              rated them) are assigned to the last variable.  If there are
> more
>              variables than pieces, the remaining variables are assigned the
>              null string.
>
>
> As I interpret this, read should delete the trailing newline and assign a
> null value since there is is no "input" before the newline. Then the
> variable substitution should take over and assign the DEF* variables
> appropriately. 6 and 7 follow this but 8 does not.
>
> Here's the output of the script (with set -x) to help show what I'm seeing.
>
> This is on 6 and 7:
>
> + DEFINT=vr0
> + DEFIP=192.168.0.1
> + DEFMASK=255.255.255.0
> + read -p Enter network interface [vr0]:  -t 5 INT
> Enter network interface [vr0]:
> + read -p Enter IP address [192.168.0.1]:  -t 5 IP
> Enter IP address [192.168.0.1]:
> + read -p Enter netmask [255.255.255.0]:  -t 5 MASK
> Enter netmask [255.255.255.0]:
> + echo vr0 : 192.168.0.1/255.255.255.0
> vr0 : 192.168.0.1/255.255.255.0
>
>
> And this is what I see with 8:
>
> + DEFINT=vr0
> + DEFIP=192.168.0.1
> + DEFMASK=255.255.255.0
> + read -p Enter network interface [vr0]:  -t 5 INT
> Enter network interface [vr0]:
> + read -p Enter IP address [192.168.0.1]:  -t 5 IP
> Enter IP address [192.168.0.1]:
> + read -p Enter netmask [255.255.255.0]:  -t 5 MASK
> Enter netmask [255.255.255.0]:
> /: cho
> /:
>
> Strange that the "echo" statement is missing the first "e" character in the
> debug output.
>
> Even stranger on 8-CURRENT, if I *do* enter input before the newline (say I
> change the IP address or the network interface), the first character is not
> echoed back to the screen but is still saved to the variable. Here's an
> example when I run the script and provide input at each prompt:
>
> + DEFINT=vr0
> + DEFIP=192.168.0.1
> + DEFMASK=255.255.255.0
> + read -p Enter network interface [vr0]:  -t 5 INT
> Enter network interface [vr0]: r0
> + read -p Enter IP address [192.168.0.1]:  -t 5 IP
> Enter IP address [192.168.0.1]: 92.168.0.1
> + read -p Enter netmask [255.255.255.0]:  -t 5 MASK
> Enter netmask [255.255.255.0]: 55.255.255.0
> + echo br0 : 192.168.0.1/255.255.255.0
> br0 : 192.168.0.1/255.255.255.0
> + echo ifconfig br0 inet 192.168.0.1 netmask 255.255.255.0
>
> Notice that when I'm prompted, the first character doesn't echo but is still
> saved in the variable.
>
>
> Does anyone else see this same behavior? Any ideas on how to reset it back
> to how it works in STABLE? I'm not doing anything special with IFS so I'm
> stumped on how to troubleshoot this.
>
>
>
> Thanks,
> Proto
> _______________________________________________
> freebsd-questions_at_freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-questions
> To unsubscribe, send any mail to "freebsd-questions-unsubscribe_at_freebsd.org"
>

-- 
Received on Wed Dec 10 2008 - 20:27:42 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:38 UTC