Bash bug重新$ LINENO--或者我只是困惑?

时间:2011-06-15 16:19:45

标签: bash shell sh

考虑:

#!/bin/bash

echo '
' $LINENO
echo '' '
'  $LINENO

第一个回声正确打印4,但第二个回显打印5而不是6.我错过了什么,或者这是一个错误? (使用bash 3.00.15)

2 个答案:

答案 0 :(得分:5)

它看起来像bash中的实现错误(bug)。

我用过:

#!/bin/bash -p
echo $LINENO
echo ' ' $LINENO '
' $LINENO '
' $LINENO
echo '' '
'  $LINENO

产生了:

2
  3 
 3 
 3

 6

它支持在shell认为线已经完成之前评估变量的理论。一旦完成该行,它就会更新LINENO并继续。

测试的Bash版本:3.2.48(mac),4.1.5(linux)

当我使用语法时:

echo '
' $LINENO

它获得较新的行号。它似乎与作为该行唯一参数的空字符串的评估有关。

答案 1 :(得分:2)

Bash似乎解释了一个多字符串& echo命令的多行参数仅位于源代码文件(脚本)的一行,因为Bash必须连接多字符串&将echo命令的多行参数转换为单个(一行)参数。连接机制也由空字符串''触发,后跟包含换行符echo -e '' + '\n' + $LINENO的字符串。

#!/bin/bash
# Bash concatenates a multi-string & multi-line argument ...
echo ' ' $LINENO '
' $LINENO '
' $LINENO

# ... into a one line argument.
echo -e "' ' $LINENO '\n' $LINENO '\n' $LINENO\n"

#!/bin/bash
echo "2
3
4
5
6 LINENO: $LINENO"   # 6 LINENO: 6
exit

#!/bin/bash
echo "2" " " "
3
4
5
6 LINENO: $LINENO"   # 6 LINENO: 2
# echo -e "2" + " " + "\n3\n4\n5\n6 LINENO: $LINENO"
exit