set -e是阴影信号函数

时间:2018-03-17 18:06:56

标签: bash

我在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[@]}

1 个答案:

答案 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