Bash 在shell脚本中嵌入Perl时,如何查看父脚本中实际行号报告的语法错误?
毫无理由,我在一个Bash函数中嵌入了一个相当丰富的Perl脚本,该函数在Bash 在shell脚本中嵌入Perl时,如何查看父脚本中实际行号报告的语法错误?,bash,perl,syntax-error,runtime-error,embedded-script,Bash,Perl,Syntax Error,Runtime Error,Embedded Script,毫无理由,我在一个Bash函数中嵌入了一个相当丰富的Perl脚本,该函数在.env文件中被调用 它看起来像这样: perl='1〕 $inverse=“\e[7m”; $invoff=“\e[2700万”; $bold=“\e[1m”; ⋮ ' perl-e“$perl”“$inputfile” 我知道独立的Perl脚本和PATH变量是一件事,我也知道这是一件事,但这不是问题所在 我的问题是,如果嵌入式Perl代码中存在语法错误,如何让Perl报告父shell脚本中的实际行号 例如,假设per
.env
文件中被调用
它看起来像这样:
perl='1〕
$inverse=“\e[7m”;
$invoff=“\e[2700万”;
$bold=“\e[1m”;
⋮
'
perl-e“$perl”“$inputfile”
我知道独立的Perl脚本和PATH
变量是一件事,我也知道这是一件事,但这不是问题所在
我的问题是,如果嵌入式Perl代码中存在语法错误,如何让Perl报告父shell脚本中的实际行号
例如,假设perl=
赋值发生在该文件的第120行,但实际perl代码的第65行出现语法错误
在-e第65行“s/(#.*)$/$comment\1$endcomment/”附近出现语法错误
由于编译错误,-e的执行已中止。
…但我希望看到以下内容(父脚本中的实际行号):
在-e行185,靠近“s/(#.*)$/$comment\1$endcomment/”处出现语法错误
我尝试过的事情(没有成功):
- 分配给
\uuuuuuuuuuuuuuuuuuuuuuuu
- 我甚至不知道为什么我认为这会起作用,它不是一个变量,它是一个常数,你会得到一个错误,说明相同的情况
- 分配给
($。
和$INPUT\u LINE\u NUMBER
)使用英语
- 我很确定这不会起作用,因为这就像Awk中的
,而这显然不是它的目的NR
- 我很确定这不会起作用,因为这就像Awk中的
perlrun
手册页中有一个有用的小贴士,它“告诉Perl程序嵌入了一大块不相关的文本中,例如邮件消息中。”
程序对行号的所有引用(警告、错误等)将把#!
行视为第一行。因此,程序第二行(即文件中第100行)上的警告将报告为第2行,而不是第100行。这可以通过使用#line
指令来覆盖。(in)
根据粗体语句,添加#line NNN
(其中NNN
是该指令出现的父脚本的实际行号)可达到预期效果:
perl='#第120行
$inverse=“\e[7m”;
$invoff=“\e[2700万”;
$bold=“\e[1m”;
⋮
'
⋮
如中所述,您可以使用以下指令设置后续行的行号和(可选)文件名:
#第42行“file.pl”
这意味着你可以使用
!/bin/sh
perl=“#第4行\”$0\”
警告(“测试”);
'
perl-e“$perl”
输出:
$/a.sh
在/a.sh第4行进行测试。
使用sh
时,没有干净的方法可以避免硬编码行号,但这是可能的
#!/bin/sh
script_start=$( perl -ne'if (/^perl=/) { print $.+1; last }' -- "$0" )
perl="#line $script_start \"$0\""'
warn("test");
'
perl -e "$perl"
另一方面,bash
提供当前行号
!/bin/bash
脚本_start=$((行号+2))
perl=“#行$script_start\”$0\”
警告(“测试”);
'
perl-e“$perl”
这将输出-e
作为文件名。您可以将第二个参数传递给提供文件名的#line
。将其放在双引号中。@ikegami这是一个非常笨拙的脚本,我对-e
非常满意,但这是一个很棒的技巧!