Увеличение переменной запускает EXIT в bash 4, но не в bash 3

Рассмотрим этот (примерный) bash-скрипт:

#!/bin/bash -e
errorExit() {
    echo "" >&2
    echo "ERROR (${var_scriptfilename}):" >&2
    echo "An unhandled error occurred." >&2
    intentionalExit 1
}
intentionalExit () {
    trap - EXIT # Unregister the EXIT trap
    exit $1
}
trap errorExit EXIT # Trap script errors
var_scriptfilename="$(basename "$0")"
# ==== START OF TEST ====
var_counter=0
((var_counter++))
echo "var_counter is $var_counter" >&2
# ===== END OF TEST =====
intentionalExit 0

Если я запустил его в Cygwin bash, он выдаст желаемый результат:

var_counter is 1

Однако, если я запустил его в моем Debian Squeeze box, это его предполагаемый пункт назначения, я попадаю в ловушку EXIT:

ERROR (test.increment.sh):
An unhandled error occurred.

... Почему?

Если я удалю параметр -e, он будет работать должным образом в обеих системах, но я хочу, чтобы -e использовалась, очевидно .

Чуть более громоздкий «универсальный» вариант, var_counter = $ (($ var_counter + 1)) , работает с параметром -e, установленным в обеих оболочках, но я бы предпочел использовать первое обозначение. (или что-то подобное), поскольку при чтении кода она явно выделяется как операция приращения.

bash --version в Cygwin bash говорит:

GNU bash, version 3.2.51(24)-release (i686-pc-cygwin)
Copyright (C) 2007 Free Software Foundation, Inc.

В Debian это:

GNU bash, Version 4.1.5(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.

I Меня заинтриговало, почему это так. Кто-нибудь знает причину такого поведения?

Кроме того, знает ли кто-нибудь похожий способ увеличения переменной в bash, который я мог бы использовать?

9
задан eomanis 29 July 2011 в 17:52
поделиться