dash gives "Syntax error: Bad substitution" on valid syntax

Bug #105634 reported by Paul Smith
4
Affects Status Importance Assigned to Milestone
dash (Debian)
Fix Released
Unknown
dash (Ubuntu)
Fix Released
Medium
Micah Cowan

Bug Description

Binary package hint: dash

This operation fails on Ubuntu:

    $ /bin/sh -c 'if false; then d="${foo/bar}"; fi'
    /bin/sh: Syntax error: Bad substitution

When used with other POSIX shells it succeeds. While semantically the variable reference ${foo/bar} is not valid, this is not a syntax error according to POSIX, and since the variable assignment expression is never invoked (because it's within an "if false") it should not be seen as an error.

I ran into this because after restarting my system I could no longer log in. It turns out that the problem was (a) I had edited .gnomerc to source my .bashrc file so that my environment would be set properly, and (b) I had added some new code to my .bashrc WITHIN A CHECK FOR BASH! that used bash's ${var/match/sub} feature. Even though this code was within a "case $BASH_VERSION; in *[0-9]*) ... esac (so dash would never execute it since that variable is not set), it still caused dash to throw up.

Revision history for this message
Scott Kitterman (kitterman) wrote :

I can confirm the same behavior on my Feisty box and also that there is no error with /bin/bash. I'll have to leave the POSIX question to someone else.

Changed in dash:
status: Unconfirmed → Confirmed
Revision history for this message
Paul Smith (psmith-gnu) wrote :

FYI, some relevant details from POSIX:

Section 2.3, Token Recognition:

5. If the current character is an unquoted '$' or '`', the shell shall identify the start of any candidates for parameter expansion ( Parameter Expansion), command substitution ( Command Substitution), or arithmetic expansion ( Arithmetic Expansion) from their introductory unquoted character sequences: '$' or "${", "$(" or '`', and "$((", respectively. The shell shall read sufficient input to determine the end of the unit to be expanded (as explained in the cited sections).

Section 2.6.2, Parameter Expansion:

The format for parameter expansion is as follows:

    ${expression}

where expression consists of all characters until the matching '}'. Any '}' escaped by a backslash or within a quoted string, and characters in embedded arithmetic expansions, command substitutions, and variable expansions, shall not be examined in determining the matching '}'.

[...]

The parameter name or symbol can be enclosed in braces, which are optional except for positional parameters with more than one digit or when parameter is followed by a character that could be interpreted as part of the name. The matching closing brace shall be determined by counting brace levels, skipping over enclosed quoted strings, and command substitutions.

---

In addition to bash I've checked Solaris /bin/sh and ksh and they don't report an error.

Revision history for this message
Micah Cowan (micahcowan) wrote :

The applicable portion of POSIX is in XCU 2.10.1:

"The WORD tokens shall have the word expansion rules applied to them immediately before the associated command is executed, not at the time the command is parsed."

This seems fairly clear to me.

Micah Cowan (micahcowan)
Changed in dash:
status: Unconfirmed → Unknown
Micah Cowan (micahcowan)
Changed in dash:
assignee: nobody → micah-cowan
Changed in dash:
status: Unknown → Unconfirmed
Micah Cowan (micahcowan)
Changed in dash:
importance: Undecided → Medium
Revision history for this message
comotion (comotion) wrote :

I have opened a new bug for the wider set of dash incompatabilites at https://bugs.launchpad.net/ubuntu/+source/dash/+bug/141481

Changed in dash:
status: New → Fix Released
Changed in dash:
status: Fix Released → New
Changed in dash:
status: New → Fix Released
Revision history for this message
Wouter Stomp (wouterstomp-deactivatedaccount) wrote :

This was fixed in 0.5.4-3

Changed in dash:
status: Confirmed → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.