我一直在寻找一种在shell脚本出错时打印行号的方法。
我发现了'-x'选项,它可以在运行shell脚本时打印出所在的行,但这并不完全是我想要的。也许我可以在每个退出代码之前使用$LINENO? 有没有更简洁的方法呢?
我只想要行号,这样我就可以打开shell脚本,直接跳转到解释器意识到错误的位置。
使用
PS4=':$LINENO+'
将行号添加到set -x
的输出中。
如果您仅仅想在出错时打印行号,那么最近版本的解释器存在一些风险。然而,您可以尝试以下方法(首次提供于此前的回答):
error() {
local parent_lineno="$1"
local message="$2"
local code="${3:-1}"
if [[ -n "$message" ]] ; then
echo "Error on or near line ${parent_lineno}: ${message}; exiting with status ${code}"
else
echo "Error on or near line ${parent_lineno}; exiting with status ${code}"
fi
exit "${code}"
}
trap 'error ${LINENO}' ERR
需要注意的是,在某些最近版本的 bash 中,陷阱函数内LINENO
的设置可能不正确,因此本方法可能会出现问题。
另一种方法(只适用于最近版本的 shell;以下示例使用了一些 bash 4.0 和 4.1 的特性)是使用 PS4
发送每个命令的退出状态和行号到专用文件描述符,并使用 tail
只打印该文件描述符在 shell 退出之前接收到的最后一行:
exec {BASH_XTRACEFD}> >(tail -n 1) # send set -x output to tail -n 1
PS4=':At line $LINENO; prior command exit status $?+'
set -x
$BASH_VERSION
并根据结果使用不同的代码。 - Charles Duffy