在if语句中使用子外壳环境会破坏$ LINENO变量。这是最小的可复制代码:
1. #!/bin/bash
2. if true ; then
3. (echo dummy)
4. fi
5. echo "Line no:" $LINENO
显示“行号:4”而不是5。 这是正常现象吗?我在网上找不到任何解释。 仅当条件为真(意味着执行了子外壳程序)时,才会出现此问题。如果子外壳程序在while / for循环中至少迭代一次,则会发生相同的问题。
令人惊讶的是,下面的三段代码按预期工作:
a)否if-then-fi
1. #!/bin/bash
2. (echo dummy)
3. echo "Line no:" $LINENO
按预期显示3。
b)没有子外壳
1. #!/bin/bash
2. if true ; then
3. echo dummy
4. fi
5. echo "Line no:" $LINENO
按预期显示5。
c)嵌套子外壳
1. #!/bin/bash
2. (if true ; then
3. (echo dummy)
4. fi)
5. echo "Line no:" $LINENO
按预期显示5。