首页 > 解决方案 > 在 if 语句中使用子 shell 的 bash 脚本中 $LINENO 的奇怪行为

问题描述

在 if 语句中使用子 shell 环境会破坏我的 $LINENO 变量。这是一个最小的可重现代码:

1. #!/bin/bash
2. if true ; then
3.     (echo dummy)
4. fi
5. echo "Line no:" $LINENO

它显示“第 4 行”而不是 5。这是正常行为吗?我在网上找不到任何解释。仅当条件为真(意味着执行子shell)时才会出现问题。如果 subshel​​l 在 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。

标签: bash

解决方案


推荐阅读