• Bug#1101388: dash: POSIX behavior / shift N calls exit if N > $# (posit

    From Jari Aalto@21:1/5 to All on Wed Mar 26 22:00:01 2025
    This is a multi-part MIME message sent by reportbug.


    Package: dash
    Version: 0.5.12-12
    Severity: normal
    Tags: upstream

    Problem:

    set -- 1
    shift 2
    ... causes program to exit

    The exit is a bit unexpected as the whole
    program terminates. Suggested change:

    1. shift all positional parameters
    2. set status code $?
    3. continue execution

    This would also be allowed by POSIX:
    Bash and Zsh behaves like this.

    This would make it possible to write code:

    set -- 1
    if shift 2 ; then
    ... do something, a warning message to user ...
    fi
    ... continue

    Caveat: I'm aware of this, but perhaps
    the default behaviour with N could be
    chnaged to be more script friendly.

    shift $#

    See also attached test script.

    CONSEQUENCES OF ERRORS

    Program execution is interrupted and
    program cannot do any error handling of
    their own.

    Ref: POSIX 2018 (shift):

    https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_25_01

    EXIT STATUS

    If the n operand is invalid or is greater than "$#", this may be
    considered a syntax error and a non-interactive shell may exit; if
    the shell does not exit in this case, a non-zero exit status shall
    be returned. Otherwise, zero shall be returned.

    -- System Information:
    Debian Release: trixie/sid
    APT prefers testing
    APT policy: (500, 'testing')
    Architecture: amd64 (x86_64)

    Kernel: Linux 6.1.0-6-amd64 (SMP w/4 CPU threads; PREEMPT)
    Locale: LANG=C.UTF-8, LC_CTYPE=C.UTF-8 (charmap=UTF-8), LANGUAGE not set
    Shell: /bin/sh linked to /usr/bin/dash
    Init: systemd (via /run/systemd/system)
    LSM: AppArmor: enabled

    Versions of packages dash depends on:
    ii debianutils 5.21
    ii libc6 2.40-6

    dash recommends no packages.

    dash suggests no packages.

    -- debconf information:
    dash/ineffectivediversion:
    * dash/sh: true

    #! /bin/sh
    # Short: POSIX shift N and $?
    # Desc: Test POSIX Special Built-in support: shift N, when not enough args
    # Url: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_26_01
    #
    # Notes:
    #
    # POSIX: "(...) If the n operand is invalid
    # or is greater than `$#`, this may be
    # considered a syntax error and a non-interactive
    # shell may exit"
    #
    # Issues with `shift N` if there was not
    # enough args to shift.
    #
    # Behaviour is not uniform accross shells.
    # run this file under debug to see behavior.
    #
    # $sh -x <file>
    #
    # posh : error and exit with code 1
    # dash : error and exit with code 2
    # mksh : error and exit with code 1
    # ksh93 : error and exit with code 1
    # busybox ash: no error message and $? is set to 1
    # bash : no error message and $? is set to 1
    # zsh : error messahe and $? is set to 1

    test ()
    (
    # Run test in subshell compound-list
    # to prevent premature exit call
    set -- 1
    shift 2
    echo "x$?"
    )

    file=t.ret

    # ignore file redirection
    # shellcheck disable=SC2065

    if test > "$file"; then
    # Normal program execution
    code=$(cat "$file")
    code=${code#x}
    rm -f "$file"
    [ ! "$code" = 0 ]
    else
    code=$?
    rm -f "$file"
    echo "FATAL: shift called exit $code"
    exit "$code"
    fi

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)