提问人:William Pursell 提问时间:6/16/2011 更新时间:4/1/2013 访问量:1527
Bash bug re $LINENO - 还是我只是感到困惑?
Bash bug re $LINENO-- or am I just confused?
问:
考虑:
#!/bin/bash echo ' ' $LINENO echo '' ' ' $LINENO
第一个回波正确打印 4,但第二个回波打印 5 而不是 6。是我遗漏了什么,还是这是一个错误?(使用 bash 3.00.15)
答:
6赞
Anya Shenanigans
6/16/2011
#1
它看起来像是 bash 中的实现错误(错误)。
我用了:
#!/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
它获取较新的行号。这似乎与作为行上唯一参数携带的空字符串的计算有关。
评论
0赞
pawamoy
5/11/2019
ZSH 似乎确实有这个错误功能。它产生了完全相同的输出。
0赞
pawamoy
5/11/2019
然而,在进程替换方面,zsh 似乎仍然比 Bash 更好地处理行号。查看此要点
3赞
chaz
4/1/2013
#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
评论