bug-bash
[Top][All Lists]
Advanced

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

bug batch


From: Dan Douglas
Subject: bug batch
Date: Thu, 13 Jun 2013 01:14:09 -0500
User-agent: KMail/4.10.4 (Linux/3.9.4-pf+; KDE/4.10.4; x86_64; ; )

Hello,

Clearing out the remainder of my "maybe bugs" file, in no particular order.

 1. Arithmetic assignment precedence / associativity.

Most shells (and GCC) consider not grouping the assignment in a situation like
this an error. Bash tolerates it, apparently reversing associativity:

    : $((1 == x = 1)) # Error in dash/ksh/mksh/zsh/etc

    #include <stdio.h>
    int main() {
        int n;
        5 == n = 5 && printf("%d\n", n); // Error
        return 0;
    }

 2. += environment assignments

    2a. POSIX mode += w/ special builtin.

    #!/usr/bin/env bash
    for sh in bash ~/doc/programs/bash43 ksh mksh zsh; do
        printf '%-7s %s\n' "${sh##*/}:" "$("$sh" /dev/fd/0)"
    done <<\EOF
    ${ZSH_VERSION+false}${BASH_VERSION+${POSIXLY_CORRECT=}}||emulate ksh
    x=2; x+=5 eval printf '"$x "'; echo "$x" # TESTCASE
    EOF

shell | inner | outer   
bash:   5 2   #(4.2.45)
bash43: 5 5
ksh:    25 25
mksh:   25 25
zsh:    25 25

    2b. Integer attribute with += environment assignment.

The manual doesn't document an exception for += when a command is present. Some
shells do arithmetic for += with a command (bash doesn't).

    #!/usr/bin/env bash
    for sh in bash ~/doc/programs/bash43 ksh mksh zsh; do
        printf '%-7s %s\n' "${sh##*/}:" "$("$sh" /dev/fd/0)"
    done <<\EOF
    ${ZSH_VERSION+false}${BASH_VERSION+${POSIXLY_CORRECT=}}||emulate ksh
    typeset -i x=2
    x+=5 eval printf '"$x "'; echo "$x" # TESTCASE
    EOF

bash:   5 2
bash43: 5 5
ksh:    7 7
mksh:   25 25
zsh:    7 7

 3. RETURN trap doesn't fire upon leaving a function via break or continue.

This is a very minor possibly intentional detail. The way break works in this
situation is interesting -- maybe useful.

    function f {
        case $1 in
            3) while :; do f $(($1 - 1)) done
                ;;
            0)
                trap "printf \$1" RETURN
                break
                ;;
            *) f $(($1 - 1))
        esac
    }

    # Prints "345" instead of "12345"
    f 5

 4. Invalid compound assignments can become string assignments.

If the first character of a regular assignment is an unquoted "(", then if
there's a a matching ")", the remainder of the assignment up to the next
unquoted metacharacter is assigned as a string. Zsh and ksh honor the ")" of
a compound assignment as a metacharacter (to separate commands). mksh and dash
treat such an assignment as an error.

    $ x=()abc; typeset -p x # It might be better to require quoting here.
    declare -- x="()abc"
    $ ksh -xc 'x=(foo)typeset -p x'
    + x=( foo )
    + typeset -p x
    typeset -a x=(foo)

 5. Easter egg (test + redirect + $[])

    $ trap 'echo "$BASH_COMMAND"; trap - DEBUG' DEBUG
    $ [ <& $[ ] [ = [ && printf '%s\n' "$_ ...ha :)"
    [ [ = [ 0<&$[ ]
    [ ...ha :)

I like this. :)

 6. Indirection combined with another modifier expands arrays to a single word.

    $ a=({a..c}) b=a[@]; printf '<%s> ' "${!b}"; echo; printf '<%s> ' 
"${!b/%/foo}"; echo
    <a> <b> <c>
    <a b cfoo>

I might have already reported this but can't find it. Ignore if so.

--
Dan Douglas



reply via email to

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