Bash bug re $LINENO— or am I just confused?

旧街凉风 提交于 2019-12-05 23:36:08

问题


Consider:

#!/bin/bash

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

The first echo correctly prints a 4, but the second echo prints a 5 instead of 6. Am I missing something, or is this a bug? (Using bash 3.00.15)


回答1:


It looks like an implementation misfeature (bug) in bash.

I used:

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

which yielded:

2
  3 
 3 
 3

 6

Which supports the theory that the variable is evaluated before the shell considers the line to have been completed. Once the line has been completed, it updates the LINENO and proceeds.

Bash versions tested: 3.2.48 (mac), 4.1.5 (linux)

When I use the syntax:

echo '
' $LINENO

it gets the newer line number. It seems to be related to the evaluation of the empty string carried as the only argument on the line.




回答2:


Bash seems to interpret a multi-string & multi-line argument to the echo command to be on just one line of the source code file (script) because Bash has to concatenate the multi-string & multi-line argument to the echo command into a single (one line) argument. The concatenation mechanism is also triggered by an empty string '' followed by a string containing a newline character 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


来源:https://stackoverflow.com/questions/6360929/bash-bug-re-lineno-or-am-i-just-confused

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!