Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在shell脚本中嵌入Perl时,如何查看父脚本中实际行号报告的语法错误?_Bash_Perl_Syntax Error_Runtime Error_Embedded Script - Fatal编程技术网

Bash 在shell脚本中嵌入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

毫无理由,我在一个Bash函数中嵌入了一个相当丰富的Perl脚本,该函数在
.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
      ,而这显然不是它的目的

在的
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
非常满意,但这是一个很棒的技巧!