Skip to contentSkip to conversation

sed script fails to run in dash

DISCUSSION Tormen 4 participants 5 messages Nov 22, 2013 – Nov 23, 2013

lore
Share & tools
lore

Tormen

author
#0 lore raw

Hi,

I am puzzled and don't know why this command does not work with dash (I am currently using the debian stable (v7.2) version of dash (v0.5.7-3)):

echo 1>/tmp/x; reponse=$( sed -e $(wc -l </tmp/x)$'{w/dev/stdout\n;d}' -i /tmp/x ); echo "reponse='$reponse'"

but also just this line:

    sed -e 1$'{w/dev/stdout\n;d}' -i /tmp/x

in a dash script will yield the error message:

sed: -e expression #1, char 2: unknown command: `$'

But why ? :(

I would be really grateful for any explanation.
Thanks a lot in advance for any hint!

Tormen

P.S.: The source for the above line is:
http://stackoverflow.com/questions/13804967/bash-pop-lines-in-a-file

#1 lore raw

Le Fri, 22 Nov 2013 19:11:42 +0100
Tormen a écrit:

Hello,

Quoted 9 lines

but also just this line:

    sed -e 1$'{w/dev/stdout\n;d}' -i /tmp/x

in a dash script will yield the error message:

sed: -e expression #1, char 2: unknown command: `$'

But why ? :(

It seems dash strictly passes what you have given and which is sed-speaking incorrect:

$ dash -c "strace sed -e 1$'{w/dev/stdout\n;d}' -i /tmp/x"
execve("/usr/bin/sed", ["sed", "-e", "1${w/dev/stdout\\n;d}", ...
                                      ^^^
Bash does not, and so passes something sed understands:
$ bash -c "strace sed -e 1$'{w/dev/stdout\n;d}' -i /tmp/x"
execve("/usr/bin/sed", ["sed", "-e", "1{w/dev/stdout \n;d}", ...
                                      ^^^
If you escape the "$" with bash, you will get your kitten back:
$ bash -c "sed -e 1\\$'{w/dev/stdout\n;d}' -i /tmp/x"
sed: -e expression #1, char 2: unknown command: `$'

Take care,
Seb.

#2 lore raw
In reply to Tormen

Hi Tormen,

Quoted 7 lines · Tormen
    sed -e 1$'{w/dev/stdout\n;d}' -i /tmp/x

in a dash script will yield the error message:

sed: -e expression #1, char 2: unknown command: `$'

But why ? :(

POSIX sayeth[1]:

The '$' character is used to introduce parameter expansion, command substitution, or arithmetic evaluation. If an unquoted '$' is followed by a character that is not one of the following:

* A numeric character
* The name of one of the special parameters (see 2.5.2 Special Parameters)
* A valid first character of a variable name
* A <left-curly-bracket> ( '{' )
* A <left-parenthesis>

the result is unspecified.

A single-quote is not the name of a special parameter nor valid as the first character of a variable name, so this is unspecified behavior and should be avoided in scripts meant to run on an arbitrary POSIX shell.

However the next major version of POSIX is likely to mandate support for $'' string handling[2]. Work towards an implementation in dash would be very welcome.

Thanks and hope that helps,
Jonathan

[1] http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06
[2] http://austingroupbugs.net/view.php?id=249

#3 lore raw
In reply to Tormen
Quoted 7 lines · Tormen
    sed -e 1$'{w/dev/stdout\n;d}' -i /tmp/x

in a dash script will yield the error message:

sed: -e expression #1, char 2: unknown command: `$'

But why ? :(

Because $'' is not (yet) in POSIX. It will be required in a future release, but dash hasn't implemented it yet.

http://austingroupbugs.net/view.php?id=249

Signature · 2 lines
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org
author
#4 lore raw
Quoted 6 lines · Eric Blake
Quoted 4 lines · Tormen
    sed -e 1$'{w/dev/stdout\n;d}' -i /tmp/x

in a dash script will yield the error message:

Quoted 7 lines
Quoted 3 lines

sed: -e expression #1, char 2: unknown command: `$'

But why ? :(

Because $'' is not (yet) in POSIX. It will be required in a future release, but dash hasn't implemented it yet.

http://austingroupbugs.net/view.php?id=249

Now I get how this script works ;)

Thanks !! :)

!!! And also thanks to all the other answers !!! - really appreciated! :)))