我在MacOS上运行bash 4.4.19。如果设置了“set -e”,我发现信号功能不起作用。这是预期的行为吗?这是我的示例代码:
#!/usr/local/bin/bash
set -e
declare -A Array1
Array1=([index1]="abc" [index2]="def" [index3]="dfkdjkfjdkdjfdk")
trap ReactSignal USR1
fun() {
PPid=$1
NUM=0
Array1[index4]="insidefunction"
while [ $NUM -le 5 ]
do
((NUM++))
echo "inside number is $NUM"
sleep 1
done
kill -USR1 $PPid
}
ReactSignal() {
IFS= read -r -d '' -u 3 checkOutput
echo "function output is ${checkOutput}"
}
Ppid="$$"
echo "start...."
coproc funfd { fun $Ppid; }
exec 3>&${funfd[0]}
echo "end...."
sleep 7
echo array value is ${Array1[@]}
答案 0 :(得分:0)
这是因为((expression))
实际上有{em>返回代码,符合bash
文档:
((expression))
根据
ARITHMETIC EVALUATION
下面描述的规则评估表达式。如果表达式的值不为零,则返回状态为0;否则返回状态为1。
因此,当然,如果NUM
为零进入表达式,则返回码为1,set -e
将选择此值作为需要终止的错误。
有许多方法可以解决这个问题,从使用(在我看来相当丑陋):
set +e ; ((NUM++)); set -e
根本不使用((expression))
:
for i in {0..4} ; do
doSomethingWith $i
done