【发布时间】:2011-10-16 03:52:49
【问题描述】:
考虑这个(示例)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 机器上运行它,这是它的预期目的地,我最终会陷入 EXIT 陷阱:
ERROR (test.increment.sh):
An unhandled error occurred.
...这是为什么呢?
如果我删除 -e 选项,它在两个系统上都按预期工作,但显然我想继续使用 -e。
稍微麻烦一点的“通用”变体var_counter=$(($var_counter+1)),在两个shell上都设置了-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.
我很好奇为什么会这样。有人知道这种行为的原因吗?
另外,有人知道我可以使用的一种类似的方式来增加 bash 中的变量吗?
【问题讨论】:
-
您在
set -vx时看到什么有用的信息吗?祝你好运。
标签: bash version exit increment