bash - 在 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)时才会出现问题。如果 subshell 在 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。
解决方案
推荐阅读
- c# - Xamarin.Forms Syncfusion PDF DataTable 不显示西里尔字符
- google-chrome - 有没有办法搜索仍然使用 HTTP 的网站?
- android - 如何限制 Android 活动的大小?
- gradle - 如何将多个删除fileTree gradle任务组合成一个
- visual-studio - 无法将 Xamarin.ios 解决方案上传到 TestFlight 导致以下错误:
- acumatica - 发票和备忘录屏幕中的“项目不能为空”
- arrays - 双链表 - 数组实现
- reactjs - 星球大战 api,我如何从 api 获取值?
- php - Laravel 队列作业发送请求
- python - 使用 Python 使用角度和中心点在图像上绘制一条线