【问题标题】:Getting the line number of a shell script error获取 shell 脚本错误的行号
【发布时间】:2016-11-09 03:43:15
【问题描述】:

当我运行脚本时出现此错误

awk: fatal: cannot open file `text.txt' for reading (No such file or directory)

问题是脚本大约有 450 行,很难准确找到它在说什么

如果我能得到一个像这样的行号就好了

awk: fatal: cannot open file `text.txt' for reading (No such file or directory) at line ***

或者如果我设置 -x 则只是

awk: fatal: cannot open file `text.txt' for reading (No such file or directory)
Terminated at line ***

【问题讨论】:

  • 这基本上就是这样做的。 PS4='文件=$BASH_SOURCE: LineNo=$LINENO:' bash -x 脚本 2>&1 | grep -B1 'awk: 致命:'

标签: bash shell unix scripting


【解决方案1】:

将行号添加到bash -x 输出:

PS4='$LINENO:' bash -x  script

对于脚本相互调用的复杂情况,不仅知道行号而且知道文件名会很方便:

PS4='$BASH_SOURCE:$LINENO:' bash -x  script

PS4 可以进一步定制。例如:

PS4='File=$BASH_SOURCE: LineNo=$LINENO: ' bash -x  script

过滤输出

如果我们知道要查找的错误消息,我们可以过滤输出以仅获取该消息及其对应的文件名和行号:

$ PS4='File=$BASH_SOURCE: LineNo=$LINENO: ' bash -x  script 2>&1 | grep -B1 'awk: fatal:'
File=script: LineNo=3: awk 1 text.txt
awk: fatal: cannot open file `text.txt' for reading (No such file or directory)

【讨论】:

  • 似乎那时脚本只会运行到文件末尾,所以行号就在那里,但我看不出这与只输入 :set number in 有什么不同vim。我只想要错误的行号,而不是正在发生的每个命令
  • @C.Monster 如果 bash 支持这种行为,那将是一件好事。在我看来,提供带有错误消息的行号是默认情况下应该做的事情。但是,事实并非如此。除了答案之外,我还提供了部分解决方法。
猜你喜欢
  • 2013-08-04
  • 2010-10-25
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
相关资源
最近更新 更多